diff --git a/docs/pages/reference/data-model/cube.mdx b/docs/pages/reference/data-model/cube.mdx index 577a1a80ff917..ff8e4cd81d5a7 100644 --- a/docs/pages/reference/data-model/cube.mdx +++ b/docs/pages/reference/data-model/cube.mdx @@ -158,6 +158,33 @@ cubes: +### meta + +Custom metadata. Can be used to pass any information to the frontend. + + + +```javascript +cube(`orders`, { + sql_table: `orders`, + title: `Product Orders`, + meta: { + any: `value`, + } +}); +``` + +```yaml +cubes: + - name: orders + sql_table: orders + title: Product Orders + meta: + any: value +``` + + + ### extends You can extend cubes in order to reuse all declared members of a cube. In the diff --git a/docs/pages/reference/data-model/view.mdx b/docs/pages/reference/data-model/view.mdx index 2caaf1a742683..06b15ba95f392 100644 --- a/docs/pages/reference/data-model/view.mdx +++ b/docs/pages/reference/data-model/view.mdx @@ -154,6 +154,29 @@ views: +### meta + +Custom metadata. Can be used to pass any information to the frontend. + + + +```javascript +view(`active_users`, { + meta: { + any: "value", + } +}); +``` + +```yaml +views: + - name: active_users + meta: + any: value +``` + + + ### `cubes` Use `cubes` parameter in view to include exposed cubes in bulk. You can build diff --git a/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js b/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js index 673222b42a870..eec66bcdd0cd5 100644 --- a/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js +++ b/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js @@ -51,6 +51,7 @@ export class CubeToMetaTransformer { public: isCubeVisible, description: cube.description, connectedComponent: this.joinGraph.connectedComponents()[cube.name], + meta: cube.meta, measures: R.compose( R.map((nameToMetric) => ({ ...this.measureConfig(cube.name, cubeTitle, nameToMetric), diff --git a/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts b/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts index 9c2d45b97ec91..49ea3c827acd3 100644 --- a/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts +++ b/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts @@ -492,6 +492,7 @@ const baseSchema = { rewriteQueries: Joi.boolean().strict(), shown: Joi.boolean().strict(), public: Joi.boolean().strict(), + meta: Joi.any(), joins: Joi.object().pattern(identifierRegex, Joi.object().keys({ sql: Joi.func().required(), relationship: Joi.any().valid( diff --git a/packages/cubejs-schema-compiler/src/compiler/YamlCompiler.ts b/packages/cubejs-schema-compiler/src/compiler/YamlCompiler.ts index 600356984781b..cd87a39eb4547 100644 --- a/packages/cubejs-schema-compiler/src/compiler/YamlCompiler.ts +++ b/packages/cubejs-schema-compiler/src/compiler/YamlCompiler.ts @@ -169,6 +169,10 @@ export class YamlCompiler { return this.extractProgramBodyIfNeeded(ast); } else if (typeof obj === 'boolean') { return t.booleanLiteral(obj); + } else if (typeof obj === 'number') { + return t.numericLiteral(obj); + } else if (obj === null && propertyPath.includes('meta')) { + return t.nullLiteral(); } if (typeof obj === 'object' && obj !== null) { diff --git a/packages/cubejs-schema-compiler/test/unit/yaml-schema.test.ts b/packages/cubejs-schema-compiler/test/unit/yaml-schema.test.ts index 92bc7de0e8789..aa01c170e6d9f 100644 --- a/packages/cubejs-schema-compiler/test/unit/yaml-schema.test.ts +++ b/packages/cubejs-schema-compiler/test/unit/yaml-schema.test.ts @@ -110,4 +110,36 @@ describe('Yaml Schema Testing', () => { expect(e.message).toContain('name isn\'t defined for dimension: '); } }); + + it('accepts cube meta', async () => { + const { compiler } = prepareYamlCompiler( + ` + cubes: + - name: Users + sql: SELECT * FROM e2e.users + meta: + scalars: + example_string: "foo" + example_integer: 1 + example_float: 1.0 + example_boolean: true + example_null: null + sequence: + - 1 + - 2 + - 3 + mixed_sequence: + - 1 + - "foo" + - 3 + dimensions: + - name: id + sql: id + type: number + primaryKey: true + ` + ); + + await compiler.compile(); + }); });