diff --git a/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js b/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js index 798b14faf2b3d..91bfe840cc74b 100644 --- a/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js +++ b/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js @@ -103,7 +103,7 @@ export class CubeToMetaTransformer { R.map((nameToDimension) => ({ name: `${cube.name}.${nameToDimension[0]}`, title: this.title(cubeTitle, nameToDimension), - type: nameToDimension[1].type, + type: this.dimensionDataType(nameToDimension[1].type), description: nameToDimension[1].description, shortTitle: this.title(cubeTitle, nameToDimension, true), suggestFilterValues: @@ -197,6 +197,10 @@ export class CubeToMetaTransformer { return defaultValue; } + dimensionDataType(dimensionType) { + return dimensionType === 'switch' ? 'string' : dimensionType; + } + measureConfig(cubeName, cubeTitle, nameToMetric) { const name = `${cubeName}.${nameToMetric[0]}`; // Support both old 'drillMemberReferences' and new 'drillMembers' keys diff --git a/packages/cubejs-schema-compiler/test/unit/fixtures/switch-dimension.yml b/packages/cubejs-schema-compiler/test/unit/fixtures/switch-dimension.yml new file mode 100644 index 0000000000000..d39c004238d9d --- /dev/null +++ b/packages/cubejs-schema-compiler/test/unit/fixtures/switch-dimension.yml @@ -0,0 +1,28 @@ +cubes: + - name: orders + sql: SELECT * FROM orders + + measures: + - name: count + sql: id + type: count + dimensions: + - name: id + sql: id + type: number + primary_key: true + + - name: number + sql: number + type: number + + - name: currency + type: switch + values: + - USD + - EUR + - GBP + + - name: status + sql: status + type: string diff --git a/packages/cubejs-schema-compiler/test/unit/switch-dimension.test.ts b/packages/cubejs-schema-compiler/test/unit/switch-dimension.test.ts new file mode 100644 index 0000000000000..d95d7b222b56c --- /dev/null +++ b/packages/cubejs-schema-compiler/test/unit/switch-dimension.test.ts @@ -0,0 +1,25 @@ +import fs from 'fs'; +import path from 'path'; + +import { CubeToMetaTransformer } from 'src/compiler/CubeToMetaTransformer'; +import { prepareYamlCompiler } from './PrepareCompiler'; + +describe('Switch Dimension', () => { + it('Switch dimension meta type', async () => { + const modelContent = fs.readFileSync( + path.join(process.cwd(), '/test/unit/fixtures/switch-dimension.yml'), + 'utf8' + ); + const { metaTransformer, compiler } = prepareYamlCompiler(modelContent); + await compiler.compile(); + + const cube = metaTransformer.cubes[0]; + const numberDim = cube.config.dimensions.find((d) => d.name === 'orders.number'); + const statusDim = cube.config.dimensions.find((d) => d.name === 'orders.status'); + const currencyDim = cube.config.dimensions.find((d) => d.name === 'orders.currency'); + + expect(numberDim.type).toBe('number'); + expect(statusDim.type).toBe('string'); + expect(currencyDim.type).toBe('string'); + }); +});