diff --git a/packages/cubejs-api-gateway/openspec.yml b/packages/cubejs-api-gateway/openspec.yml index 5e18c1c6ebddb..f8952567f8bd5 100644 --- a/packages/cubejs-api-gateway/openspec.yml +++ b/packages/cubejs-api-gateway/openspec.yml @@ -96,6 +96,9 @@ components: type: "string" description: type: "string" + cubeDescription: + type: "string" + description: "Description of the parent cube/view this segment belongs to" shortTitle: type: "string" meta: @@ -132,6 +135,9 @@ components: type: "string" description: type: "string" + cubeDescription: + type: "string" + description: "Description of the parent cube/view this dimension belongs to" type: type: "string" aliasMember: @@ -172,6 +178,9 @@ components: type: "string" description: type: "string" + cubeDescription: + type: "string" + description: "Description of the parent cube/view this measure belongs to" type: type: "string" aggType: diff --git a/packages/cubejs-api-gateway/src/helpers/prepare-annotation.ts b/packages/cubejs-api-gateway/src/helpers/prepare-annotation.ts index 2f53164369ff1..3c402ca476ea6 100644 --- a/packages/cubejs-api-gateway/src/helpers/prepare-annotation.ts +++ b/packages/cubejs-api-gateway/src/helpers/prepare-annotation.ts @@ -27,6 +27,7 @@ type ConfigItem = { title: string; shortTitle: string; description: string; + cubeDescription?: string; type: string; format: string; /** ISO 4217 currency code in uppercase (e.g. USD, EUR) */ @@ -61,6 +62,7 @@ const annotation = ( title: config.title, shortTitle: config.shortTitle, description: config.description, + cubeDescription: config.cubeDescription, type: config.type, format: config.format, currency: config.currency, diff --git a/packages/cubejs-api-gateway/test/index.test.ts b/packages/cubejs-api-gateway/test/index.test.ts index 245daf2ae1830..a594d65a53dba 100644 --- a/packages/cubejs-api-gateway/test/index.test.ts +++ b/packages/cubejs-api-gateway/test/index.test.ts @@ -682,8 +682,11 @@ describe('API Gateway', () => { expect(res.body.cubes[0]?.description).toBe('cube from compilerApi mock'); expect(res.body.cubes[0]?.hasOwnProperty('sql')).toBe(false); expect(res.body.cubes[0]?.dimensions.find(dimension => dimension.name === 'Foo.id').description).toBe('id dimension from compilerApi mock'); + expect(res.body.cubes[0]?.dimensions.find(dimension => dimension.name === 'Foo.id').cubeDescription).toBe('cube from compilerApi mock'); expect(res.body.cubes[0]?.measures.find(measure => measure.name === 'Foo.bar').description).toBe('measure from compilerApi mock'); + expect(res.body.cubes[0]?.measures.find(measure => measure.name === 'Foo.bar').cubeDescription).toBe('cube from compilerApi mock'); expect(res.body.cubes[0]?.segments.find(segment => segment.name === 'Foo.quux').description).toBe('segment from compilerApi mock'); + expect(res.body.cubes[0]?.segments.find(segment => segment.name === 'Foo.quux').cubeDescription).toBe('cube from compilerApi mock'); }); test('meta endpoint extended to get schema information with additional data', async () => { @@ -699,8 +702,11 @@ describe('API Gateway', () => { expect(res.body.cubes[0]?.description).toBe('cube from compilerApi mock'); expect(res.body.cubes[0]?.hasOwnProperty('sql')).toBe(true); expect(res.body.cubes[0]?.dimensions.find(dimension => dimension.name === 'Foo.id').description).toBe('id dimension from compilerApi mock'); + expect(res.body.cubes[0]?.dimensions.find(dimension => dimension.name === 'Foo.id').cubeDescription).toBe('cube from compilerApi mock'); expect(res.body.cubes[0]?.measures.find(measure => measure.name === 'Foo.bar').description).toBe('measure from compilerApi mock'); + expect(res.body.cubes[0]?.measures.find(measure => measure.name === 'Foo.bar').cubeDescription).toBe('cube from compilerApi mock'); expect(res.body.cubes[0]?.segments.find(segment => segment.name === 'Foo.quux').description).toBe('segment from compilerApi mock'); + expect(res.body.cubes[0]?.segments.find(segment => segment.name === 'Foo.quux').cubeDescription).toBe('cube from compilerApi mock'); }); describe('multi query support', () => { diff --git a/packages/cubejs-api-gateway/test/mocks.ts b/packages/cubejs-api-gateway/test/mocks.ts index f2341b544c323..3b314729e0675 100644 --- a/packages/cubejs-api-gateway/test/mocks.ts +++ b/packages/cubejs-api-gateway/test/mocks.ts @@ -90,6 +90,7 @@ export const compilerApi = jest.fn().mockImplementation(async () => ({ { name: 'Foo.bar', description: 'measure from compilerApi mock', + cubeDescription: 'cube from compilerApi mock', isVisible: true, }, ], @@ -97,14 +98,17 @@ export const compilerApi = jest.fn().mockImplementation(async () => ({ { name: 'Foo.id', description: 'id dimension from compilerApi mock', + cubeDescription: 'cube from compilerApi mock', isVisible: true, }, { name: 'Foo.time', + cubeDescription: 'cube from compilerApi mock', isVisible: true, }, { name: 'Foo.timeGranularities', + cubeDescription: 'cube from compilerApi mock', isVisible: true, granularities: [ { @@ -120,6 +124,7 @@ export const compilerApi = jest.fn().mockImplementation(async () => ({ { name: 'Foo.quux', description: 'segment from compilerApi mock', + cubeDescription: 'cube from compilerApi mock', isVisible: true, }, ], @@ -138,6 +143,7 @@ export const compilerApi = jest.fn().mockImplementation(async () => ({ { name: 'Foo.bar', description: 'measure from compilerApi mock', + cubeDescription: 'cube from compilerApi mock', sql: 'bar', isVisible: true, }, @@ -146,10 +152,12 @@ export const compilerApi = jest.fn().mockImplementation(async () => ({ { name: 'Foo.id', description: 'id dimension from compilerApi mock', + cubeDescription: 'cube from compilerApi mock', isVisible: true, }, { name: 'Foo.time', + cubeDescription: 'cube from compilerApi mock', isVisible: true, }, ], @@ -157,6 +165,7 @@ export const compilerApi = jest.fn().mockImplementation(async () => ({ { name: 'Foo.quux', description: 'segment from compilerApi mock', + cubeDescription: 'cube from compilerApi mock', isVisible: true, }, ], diff --git a/packages/cubejs-backend-shared/src/env.ts b/packages/cubejs-backend-shared/src/env.ts index cb9072b5af01b..a7fe12dae1c2c 100644 --- a/packages/cubejs-backend-shared/src/env.ts +++ b/packages/cubejs-backend-shared/src/env.ts @@ -298,6 +298,9 @@ const variables: Record any> = { nestedFoldersDelimiter: () => get('CUBEJS_NESTED_FOLDERS_DELIMITER') .default('') .asString(), + maxEmbeddingDescriptionLength: () => get('CUBEJS_MAX_EMBEDDING_DESCRIPTION_LENGTH') + .default('0') + .asInt(), defaultTimezone: () => get('CUBEJS_DEFAULT_TIMEZONE') .default('UTC') .asString(), diff --git a/packages/cubejs-client-core/src/types.ts b/packages/cubejs-client-core/src/types.ts index f4e8c61f9c526..18579a0b6bf6b 100644 --- a/packages/cubejs-client-core/src/types.ts +++ b/packages/cubejs-client-core/src/types.ts @@ -377,6 +377,7 @@ export type BaseCubeMember = { title: string; shortTitle: string; description?: string; + cubeDescription?: string; /** * @deprecated use `public` instead */ diff --git a/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.ts b/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.ts index f430c2a377de4..1cf12e2f8c294 100644 --- a/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.ts +++ b/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.ts @@ -69,6 +69,7 @@ export type MeasureConfig = { name: string; title: string; description?: string; + cubeDescription?: string; shortTitle: string; format?: MeasureFormat; currency?: string; @@ -92,6 +93,7 @@ export type DimensionConfig = { title: string; type: string; description?: string; + cubeDescription?: string; shortTitle: string; suggestFilterValues: boolean; format?: DimensionFormat; @@ -111,6 +113,7 @@ export type SegmentConfig = { title: string; shortTitle: string; description?: string; + cubeDescription?: string; meta?: any; isVisible: boolean; public: boolean; @@ -184,6 +187,17 @@ export class CubeToMetaTransformer implements CompilerInterface { this.queries = this.cubes; } + private static truncateDescription(description: string | undefined): string | undefined { + if (!description) { + return description; + } + const maxLen = getEnv('maxEmbeddingDescriptionLength'); + if (maxLen > 0 && description.length > maxLen) { + return description.slice(0, maxLen); + } + return description; + } + protected transform(cube: CubeDefinitionExtended, _errorReporter?: ErrorReporter): TransformedCube { const extendedCube = cube as ExtendedCubeDefinition; const cubeName = extendedCube.name; @@ -229,6 +243,9 @@ export class CubeToMetaTransformer implements CompilerInterface { const nestedFolders: NestedFolder[] = (extendedCube.folders || []).map((f: Folder) => processFolder(f)); + const truncDesc = CubeToMetaTransformer.truncateDescription; + const cubeDesc = truncDesc(extendedCube.description); + return { config: { name: cubeName, @@ -236,7 +253,7 @@ export class CubeToMetaTransformer implements CompilerInterface { title: cubeTitle, isVisible: isCubeVisible, public: isCubeVisible, - description: extendedCube.description, + description: cubeDesc, connectedComponent: this.joinGraph.connectedComponents()[cubeName], meta: extendedCube.meta, measures: Object.entries(extendedCube.measures || {}).map((nameToMetric: [string, any]) => { @@ -244,6 +261,7 @@ export class CubeToMetaTransformer implements CompilerInterface { const measureVisibility = isCubeVisible ? this.isVisible(metricDef, true) : false; return { ...this.measureConfig(cubeName, cubeTitle, nameToMetric), + cubeDescription: cubeDesc, isVisible: measureVisibility, public: measureVisibility, }; @@ -260,7 +278,8 @@ export class CubeToMetaTransformer implements CompilerInterface { name: `${cubeName}.${dimensionName}`, title: this.title(cubeTitle, nameToDimension, false), type: this.dimensionDataType(extendedDimDef.type || 'string'), - description: extendedDimDef.description, + description: truncDesc(extendedDimDef.description), + cubeDescription: cubeDesc, shortTitle: this.title(cubeTitle, nameToDimension, true), suggestFilterValues: extendedDimDef.suggestFilterValues == null @@ -295,7 +314,8 @@ export class CubeToMetaTransformer implements CompilerInterface { name: `${cubeName}.${segmentName}`, title: this.title(cubeTitle, nameToSegment, false), shortTitle: this.title(cubeTitle, nameToSegment, true), - description: extendedSegmentDef.description, + description: truncDesc(extendedSegmentDef.description), + cubeDescription: cubeDesc, meta: extendedSegmentDef.meta, isVisible: segmentVisibility, public: segmentVisibility, @@ -383,7 +403,7 @@ export class CubeToMetaTransformer implements CompilerInterface { return { name, title: this.title(cubeTitle, nameToMetric, false), - description: extendedMetricDef.description, + description: CubeToMetaTransformer.truncateDescription(extendedMetricDef.description), shortTitle: this.title(cubeTitle, nameToMetric, true), format: this.transformMeasureFormat(extendedMetricDef.format), currency: extendedMetricDef.currency?.toUpperCase(), diff --git a/packages/cubejs-schema-compiler/test/unit/__snapshots__/views.test.ts.snap b/packages/cubejs-schema-compiler/test/unit/__snapshots__/views.test.ts.snap index a99f202568c8a..587a2bd162875 100644 --- a/packages/cubejs-schema-compiler/test/unit/__snapshots__/views.test.ts.snap +++ b/packages/cubejs-schema-compiler/test/unit/__snapshots__/views.test.ts.snap @@ -7,6 +7,7 @@ Object { "dimensions": Array [ Object { "aliasMember": "CubeA.id", + "cubeDescription": undefined, "currency": undefined, "description": "Description for CubeA.id", "format": "imageUrl", @@ -27,6 +28,7 @@ Object { }, Object { "aliasMember": "CubeB.other_id", + "cubeDescription": undefined, "currency": undefined, "description": "Description for CubeB.other_id", "format": "imageUrl", @@ -53,6 +55,7 @@ Object { Object { "aggType": "number", "aliasMember": "CubeA.count_a", + "cubeDescription": undefined, "cumulative": false, "cumulativeTotal": false, "currency": undefined, @@ -76,6 +79,7 @@ Object { Object { "aggType": "number", "aliasMember": "CubeB.count_b", + "cubeDescription": undefined, "cumulative": false, "cumulativeTotal": false, "currency": undefined, @@ -114,6 +118,7 @@ Object { "dimensions": Array [ Object { "aliasMember": "CubeB.other_id", + "cubeDescription": undefined, "currency": undefined, "description": "Description for CubeB.other_id", "format": "imageUrl", @@ -140,6 +145,7 @@ Object { Object { "aggType": "number", "aliasMember": "CubeA.count_a", + "cubeDescription": undefined, "cumulative": false, "cumulativeTotal": false, "currency": undefined, @@ -163,6 +169,7 @@ Object { Object { "aggType": "number", "aliasMember": "CubeB.count_b", + "cubeDescription": undefined, "cumulative": false, "cumulativeTotal": false, "currency": undefined, @@ -201,6 +208,7 @@ Object { "dimensions": Array [ Object { "aliasMember": "CubeA.id", + "cubeDescription": undefined, "currency": undefined, "description": "Description for CubeA.id", "format": "imageUrl", @@ -221,6 +229,7 @@ Object { }, Object { "aliasMember": "CubeB.id", + "cubeDescription": undefined, "currency": undefined, "description": "Description for CubeB.id", "format": "imageUrl", @@ -241,6 +250,7 @@ Object { }, Object { "aliasMember": "CubeB.other_id", + "cubeDescription": undefined, "currency": undefined, "description": "Description for CubeB.other_id", "format": "imageUrl", @@ -267,6 +277,7 @@ Object { Object { "aggType": "number", "aliasMember": "CubeA.count_a", + "cubeDescription": undefined, "cumulative": false, "cumulativeTotal": false, "currency": undefined, @@ -290,6 +301,7 @@ Object { Object { "aggType": "number", "aliasMember": "CubeB.count_b", + "cubeDescription": undefined, "cumulative": false, "cumulativeTotal": false, "currency": undefined, @@ -328,6 +340,7 @@ Object { "dimensions": Array [ Object { "aliasMember": "CubeB.other_id", + "cubeDescription": undefined, "currency": undefined, "description": "Description for CubeB.other_id", "format": "imageUrl", @@ -354,6 +367,7 @@ Object { Object { "aggType": "number", "aliasMember": "CubeA.count_a", + "cubeDescription": undefined, "cumulative": false, "cumulativeTotal": false, "currency": undefined, @@ -377,6 +391,7 @@ Object { Object { "aggType": "number", "aliasMember": "CubeB.count_b", + "cubeDescription": undefined, "cumulative": false, "cumulativeTotal": false, "currency": undefined, diff --git a/rust/cubesql/cubeclient/src/models/v1_cube_meta_dimension.rs b/rust/cubesql/cubeclient/src/models/v1_cube_meta_dimension.rs index 8885c800b496a..ce6aa66f00707 100644 --- a/rust/cubesql/cubeclient/src/models/v1_cube_meta_dimension.rs +++ b/rust/cubesql/cubeclient/src/models/v1_cube_meta_dimension.rs @@ -21,6 +21,8 @@ pub struct V1CubeMetaDimension { pub short_title: Option, #[serde(rename = "description", skip_serializing_if = "Option::is_none")] pub description: Option, + #[serde(rename = "cubeDescription", skip_serializing_if = "Option::is_none")] + pub cube_description: Option, #[serde(rename = "type")] pub r#type: String, /// When dimension is defined in View, it keeps the original path: Cube.dimension @@ -48,6 +50,7 @@ impl V1CubeMetaDimension { title: None, short_title: None, description: None, + cube_description: None, r#type, alias_member: None, granularities: None, diff --git a/rust/cubesql/cubeclient/src/models/v1_cube_meta_measure.rs b/rust/cubesql/cubeclient/src/models/v1_cube_meta_measure.rs index ce77677fbc027..fbc777d8e095c 100644 --- a/rust/cubesql/cubeclient/src/models/v1_cube_meta_measure.rs +++ b/rust/cubesql/cubeclient/src/models/v1_cube_meta_measure.rs @@ -21,6 +21,8 @@ pub struct V1CubeMetaMeasure { pub short_title: Option, #[serde(rename = "description", skip_serializing_if = "Option::is_none")] pub description: Option, + #[serde(rename = "cubeDescription", skip_serializing_if = "Option::is_none")] + pub cube_description: Option, #[serde(rename = "type")] pub r#type: String, #[serde(rename = "aggType", skip_serializing_if = "Option::is_none")] @@ -43,6 +45,7 @@ impl V1CubeMetaMeasure { title: None, short_title: None, description: None, + cube_description: None, r#type, agg_type: None, meta: None, diff --git a/rust/cubesql/cubeclient/src/models/v1_cube_meta_segment.rs b/rust/cubesql/cubeclient/src/models/v1_cube_meta_segment.rs index b11046c2c0d53..f6e65282aa94a 100644 --- a/rust/cubesql/cubeclient/src/models/v1_cube_meta_segment.rs +++ b/rust/cubesql/cubeclient/src/models/v1_cube_meta_segment.rs @@ -19,6 +19,8 @@ pub struct V1CubeMetaSegment { pub title: String, #[serde(rename = "description", skip_serializing_if = "Option::is_none")] pub description: Option, + #[serde(rename = "cubeDescription", skip_serializing_if = "Option::is_none")] + pub cube_description: Option, #[serde(rename = "shortTitle")] pub short_title: String, #[serde(rename = "meta", skip_serializing_if = "Option::is_none")] @@ -31,6 +33,7 @@ impl V1CubeMetaSegment { name, title, description: None, + cube_description: None, short_title, meta: None, } diff --git a/rust/cubesql/cubesql/benches/large_model.rs b/rust/cubesql/cubesql/benches/large_model.rs index d2265715483bf..f74a8f58e9e2e 100644 --- a/rust/cubesql/cubesql/benches/large_model.rs +++ b/rust/cubesql/cubesql/benches/large_model.rs @@ -69,6 +69,7 @@ pub fn get_large_model_test_meta(dims: usize) -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("count".to_string()), meta: None, @@ -81,6 +82,7 @@ pub fn get_large_model_test_meta(dims: usize) -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("sum".to_string()), meta: None, diff --git a/rust/cubesql/cubesql/src/compile/test/mod.rs b/rust/cubesql/cubesql/src/compile/test/mod.rs index d9ab3018643e7..053d27a30608b 100644 --- a/rust/cubesql/cubesql/src/compile/test/mod.rs +++ b/rust/cubesql/cubesql/src/compile/test/mod.rs @@ -104,6 +104,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: Some("Events count".to_string()), + cube_description: None, r#type: "number".to_string(), agg_type: Some("count".to_string()), meta: None, @@ -116,6 +117,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("max".to_string()), meta: None, @@ -128,6 +130,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("sum".to_string()), meta: None, @@ -140,6 +143,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("min".to_string()), meta: None, @@ -152,6 +156,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("avg".to_string()), meta: None, @@ -164,6 +169,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("countDistinct".to_string()), meta: None, @@ -177,6 +183,7 @@ pub fn get_test_meta() -> Vec { name: "KibanaSampleDataEcommerce.is_male".to_string(), title: "Ecommerce Male".to_string(), description: Some("Male users segment".to_string()), + cube_description: None, short_title: "Male".to_string(), meta: None, }, @@ -184,6 +191,7 @@ pub fn get_test_meta() -> Vec { name: "KibanaSampleDataEcommerce.is_female".to_string(), title: "Ecommerce Female".to_string(), description: None, + cube_description: None, short_title: "Female".to_string(), meta: None, }, @@ -225,6 +233,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("countDistinct".to_string()), meta: None, @@ -237,6 +246,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("countDistinctApprox".to_string()), meta: None, @@ -266,6 +276,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("number".to_string()), meta: None, @@ -300,6 +311,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: None, + cube_description: None, meta: None, alias_member: None, format: None, @@ -312,6 +324,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("count".to_string()), meta: None, @@ -324,6 +337,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("max".to_string()), meta: None, @@ -336,6 +350,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("min".to_string()), meta: None, @@ -348,6 +363,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("avg".to_string()), meta: None, @@ -360,6 +376,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("countDistinct".to_string()), meta: None, @@ -417,6 +434,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: Some(format!("Test number measure {i}")), + cube_description: None, meta: None, alias_member: None, format: None, @@ -429,6 +447,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: Some(format!("Test max(string) measure {i}")), + cube_description: None, meta: None, alias_member: None, format: None, @@ -441,6 +460,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: Some(format!("Test max(time) measure {i}")), + cube_description: None, meta: None, alias_member: None, format: None, @@ -455,6 +475,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: Some("Test count measure".to_string()), + cube_description: None, r#type: "number".to_string(), agg_type: Some("count".to_string()), meta: None, @@ -467,6 +488,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: Some("Test maxPrice measure".to_string()), + cube_description: None, r#type: "number".to_string(), agg_type: Some("max".to_string()), meta: None, @@ -479,6 +501,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: Some("Test minPrice measure".to_string()), + cube_description: None, r#type: "number".to_string(), agg_type: Some("min".to_string()), meta: None, @@ -491,6 +514,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: Some("Test avgPrice measure".to_string()), + cube_description: None, r#type: "number".to_string(), agg_type: Some("avg".to_string()), meta: None, @@ -503,6 +527,7 @@ pub fn get_test_meta() -> Vec { title: None, short_title: None, description: Some("Test countDistinct measure".to_string()), + cube_description: None, r#type: "number".to_string(), agg_type: Some("countDistinct".to_string()), meta: None, @@ -536,6 +561,7 @@ pub fn get_string_cube_meta() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "string".to_string(), agg_type: Some("string".to_string()), meta: None, @@ -565,6 +591,7 @@ pub fn get_sixteen_char_member_cube() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("sum".to_string()), meta: None, @@ -577,6 +604,7 @@ pub fn get_sixteen_char_member_cube() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("avg".to_string()), meta: None, @@ -589,6 +617,7 @@ pub fn get_sixteen_char_member_cube() -> Vec { title: None, short_title: None, description: None, + cube_description: None, r#type: "number".to_string(), agg_type: Some("count".to_string()), meta: None,