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({