diff --git a/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js b/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js index 712f7347eed2a..07caf5d71ba0d 100644 --- a/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js +++ b/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js @@ -1453,7 +1453,22 @@ export class BaseQuery { const memberDef = member.definition(); // TODO can addGroupBy replaced by something else? if (memberDef.addGroupByReferences) { - queryContext = { ...queryContext, dimensions: R.uniq(queryContext.dimensions.concat(memberDef.addGroupByReferences)) }; + const dims = memberDef.addGroupByReferences.reduce((acc, cur) => { + const pathArr = cur.split('.'); + // addGroupBy may include time dimension with granularity + // But we don't need it as time dimension + if (pathArr.length > 2) { + pathArr.splice(2, 0, 'granularities'); + acc.push(pathArr.join('.')); + } else { + acc.push(cur); + } + return acc; + }, []); + queryContext = { + ...queryContext, + dimensions: R.uniq(queryContext.dimensions.concat(dims)), + }; } if (memberDef.timeShiftReferences?.length) { let { commonTimeShift } = queryContext; diff --git a/packages/cubejs-schema-compiler/src/compiler/CubeSymbols.ts b/packages/cubejs-schema-compiler/src/compiler/CubeSymbols.ts index 6c7ff8e06b16a..8b551fb5273fd 100644 --- a/packages/cubejs-schema-compiler/src/compiler/CubeSymbols.ts +++ b/packages/cubejs-schema-compiler/src/compiler/CubeSymbols.ts @@ -683,7 +683,7 @@ export class CubeSymbols { return cubeEvaluator.pathFromArray(fullPath(cubeEvaluator.joinHints(), [referencedCube, name])); }, { // eslint-disable-next-line no-shadow - sqlResolveFn: (symbol, currentCube, n) => cubeEvaluator.pathFromArray(fullPath(cubeEvaluator.joinHints(), [currentCube, n])), + sqlResolveFn: (symbol, currentCube, refProperty, propertyName) => cubeEvaluator.pathFromArray(fullPath(cubeEvaluator.joinHints(), [currentCube, refProperty, ...(propertyName ? [propertyName] : [])])), // eslint-disable-next-line no-shadow cubeAliasFn: (currentCube) => cubeEvaluator.pathFromArray(fullPath(cubeEvaluator.joinHints(), [currentCube])), collectJoinHints: options.collectJoinHints, diff --git a/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts b/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts index 0a70b0b94817b..98dcc84a602ae 100644 --- a/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts +++ b/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts @@ -231,6 +231,12 @@ describe('SQL Generation', () => { type: 'sum', add_group_by: [visitors.created_at], }, + revenue_sum_group_by_granularity: { + multi_stage: true, + sql: \`\${revenue}\`, + type: 'number', + add_group_by: [visitors.created_at.month], + }, revenue_rank: { multi_stage: true, type: \`rank\`, @@ -3458,6 +3464,33 @@ SELECT 1 AS revenue, cast('2024-01-01' AS timestamp) as time UNION ALL }] )); + it('multi stage revenue_sum_group_by_granularity and group by td with granularity', async () => runQueryTest( + { + measures: ['visitors.revenue_sum_group_by_granularity'], + dimensions: ['visitors.source'], + order: [{ + id: 'visitors.source' + }], + timezone: 'UTC', + }, + [{ + visitors__revenue_sum_group_by_granularity: '300', + visitors__source: 'google', + }, + { + visitors__revenue_sum_group_by_granularity: '300', + visitors__source: 'some', + }, + { + visitors__revenue_sum_group_by_granularity: '900', + visitors__source: null, + }, + { + visitors__revenue_sum_group_by_granularity: '500', + visitors__source: null, + }] + )); + it('multi stage complex graph with time dimension no granularity', async () => runQueryTest( { measures: ['visitors.adjusted_rank_sum', 'visitors.visitor_revenue'],