order: Joi.array().items(Joi.object().keys({ member: Joi.func().required(), direction: Joi.any().valid('asc', 'desc').required() })), filters: Joi.array().items(Joi.object().keys({ member: Joi.func().required(), operator: Joi.any().valid('contains', 'notContains', 'equals', 'set', 'notSet', 'gt', 'gte', 'lt', 'lte'), params: Joi.array().items(Joi.string().allow('').optional()) })), dimension: Joi.func().required(), dateRange: Joi.string().required(), granularity: Joi.any().valid('hour', 'day', 'week', 'month', 'year', null) }), visualization: Joi.object().keys({ type: Joi.any().valid('bar', 'line', 'table', 'area', 'singleValue', 'pie').required(), autoScale: Joi.boolean(), showTotal: Joi.boolean(), showY2Label: Joi.boolean(), showTrendline: Joi.boolean(), trendlineType: Joi.any().valid('linear', 'rolling'), trendlinePeriod: Joi.number(), showComparison: Joi.boolean(), showRowNumbers: Joi.boolean(), showBarChartSteps: Joi.boolean(), seriesPositioning: Joi.any().valid('stacked', 'grouped', 'proportional') }), pivot: Joi.object().keys({