@cubejs-backend/schema-compiler 0.29.35 → 0.29.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/src/adapter/AWSElasticSearchQuery.d.ts.map +1 -1
  3. package/dist/src/adapter/BaseGroupFilter.d.ts +2 -0
  4. package/dist/src/adapter/BaseGroupFilter.d.ts.map +1 -1
  5. package/dist/src/adapter/BaseGroupFilter.js +6 -0
  6. package/dist/src/adapter/BaseGroupFilter.js.map +1 -1
  7. package/dist/src/adapter/BaseQuery.d.ts +32 -8
  8. package/dist/src/adapter/BaseQuery.d.ts.map +1 -1
  9. package/dist/src/adapter/BaseQuery.js +105 -45
  10. package/dist/src/adapter/BaseQuery.js.map +1 -1
  11. package/dist/src/adapter/BigqueryQuery.d.ts.map +1 -1
  12. package/dist/src/adapter/BigqueryQuery.js +3 -0
  13. package/dist/src/adapter/BigqueryQuery.js.map +1 -1
  14. package/dist/src/adapter/ClickHouseQuery.d.ts.map +1 -1
  15. package/dist/src/adapter/ClickHouseQuery.js +7 -1
  16. package/dist/src/adapter/ClickHouseQuery.js.map +1 -1
  17. package/dist/src/adapter/ElasticSearchQuery.d.ts.map +1 -1
  18. package/dist/src/adapter/HiveQuery.d.ts.map +1 -1
  19. package/dist/src/adapter/MongoBiQuery.d.ts.map +1 -1
  20. package/dist/src/adapter/MssqlQuery.d.ts.map +1 -1
  21. package/dist/src/adapter/MysqlQuery.d.ts.map +1 -1
  22. package/dist/src/adapter/OracleQuery.d.ts.map +1 -1
  23. package/dist/src/adapter/PostgresQuery.d.ts.map +1 -1
  24. package/dist/src/adapter/PreAggregations.d.ts.map +1 -1
  25. package/dist/src/adapter/PreAggregations.js +13 -6
  26. package/dist/src/adapter/PreAggregations.js.map +1 -1
  27. package/dist/src/adapter/PrestodbQuery.d.ts.map +1 -1
  28. package/dist/src/adapter/RedshiftQuery.d.ts.map +1 -1
  29. package/dist/src/adapter/SnowflakeQuery.d.ts.map +1 -1
  30. package/dist/src/adapter/SqliteQuery.d.ts.map +1 -1
  31. package/dist/src/adapter/VerticaQuery.d.ts.map +1 -1
  32. package/dist/src/compiler/CubeEvaluator.d.ts.map +1 -1
  33. package/dist/src/compiler/CubeEvaluator.js +2 -5
  34. package/dist/src/compiler/CubeEvaluator.js.map +1 -1
  35. package/dist/src/compiler/JoinGraph.js +2 -2
  36. package/dist/src/compiler/JoinGraph.js.map +1 -1
  37. package/package.json +4 -4
package/CHANGELOG.md CHANGED
@@ -3,6 +3,40 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [0.29.48](https://github.com/cube-js/cube.js/compare/v0.29.47...v0.29.48) (2022-04-14)
7
+
8
+
9
+ ### Features
10
+
11
+ * **query-language:** "total" flag support ([#4134](https://github.com/cube-js/cube.js/issues/4134)) ([51aef5e](https://github.com/cube-js/cube.js/commit/51aef5ede6e9b0c0e0e8749119e98102f168b8ca))
12
+ * Support Compound Primary Keys ([#4370](https://github.com/cube-js/cube.js/issues/4370)) Thanks [@rccoe](https://github.com/rccoe)! ([0e3983c](https://github.com/cube-js/cube.js/commit/0e3983ccb30a3f6815ba5ee28aa09807e55fd2a3)), closes [#4364](https://github.com/cube-js/cube.js/issues/4364)
13
+
14
+
15
+
16
+
17
+
18
+ ## [0.29.42](https://github.com/cube-js/cube.js/compare/v0.29.41...v0.29.42) (2022-04-04)
19
+
20
+
21
+ ### Bug Fixes
22
+
23
+ * **playground:** rollup designer count distinct warning ([#4309](https://github.com/cube-js/cube.js/issues/4309)) ([add2dd3](https://github.com/cube-js/cube.js/commit/add2dd3106f7fd9deb3ea88fa74467ccd1b9244f))
24
+
25
+
26
+
27
+
28
+
29
+ ## [0.29.37](https://github.com/cube-js/cube.js/compare/v0.29.36...v0.29.37) (2022-03-29)
30
+
31
+
32
+ ### Features
33
+
34
+ * **@cubejs-backend/schema-compiler:** Allow filtering with or/and in FILTER_PARAMS ([#4253](https://github.com/cube-js/cube.js/issues/4253)) Thanks [@tchell](https://github.com/tchell)! ([cb1446c](https://github.com/cube-js/cube.js/commit/cb1446c4e788bcb43bdc90fc0a48ffc49fd0d891))
35
+
36
+
37
+
38
+
39
+
6
40
  ## [0.29.35](https://github.com/cube-js/cube.js/compare/v0.29.34...v0.29.35) (2022-03-24)
7
41
 
8
42
  **Note:** Version bump only for package @cubejs-backend/schema-compiler
@@ -1 +1 @@
1
- {"version":3,"file":"AWSElasticSearchQuery.d.ts","sourceRoot":"","sources":["../../../src/adapter/AWSElasticSearchQuery.js"],"names":[],"mappings":"AAqBA;IA6DiD,0CAmBgC;IA1B/E,4BAoBC;CAKF"}
1
+ {"version":3,"file":"AWSElasticSearchQuery.d.ts","sourceRoot":"","sources":["../../../src/adapter/AWSElasticSearchQuery.js"],"names":[],"mappings":"AAqBA;IA6D6D,0CAmBgC;IA1B3F,4BAoBC;CAKF"}
@@ -4,7 +4,9 @@ export class BaseGroupFilter {
4
4
  operator: any;
5
5
  measure: any;
6
6
  dimension: any;
7
+ conditionSql(column: any): string;
7
8
  filterToWhere(): any;
9
+ filterParams(): any;
8
10
  getMembers(): any;
9
11
  }
10
12
  //# sourceMappingURL=BaseGroupFilter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseGroupFilter.d.ts","sourceRoot":"","sources":["../../../src/adapter/BaseGroupFilter.js"],"names":[],"mappings":"AAEA;IACE,qCAKC;IAJC,YAA2B;IAC3B,cAA+B;IAC/B,aAA6B;IAC7B,eAAiC;IAGnC,qBAaC;IAED,kBAOC;CACF"}
1
+ {"version":3,"file":"BaseGroupFilter.d.ts","sourceRoot":"","sources":["../../../src/adapter/BaseGroupFilter.js"],"names":[],"mappings":"AAEA;IACE,qCAKC;IAJC,YAA2B;IAC3B,cAA+B;IAC/B,aAA6B;IAC7B,eAAiC;IAGnC,kCAEC;IAED,qBAaC;IAED,oBAEC;IAED,kBAOC;CACF"}
@@ -12,6 +12,9 @@ class BaseGroupFilter {
12
12
  this.measure = filter.measure;
13
13
  this.dimension = filter.dimension;
14
14
  }
15
+ conditionSql(column) {
16
+ return `(\n${this.values.map(f => f.conditionSql(column)).join(` ${this.operator.toUpperCase()} `)}\n)`;
17
+ }
15
18
  filterToWhere() {
16
19
  const r = this.values.map(f => {
17
20
  const sql = f.filterToWhere();
@@ -25,6 +28,9 @@ class BaseGroupFilter {
25
28
  }
26
29
  return r;
27
30
  }
31
+ filterParams() {
32
+ return this.values.map(f => f.filterParams());
33
+ }
28
34
  getMembers() {
29
35
  return this.values.map(f => {
30
36
  if (f.getMembers) {
@@ -1 +1 @@
1
- {"version":3,"file":"BaseGroupFilter.js","sourceRoot":"","sources":["../../../src/adapter/BaseGroupFilter.js"],"names":[],"mappings":";;;;;;AAAA,kDAAsB;AAEtB,MAAa,eAAe;IAC1B,YAAY,KAAK,EAAE,MAAM;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACpC,CAAC;IAED,aAAa;QACX,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,EAAE;gBACR,OAAO,IAAI,CAAC;aACb;YACD,OAAO,IAAI,GAAG,GAAG,CAAC;QACpB,CAAC,CAAC,CAAC,MAAM,CAAC,eAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAEjD,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE;YACb,OAAO,IAAI,CAAC;SACb;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACzB,IAAI,CAAC,CAAC,UAAU,EAAE;gBAChB,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;aACvB;YACD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AA/BD,0CA+BC"}
1
+ {"version":3,"file":"BaseGroupFilter.js","sourceRoot":"","sources":["../../../src/adapter/BaseGroupFilter.js"],"names":[],"mappings":";;;;;;AAAA,kDAAsB;AAEtB,MAAa,eAAe;IAC1B,YAAY,KAAK,EAAE,MAAM;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACpC,CAAC;IAED,YAAY,CAAC,MAAM;QACjB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC;IAC1G,CAAC;IAED,aAAa;QACX,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,EAAE;gBACR,OAAO,IAAI,CAAC;aACb;YACD,OAAO,IAAI,GAAG,GAAG,CAAC;QACpB,CAAC,CAAC,CAAC,MAAM,CAAC,eAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAEjD,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE;YACb,OAAO,IAAI,CAAC;SACb;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACzB,IAAI,CAAC,CAAC,UAAU,EAAE;gBAChB,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;aACvB;YACD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAvCD,0CAuCC"}
@@ -79,11 +79,29 @@ export class BaseQuery {
79
79
  newTimeDimension(timeDimension: any): BaseTimeDimension;
80
80
  newParamAllocator(): ParamAllocator;
81
81
  newPreAggregations(): PreAggregations;
82
+ /**
83
+ * Wrap cpecified column with the double quote.
84
+ */
82
85
  escapeColumnName(name: any): string;
83
- buildParamAnnotatedSql(): any;
86
+ /**
87
+ * Returns SQL query string.
88
+ * @returns {string}
89
+ */
90
+ buildParamAnnotatedSql(): string;
91
+ /**
92
+ * Generate SQL query to calculate total number of rows of the
93
+ * specified SQL query.
94
+ * @param {string} sql
95
+ * @returns {string}
96
+ */
97
+ countAllQuery(sql: string): string;
84
98
  regularAndTimeSeriesRollupQuery(regularMeasures: any, multipliedMeasures: any, cumulativeMeasures: any, preAggregationForQuery: any): string;
85
99
  externalPreAggregationQuery(): boolean;
86
- buildSqlAndParams(): any;
100
+ /**
101
+ * Returns an array of SQL query strings for the query.
102
+ * @returns {Array<string>}
103
+ */
104
+ buildSqlAndParams(): Array<string>;
87
105
  externalQuery(): any;
88
106
  runningTotalDateJoinCondition(): any;
89
107
  rollingWindowDateJoinCondition(trailingInterval: any, leadingInterval: any, offset: any): any;
@@ -94,6 +112,10 @@ export class BaseQuery {
94
112
  cumulativeMeasures(): any;
95
113
  isRolling(): boolean;
96
114
  simpleQuery(): string;
115
+ /**
116
+ * Returns SQL query string.
117
+ * @returns {string}
118
+ */
97
119
  fullKeyQueryAggregate(): string;
98
120
  joinFullKeyQueryAggregate(multipliedMeasures: any, regularMeasures: any, cumulativeMeasures: any, toJoin: any): string;
99
121
  fullKeyQueryAggregateMeasures(): {
@@ -139,7 +161,7 @@ export class BaseQuery {
139
161
  subQueryJoin(dimension: any): {
140
162
  sql: string;
141
163
  alias: string;
142
- on: string;
164
+ on: any;
143
165
  };
144
166
  get filtersWithoutSubQueries(): any;
145
167
  filtersWithoutSubQueriesValue: any;
@@ -152,12 +174,12 @@ export class BaseQuery {
152
174
  regularMeasuresSubQuery(measures: any, filters: any): string;
153
175
  aggregateSubQuery(keyCubeName: any, measures: any, filters: any): string;
154
176
  checkShouldBuildJoinForMeasureSelect(measures: any, keyCubeName: any): any;
155
- aggregateSubQueryMeasureJoin(keyCubeName: any, measures: any, measuresJoin: any, primaryKeyDimension: any, measureSubQueryDimensions: any): any;
177
+ aggregateSubQueryMeasureJoin(keyCubeName: any, measures: any, measuresJoin: any, primaryKeyDimensions: any, measureSubQueryDimensions: any): any;
156
178
  groupedUngroupedSelect(select: any, ungrouped: any, granularityOverride: any): any;
157
179
  ungroupedMeasureSelect(select: any): any;
158
- keysQuery(primaryKeyDimension: any, filters: any): string;
159
- keysSelect(primaryKeyDimension: any): string;
160
- keyDimensions(primaryKeyDimension: any): any;
180
+ keysQuery(primaryKeyDimensions: any, filters: any): string;
181
+ keysSelect(primaryKeyDimensions: any): string;
182
+ keyDimensions(primaryKeyDimensions: any): any[];
161
183
  cubeSql(cube: any): any;
162
184
  traverseSymbol(s: any): any;
163
185
  collectCubeNames(excludeTimeDimensions: any): any;
@@ -187,7 +209,8 @@ export class BaseQuery {
187
209
  evaluateSymbolSql(cubeName: any, name: any, symbol: any): any;
188
210
  autoPrefixAndEvaluateSql(cubeName: any, sql: any): any;
189
211
  concatStringsSql(strings: any): any;
190
- primaryKeyName(cubeName: any): string;
212
+ primaryKeyNames(cubeName: any): any;
213
+ primaryKeyName(cubeName: any, primaryKey: any): string;
191
214
  evaluateSql(cubeName: any, sql: any, options: any): any;
192
215
  withCubeAliasPrefix(cubeAliasPrefix: any, fn: any): any;
193
216
  /**
@@ -211,6 +234,7 @@ export class BaseQuery {
211
234
  hllCardinality(sql: any): void;
212
235
  hllMergeOnly(sql: any): void;
213
236
  hllCardinalityMerge(sql: any): void;
237
+ castToString(sql: any): string;
214
238
  countDistinctApprox(sql: any): void;
215
239
  primaryKeyCount(cubeName: any, distinct: any): any;
216
240
  renderDimensionCase(symbol: any, cubeName: any): string;
@@ -1 +1 @@
1
- {"version":3,"file":"BaseQuery.d.ts","sourceRoot":"","sources":["../../../src/adapter/BaseQuery.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BaseQuery.d.ts","sourceRoot":"","sources":["../../../src/adapter/BaseQuery.js"],"names":[],"mappings":"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"}
@@ -275,7 +275,7 @@ class BaseQuery {
275
275
  if (this.ungrouped) {
276
276
  if (!this.options.allowUngroupedWithoutPrimaryKey) {
277
277
  const cubes = ramda_1.default.uniq([this.join.root].concat(this.join.joins.map(j => j.originalTo)));
278
- const primaryKeyNames = cubes.map(c => this.primaryKeyName(c));
278
+ const primaryKeyNames = cubes.flatMap(c => this.primaryKeyNames(c));
279
279
  const missingPrimaryKeys = primaryKeyNames.filter(key => !this.dimensions.find(d => d.dimension === key));
280
280
  if (missingPrimaryKeys.length) {
281
281
  throw new UserError_1.UserError(`Ungrouped query requires primary keys to be present in dimensions: ${missingPrimaryKeys.map(k => `'${k}'`).join(', ')}. Pass allowUngroupedWithoutPrimaryKey option to disable this check.`);
@@ -363,27 +363,55 @@ class BaseQuery {
363
363
  newPreAggregations() {
364
364
  return new PreAggregations_1.PreAggregations(this, this.options.historyQueries || [], this.options.cubeLatticeCache);
365
365
  }
366
+ /**
367
+ * Wrap cpecified column with the double quote.
368
+ */
366
369
  escapeColumnName(name) {
367
370
  return `"${name}"`;
368
371
  }
372
+ /**
373
+ * Returns SQL query string.
374
+ * @returns {string}
375
+ */
369
376
  buildParamAnnotatedSql() {
377
+ let sql;
378
+ let preAggForQuery;
370
379
  if (!this.options.preAggregationQuery && !this.ungrouped) {
371
- const preAggregationForQuery = this.preAggregations.findPreAggregationForQuery();
372
- if (preAggregationForQuery) {
373
- const { multipliedMeasures, regularMeasures, cumulativeMeasures } = this.fullKeyQueryAggregateMeasures();
374
- if (!cumulativeMeasures.length) {
375
- return this.preAggregations.rollupPreAggregation(preAggregationForQuery, this.measures, true);
376
- }
377
- return this.regularAndTimeSeriesRollupQuery(regularMeasures, multipliedMeasures, cumulativeMeasures, preAggregationForQuery);
380
+ preAggForQuery =
381
+ this.preAggregations.findPreAggregationForQuery();
382
+ }
383
+ if (preAggForQuery) {
384
+ const { multipliedMeasures, regularMeasures, cumulativeMeasures, } = this.fullKeyQueryAggregateMeasures();
385
+ if (cumulativeMeasures.length === 0) {
386
+ sql = this.preAggregations.rollupPreAggregation(preAggForQuery, this.measures, true);
387
+ }
388
+ else {
389
+ sql = this.regularAndTimeSeriesRollupQuery(regularMeasures, multipliedMeasures, cumulativeMeasures, preAggForQuery);
378
390
  }
379
391
  }
380
- return this.fullKeyQueryAggregate();
392
+ else {
393
+ sql = this.fullKeyQueryAggregate();
394
+ }
395
+ return this.options.totalQuery
396
+ ? this.countAllQuery(sql)
397
+ : sql;
398
+ }
399
+ /**
400
+ * Generate SQL query to calculate total number of rows of the
401
+ * specified SQL query.
402
+ * @param {string} sql
403
+ * @returns {string}
404
+ */
405
+ countAllQuery(sql) {
406
+ return `select count(*) ${this.escapeColumnName(shared_1.QueryAlias.TOTAL_COUNT)} from (\n${sql}\n) ${this.escapeColumnName(shared_1.QueryAlias.ORIGINAL_QUERY)}`;
381
407
  }
382
408
  regularAndTimeSeriesRollupQuery(regularMeasures, multipliedMeasures, cumulativeMeasures, preAggregationForQuery) {
383
409
  const regularAndMultiplied = regularMeasures.concat(multipliedMeasures);
384
410
  const toJoin = (regularAndMultiplied.length ? [
385
411
  this.withCubeAliasPrefix('main', () => this.preAggregations.rollupPreAggregation(preAggregationForQuery, regularAndMultiplied, false)),
386
- ] : []).concat(ramda_1.default.map(([multiplied, measure]) => this.withCubeAliasPrefix(`${this.aliasName(measure.measure.replace('.', '_'))}_cumulative`, () => this.overTimeSeriesQuery((measures, filters) => this.preAggregations.rollupPreAggregation(preAggregationForQuery, measures, false, filters), measure, true)))(cumulativeMeasures));
412
+ ] : []).concat(ramda_1.default.map(
413
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
414
+ ([multiplied, measure]) => this.withCubeAliasPrefix(`${this.aliasName(measure.measure.replace('.', '_'))}_cumulative`, () => this.overTimeSeriesQuery((measures, filters) => this.preAggregations.rollupPreAggregation(preAggregationForQuery, measures, false, filters), measure, true)))(cumulativeMeasures));
387
415
  return this.joinFullKeyQueryAggregate(multipliedMeasures, regularMeasures, cumulativeMeasures, toJoin);
388
416
  }
389
417
  externalPreAggregationQuery() {
@@ -397,6 +425,10 @@ class BaseQuery {
397
425
  }
398
426
  return false;
399
427
  }
428
+ /**
429
+ * Returns an array of SQL query strings for the query.
430
+ * @returns {Array<string>}
431
+ */
400
432
  buildSqlAndParams() {
401
433
  if (!this.options.preAggregationQuery && this.externalQueryClass) {
402
434
  if (this.externalPreAggregationQuery()) { // TODO performance
@@ -415,6 +447,7 @@ class BaseQuery {
415
447
  runningTotalDateJoinCondition() {
416
448
  return this.timeDimensions.map(d => [
417
449
  d,
450
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
418
451
  (dateFrom, dateTo, dateField, dimensionDateFrom, dimensionDateTo) => `${dateField} >= ${dimensionDateFrom} AND ${dateField} <= ${dateTo}`
419
452
  ]);
420
453
  }
@@ -466,15 +499,23 @@ class BaseQuery {
466
499
  this.orderBy() +
467
500
  this.groupByDimensionLimit();
468
501
  }
502
+ /**
503
+ * Returns SQL query string.
504
+ * @returns {string}
505
+ */
469
506
  fullKeyQueryAggregate() {
470
- const { multipliedMeasures, regularMeasures, cumulativeMeasures } = this.fullKeyQueryAggregateMeasures();
507
+ const { multipliedMeasures, regularMeasures, cumulativeMeasures, } = this.fullKeyQueryAggregateMeasures();
471
508
  if (!multipliedMeasures.length && !cumulativeMeasures.length) {
472
509
  return this.simpleQuery();
473
510
  }
474
511
  let toJoin;
475
512
  if (this.options.preAggregationQuery) {
476
- const allRegular = regularMeasures.concat(cumulativeMeasures.map(([multiplied, measure]) => (multiplied ? null : measure)).filter(m => !!m));
477
- const allMultiplied = multipliedMeasures.concat(cumulativeMeasures.map(([multiplied, measure]) => (multiplied ? measure : null)).filter(m => !!m));
513
+ const allRegular = regularMeasures.concat(cumulativeMeasures
514
+ .map(([multiplied, measure]) => (multiplied ? null : measure))
515
+ .filter(m => !!m));
516
+ const allMultiplied = multipliedMeasures.concat(cumulativeMeasures
517
+ .map(([multiplied, measure]) => (multiplied ? measure : null))
518
+ .filter(m => !!m));
478
519
  toJoin = (allRegular.length ? [
479
520
  this.withCubeAliasPrefix('main', () => this.regularMeasuresSubQuery(allRegular))
480
521
  ] : [])
@@ -483,15 +524,16 @@ class BaseQuery {
483
524
  else {
484
525
  toJoin =
485
526
  (regularMeasures.length ? [
486
- this.withCubeAliasPrefix('main', () => this.regularMeasuresSubQuery(regularMeasures))
527
+ this.withCubeAliasPrefix('main', () => this.regularMeasuresSubQuery(regularMeasures)),
487
528
  ] : [])
488
529
  .concat(ramda_1.default.pipe(ramda_1.default.groupBy(m => m.cube().name), ramda_1.default.toPairs, ramda_1.default.map(([keyCubeName, measures]) => this
489
- .withCubeAliasPrefix(`${this.aliasName(keyCubeName)}_key`, () => this.aggregateSubQuery(keyCubeName, measures))))(multipliedMeasures)).concat(ramda_1.default.map(([multiplied, measure]) => this.withCubeAliasPrefix(`${this.aliasName(measure.measure.replace('.', '_'))}_cumulative`, () => this.overTimeSeriesQuery(multiplied ?
490
- (measures, filters) => this.aggregateSubQuery(measures[0].cube().name, measures, filters) :
491
- this.regularMeasuresSubQuery.bind(this), measure, false)))(cumulativeMeasures));
530
+ .withCubeAliasPrefix(`${this.aliasName(keyCubeName)}_key`, () => this.aggregateSubQuery(keyCubeName, measures))))(multipliedMeasures)).concat(ramda_1.default.map(([multiplied, measure]) => this.withCubeAliasPrefix(`${this.aliasName(measure.measure.replace('.', '_'))}_cumulative`, () => this.overTimeSeriesQuery(multiplied
531
+ ? (measures, filters) => this.aggregateSubQuery(measures[0].cube().name, measures, filters)
532
+ : this.regularMeasuresSubQuery.bind(this), measure, false)))(cumulativeMeasures));
492
533
  }
493
- // Move regular measures to multiplied ones if there're same cubes to calculate.
494
- // Most of the times it'll be much faster to calculate as there will be only single scan per cube
534
+ // Move regular measures to multiplied ones if there're same
535
+ // cubes to calculate. Most of the times it'll be much faster to
536
+ // calculate as there will be only single scan per cube.
495
537
  if (regularMeasures.length &&
496
538
  multipliedMeasures.length &&
497
539
  !cumulativeMeasures.length) {
@@ -716,7 +758,7 @@ class BaseQuery {
716
758
  }
717
759
  subQueryJoin(dimension) {
718
760
  const { prefix, subQuery, cubeName } = this.subQueryDescription(dimension);
719
- const primaryKey = this.newDimension(this.primaryKeyName(cubeName));
761
+ const primaryKeys = this.cubeEvaluator.primaryKeys[cubeName];
720
762
  const subQueryAlias = this.escapeColumnName(this.aliasName(prefix));
721
763
  const { collectOriginalSqlPreAggregations } = this.safeEvaluateSymbolContext();
722
764
  const sql = subQuery.evaluateSymbolSqlWithContext(() => subQuery.buildParamAnnotatedSql(), {
@@ -725,7 +767,7 @@ class BaseQuery {
725
767
  return {
726
768
  sql: `(${sql})`,
727
769
  alias: subQueryAlias,
728
- on: `${subQueryAlias}.${primaryKey.aliasName()} = ${this.primaryKeySql(this.cubeEvaluator.primaryKeys[cubeName], cubeName)}`
770
+ on: primaryKeys.map((pk) => `${subQueryAlias}.${this.newDimension(this.primaryKeyName(cubeName, pk)).aliasName()} = ${this.primaryKeySql(pk, cubeName)}`)
729
771
  };
730
772
  }
731
773
  get filtersWithoutSubQueries() {
@@ -761,7 +803,7 @@ class BaseQuery {
761
803
  cubeName,
762
804
  name
763
805
  }],
764
- dimensions: [this.primaryKeyName(cubeName)],
806
+ dimensions: this.primaryKeyNames(cubeName),
765
807
  filters,
766
808
  segments,
767
809
  timeDimensions,
@@ -781,7 +823,7 @@ class BaseQuery {
781
823
  }
782
824
  aggregateSubQuery(keyCubeName, measures, filters) {
783
825
  filters = filters || this.allFilters;
784
- const primaryKeyDimension = this.newDimension(this.primaryKeyName(keyCubeName));
826
+ const primaryKeyDimensions = this.primaryKeyNames(keyCubeName).map((k) => this.newDimension(k));
785
827
  const shouldBuildJoinForMeasureSelect = this.checkShouldBuildJoinForMeasureSelect(measures, keyCubeName);
786
828
  let keyCubeSql;
787
829
  let keyCubeAlias;
@@ -793,7 +835,7 @@ class BaseQuery {
793
835
  if (measuresJoin.multiplicationFactor[keyCubeName]) {
794
836
  throw new UserError_1.UserError(`'${measures.map(m => m.measure).join(', ')}' reference cubes that lead to row multiplication.`);
795
837
  }
796
- keyCubeSql = `(${this.aggregateSubQueryMeasureJoin(keyCubeName, measures, measuresJoin, primaryKeyDimension, measureSubQueryDimensions)})`;
838
+ keyCubeSql = `(${this.aggregateSubQueryMeasureJoin(keyCubeName, measures, measuresJoin, primaryKeyDimensions, measureSubQueryDimensions)})`;
797
839
  keyCubeAlias = this.cubeAlias(keyCubeName);
798
840
  }
799
841
  else {
@@ -804,16 +846,16 @@ class BaseQuery {
804
846
  ungroupedAliases: ramda_1.default.fromPairs(measures.map(m => [m.measure, m.aliasName()]))
805
847
  }) : measureSelectFn();
806
848
  const columnsForSelect = this.dimensionColumns(this.escapeColumnName('keys')).concat(selectedMeasures).filter(s => !!s).join(', ');
807
- const keyInMeasureSelect = shouldBuildJoinForMeasureSelect ?
808
- `${this.cubeAlias(keyCubeName)}.${primaryKeyDimension.aliasName()}` :
809
- this.dimensionSql(primaryKeyDimension);
849
+ const primaryKeyJoinConditions = primaryKeyDimensions.map((pkd) => `${this.escapeColumnName('keys')}.${pkd.aliasName()} = ${shouldBuildJoinForMeasureSelect ?
850
+ `${this.cubeAlias(keyCubeName)}.${pkd.aliasName()}` :
851
+ this.dimensionSql(pkd)}`).join(' AND ');
810
852
  const subQueryJoins = shouldBuildJoinForMeasureSelect ? [] : measureSubQueryDimensions.map(d => this.subQueryJoin(d));
811
853
  const joinSql = this.joinSql([
812
- { sql: `(${this.keysQuery(primaryKeyDimension, filters)})`, alias: this.escapeColumnName('keys') },
854
+ { sql: `(${this.keysQuery(primaryKeyDimensions, filters)})`, alias: this.escapeColumnName('keys') },
813
855
  {
814
856
  sql: keyCubeSql,
815
857
  alias: keyCubeAlias,
816
- on: `${this.escapeColumnName('keys')}.${primaryKeyDimension.aliasName()} = ${keyInMeasureSelect}
858
+ on: `${primaryKeyJoinConditions}
817
859
  ${keyCubeInlineLeftJoinConditions ? ` AND (${keyCubeInlineLeftJoinConditions})` : ''}`
818
860
  },
819
861
  ...subQueryJoins
@@ -834,9 +876,9 @@ class BaseQuery {
834
876
  return false;
835
877
  }).reduce((a, b) => a || b);
836
878
  }
837
- aggregateSubQueryMeasureJoin(keyCubeName, measures, measuresJoin, primaryKeyDimension, measureSubQueryDimensions) {
879
+ aggregateSubQueryMeasureJoin(keyCubeName, measures, measuresJoin, primaryKeyDimensions, measureSubQueryDimensions) {
838
880
  return this.ungroupedMeasureSelect(() => this.withCubeAliasPrefix(`${keyCubeName}_measure_join`, () => {
839
- const columns = [primaryKeyDimension.selectColumns()].concat(measures.map(m => m.selectColumns()))
881
+ const columns = primaryKeyDimensions.map(p => p.selectColumns()).concat(measures.map(m => m.selectColumns()))
840
882
  .filter(s => !!s).join(', ');
841
883
  return `SELECT ${columns} FROM ${this.joinQuery(measuresJoin, measureSubQueryDimensions)}`;
842
884
  }));
@@ -847,18 +889,18 @@ class BaseQuery {
847
889
  ungroupedMeasureSelect(select) {
848
890
  return this.evaluateSymbolSqlWithContext(select, { ungrouped: true });
849
891
  }
850
- keysQuery(primaryKeyDimension, filters) {
892
+ keysQuery(primaryKeyDimensions, filters) {
851
893
  const inlineWhereConditions = [];
852
- const query = this.rewriteInlineWhere(() => this.joinQuery(this.join, this.collectFrom(this.keyDimensions(primaryKeyDimension), this.collectSubQueryDimensionsFor.bind(this), 'collectSubQueryDimensionsFor')), inlineWhereConditions);
853
- return `SELECT DISTINCT ${this.keysSelect(primaryKeyDimension)} FROM ${query} ${this.baseWhere(filters.concat(inlineWhereConditions))}`;
894
+ const query = this.rewriteInlineWhere(() => this.joinQuery(this.join, this.collectFrom(this.keyDimensions(primaryKeyDimensions), this.collectSubQueryDimensionsFor.bind(this), 'collectSubQueryDimensionsFor')), inlineWhereConditions);
895
+ return `SELECT DISTINCT ${this.keysSelect(primaryKeyDimensions)} FROM ${query} ${this.baseWhere(filters.concat(inlineWhereConditions))}`;
854
896
  }
855
- keysSelect(primaryKeyDimension) {
856
- return ramda_1.default.flatten(this.keyDimensions(primaryKeyDimension)
897
+ keysSelect(primaryKeyDimensions) {
898
+ return ramda_1.default.flatten(this.keyDimensions(primaryKeyDimensions)
857
899
  .map(s => s.selectColumns())).filter(s => !!s).join(', ');
858
900
  }
859
- keyDimensions(primaryKeyDimension) {
860
- return this.dimensionsForSelect()
861
- .concat(ramda_1.default.none(d => d.dimension === primaryKeyDimension.dimension, this.dimensionsForSelect()) ? [primaryKeyDimension] : []);
901
+ keyDimensions(primaryKeyDimensions) {
902
+ return ramda_1.default.uniqBy((d) => d.dimension, this.dimensionsForSelect()
903
+ .concat(primaryKeyDimensions));
862
904
  }
863
905
  cubeSql(cube) {
864
906
  const foundPreAggregation = this.preAggregations.findPreAggregationToUseForCube(cube);
@@ -1043,8 +1085,11 @@ class BaseQuery {
1043
1085
  this.safeEvaluateSymbolContext().leafMeasures[this.safeEvaluateSymbolContext().currentMeasure] = true;
1044
1086
  }
1045
1087
  }
1088
+ const primaryKeys = this.cubeEvaluator.primaryKeys[cubeName];
1046
1089
  const result = this.renderSqlMeasure(name, this.applyMeasureFilters(this.autoPrefixWithCubeName(cubeName, symbol.sql && this.evaluateSql(cubeName, symbol.sql) ||
1047
- this.cubeEvaluator.primaryKeys[cubeName] && this.primaryKeySql(this.cubeEvaluator.primaryKeys[cubeName], cubeName) || '*'), symbol, cubeName), symbol, cubeName, parentMeasure);
1090
+ primaryKeys.length && (primaryKeys.length > 1 ?
1091
+ this.concatStringsSql(primaryKeys.map((pk) => this.castToString(this.primaryKeySql(pk, cubeName))))
1092
+ : this.primaryKeySql(primaryKeys[0], cubeName)) || '*'), symbol, cubeName), symbol, cubeName, parentMeasure);
1048
1093
  if (this.safeEvaluateSymbolContext().compositeCubeMeasures ||
1049
1094
  this.safeEvaluateSymbolContext().leafMeasures) {
1050
1095
  this.safeEvaluateSymbolContext().currentMeasure = parentMeasure;
@@ -1084,11 +1129,14 @@ class BaseQuery {
1084
1129
  concatStringsSql(strings) {
1085
1130
  return strings.join(' || ');
1086
1131
  }
1087
- primaryKeyName(cubeName) {
1088
- const primaryKey = this.cubeEvaluator.primaryKeys[cubeName];
1089
- if (!primaryKey) {
1090
- throw new UserError_1.UserError(`Primary key is required for '${cubeName}`);
1132
+ primaryKeyNames(cubeName) {
1133
+ const primaryKeys = this.cubeEvaluator.primaryKeys[cubeName];
1134
+ if (!primaryKeys || !primaryKeys.length) {
1135
+ throw new UserError_1.UserError(`One or more Primary key is required for '${cubeName}`);
1091
1136
  }
1137
+ return primaryKeys.map((pk) => this.primaryKeyName(cubeName, pk));
1138
+ }
1139
+ primaryKeyName(cubeName, primaryKey) {
1092
1140
  return `${cubeName}.${primaryKey}`;
1093
1141
  }
1094
1142
  evaluateSql(cubeName, sql, options) {
@@ -1246,12 +1294,15 @@ class BaseQuery {
1246
1294
  }
1247
1295
  return evaluateSql;
1248
1296
  }
1297
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1249
1298
  hllInit(sql) {
1250
1299
  throw new UserError_1.UserError('Distributed approximate distinct count is not supported by this DB');
1251
1300
  }
1301
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1252
1302
  hllMerge(sql) {
1253
1303
  throw new UserError_1.UserError('Distributed approximate distinct count is not supported by this DB');
1254
1304
  }
1305
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1255
1306
  hllCardinality(sql) {
1256
1307
  throw new UserError_1.UserError('Distributed approximate distinct count is not supported by this DB');
1257
1308
  }
@@ -1261,11 +1312,18 @@ class BaseQuery {
1261
1312
  hllCardinalityMerge(sql) {
1262
1313
  return this.hllMerge(sql);
1263
1314
  }
1315
+ castToString(sql) {
1316
+ return `CAST(${sql} as TEXT)`;
1317
+ }
1318
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1264
1319
  countDistinctApprox(sql) {
1265
1320
  throw new UserError_1.UserError('Approximate distinct count is not supported by this DB');
1266
1321
  }
1267
1322
  primaryKeyCount(cubeName, distinct) {
1268
- const primaryKeySql = this.primaryKeySql(this.cubeEvaluator.primaryKeys[cubeName], cubeName);
1323
+ const primaryKeys = this.cubeEvaluator.primaryKeys[cubeName];
1324
+ const primaryKeySql = primaryKeys.length > 1 ?
1325
+ this.concatStringsSql(primaryKeys.map((pk) => this.castToString(this.primaryKeySql(pk, cubeName)))) :
1326
+ this.primaryKeySql(primaryKeys[0], cubeName);
1269
1327
  return `count(${distinct ? 'distinct ' : ''}${primaryKeySql})`;
1270
1328
  }
1271
1329
  renderDimensionCase(symbol, cubeName) {
@@ -1323,9 +1381,11 @@ class BaseQuery {
1323
1381
  * @param {string} field
1324
1382
  * @return {string}
1325
1383
  */
1384
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1326
1385
  convertTz(field) {
1327
1386
  throw new Error('Not implemented');
1328
1387
  }
1388
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1329
1389
  timeGroupedColumn(granularity, dimension) {
1330
1390
  throw new Error('Not implemented');
1331
1391
  }