@cubejs-backend/schema-compiler 0.30.43 → 0.30.47
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.
- package/CHANGELOG.md +31 -0
- package/dist/src/adapter/AWSElasticSearchQuery.d.ts.map +1 -1
- package/dist/src/adapter/BaseQuery.d.ts +47 -9
- package/dist/src/adapter/BaseQuery.d.ts.map +1 -1
- package/dist/src/adapter/BaseQuery.js +98 -10
- package/dist/src/adapter/BaseQuery.js.map +1 -1
- package/dist/src/adapter/BigqueryQuery.d.ts.map +1 -1
- package/dist/src/adapter/ClickHouseQuery.d.ts.map +1 -1
- package/dist/src/adapter/CrateQuery.d.ts +5 -0
- package/dist/src/adapter/CrateQuery.d.ts.map +1 -0
- package/dist/src/adapter/CrateQuery.js +19 -0
- package/dist/src/adapter/CrateQuery.js.map +1 -0
- package/dist/src/adapter/ElasticSearchQuery.d.ts.map +1 -1
- package/dist/src/adapter/HiveQuery.d.ts.map +1 -1
- package/dist/src/adapter/MongoBiQuery.d.ts.map +1 -1
- package/dist/src/adapter/MssqlQuery.d.ts.map +1 -1
- package/dist/src/adapter/MssqlQuery.js +19 -2
- package/dist/src/adapter/MssqlQuery.js.map +1 -1
- package/dist/src/adapter/MysqlQuery.d.ts.map +1 -1
- package/dist/src/adapter/OracleQuery.d.ts.map +1 -1
- package/dist/src/adapter/PostgresQuery.d.ts.map +1 -1
- package/dist/src/adapter/PreAggregations.d.ts +3 -0
- package/dist/src/adapter/PreAggregations.d.ts.map +1 -1
- package/dist/src/adapter/PreAggregations.js +7 -2
- package/dist/src/adapter/PreAggregations.js.map +1 -1
- package/dist/src/adapter/PrestodbQuery.d.ts.map +1 -1
- package/dist/src/adapter/QueryBuilder.d.ts.map +1 -1
- package/dist/src/adapter/QueryBuilder.js +2 -0
- package/dist/src/adapter/QueryBuilder.js.map +1 -1
- package/dist/src/adapter/RedshiftQuery.d.ts.map +1 -1
- package/dist/src/adapter/SnowflakeQuery.d.ts.map +1 -1
- package/dist/src/adapter/SqliteQuery.d.ts.map +1 -1
- package/dist/src/adapter/VerticaQuery.d.ts.map +1 -1
- package/dist/src/compiler/CubeValidator.d.ts.map +1 -1
- package/dist/src/compiler/CubeValidator.js +1 -0
- package/dist/src/compiler/CubeValidator.js.map +1 -1
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,37 @@
|
|
|
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.30.47](https://github.com/cube-js/cube.js/compare/v0.30.46...v0.30.47) (2022-08-12)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **cubejs:** LambdaView: hybrid query of source tables and pre-aggregation tables. ([#4718](https://github.com/cube-js/cube.js/issues/4718)) ([4ae826b](https://github.com/cube-js/cube.js/commit/4ae826b4d27afbfce366830150e130f29c7fcbbf))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## [0.30.46](https://github.com/cube-js/cube.js/compare/v0.30.45...v0.30.46) (2022-08-10)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Features
|
|
21
|
+
|
|
22
|
+
* **drivers:** Bootstraps CrateDB driver ([#4929](https://github.com/cube-js/cube.js/issues/4929)) ([db87b8f](https://github.com/cube-js/cube.js/commit/db87b8f18686607498467c6ff0f71abcd1e38c5d))
|
|
23
|
+
* **schema-compiler:** aggregated sub query group by clause ([#5078](https://github.com/cube-js/cube.js/issues/5078)) ([473398d](https://github.com/cube-js/cube.js/commit/473398d0a4a983730aba115766afc53f2dd829a6))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
## [0.30.45](https://github.com/cube-js/cube.js/compare/v0.30.44...v0.30.45) (2022-08-05)
|
|
30
|
+
|
|
31
|
+
**Note:** Version bump only for package @cubejs-backend/schema-compiler
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
6
37
|
## [0.30.43](https://github.com/cube-js/cube.js/compare/v0.30.42...v0.30.43) (2022-07-28)
|
|
7
38
|
|
|
8
39
|
**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":"AAuBA;
|
|
1
|
+
{"version":3,"file":"AWSElasticSearchQuery.d.ts","sourceRoot":"","sources":["../../../src/adapter/AWSElasticSearchQuery.js"],"names":[],"mappings":"AAuBA;IAwDwD,0CAqBjD;IAvBL,4BAoBC;CAKF"}
|
|
@@ -80,9 +80,11 @@ export class BaseQuery {
|
|
|
80
80
|
newParamAllocator(): ParamAllocator;
|
|
81
81
|
newPreAggregations(): PreAggregations;
|
|
82
82
|
/**
|
|
83
|
-
* Wrap
|
|
83
|
+
* Wrap specified column/table name with the double quote.
|
|
84
|
+
* @param {string} name
|
|
85
|
+
* @returns {string}
|
|
84
86
|
*/
|
|
85
|
-
escapeColumnName(name:
|
|
87
|
+
escapeColumnName(name: string): string;
|
|
86
88
|
/**
|
|
87
89
|
* Returns SQL query string.
|
|
88
90
|
* @returns {string}
|
|
@@ -102,6 +104,11 @@ export class BaseQuery {
|
|
|
102
104
|
* @returns {Array<string>}
|
|
103
105
|
*/
|
|
104
106
|
buildSqlAndParams(): Array<string>;
|
|
107
|
+
/**
|
|
108
|
+
* Returns a dictionary mapping each preagregation to its corresponding query fragment.
|
|
109
|
+
* @returns {Record<string, Array<string>>}
|
|
110
|
+
*/
|
|
111
|
+
buildLambdaQuery(): Record<string, Array<string>>;
|
|
105
112
|
externalQuery(): any;
|
|
106
113
|
runningTotalDateJoinCondition(): any;
|
|
107
114
|
rollingWindowDateJoinCondition(trailingInterval: any, leadingInterval: any, offset: any): any;
|
|
@@ -172,14 +179,21 @@ export class BaseQuery {
|
|
|
172
179
|
};
|
|
173
180
|
subQueryName(cubeName: any, name: any): string;
|
|
174
181
|
regularMeasuresSubQuery(measures: any, filters: any): string;
|
|
175
|
-
|
|
182
|
+
/**
|
|
183
|
+
* Returns SQL query for the "aggregating on top of sub-queries" uses cases.
|
|
184
|
+
* @param {string} keyCubeName
|
|
185
|
+
* @param {Array<BaseMeasure>} measures
|
|
186
|
+
* @param {Array<BaseFilter>} filters
|
|
187
|
+
* @returns {string}
|
|
188
|
+
*/
|
|
189
|
+
aggregateSubQuery(keyCubeName: string, measures: Array<BaseMeasure>, filters: Array<BaseFilter>): string;
|
|
176
190
|
checkShouldBuildJoinForMeasureSelect(measures: any, keyCubeName: any): any;
|
|
177
191
|
aggregateSubQueryMeasureJoin(keyCubeName: any, measures: any, measuresJoin: any, primaryKeyDimensions: any, measureSubQueryDimensions: any): any;
|
|
178
192
|
groupedUngroupedSelect(select: any, ungrouped: any, granularityOverride: any): any;
|
|
179
193
|
ungroupedMeasureSelect(select: any): any;
|
|
180
194
|
keysQuery(primaryKeyDimensions: any, filters: any): string;
|
|
181
195
|
keysSelect(primaryKeyDimensions: any): string;
|
|
182
|
-
keyDimensions(primaryKeyDimensions: any):
|
|
196
|
+
keyDimensions(primaryKeyDimensions: any): BaseDimension[];
|
|
183
197
|
cubeSql(cube: any): any;
|
|
184
198
|
traverseSymbol(s: any): any;
|
|
185
199
|
collectCubeNames(excludeTimeDimensions: any): any;
|
|
@@ -187,17 +201,41 @@ export class BaseQuery {
|
|
|
187
201
|
collectFrom(membersToCollectFrom: any, fn: any, methodName: any, cache: any): any[];
|
|
188
202
|
collectSubQueryDimensionsFor(fn: any): never[];
|
|
189
203
|
rewriteInlineWhere(fn: any, inlineWhereConditions: any): any;
|
|
204
|
+
/**
|
|
205
|
+
* Returns `GROUP BY` clause for the "aggregating on top of sub-queries" uses
|
|
206
|
+
* cases. By the default returns the result of the `groupByClause` method.
|
|
207
|
+
* @returns {string}
|
|
208
|
+
*/
|
|
209
|
+
aggregateSubQueryGroupByClause(): string;
|
|
210
|
+
/**
|
|
211
|
+
* Returns `GROUP BY` clause for the basic uses cases.
|
|
212
|
+
* @returns {string}
|
|
213
|
+
*/
|
|
190
214
|
groupByClause(): string;
|
|
191
215
|
getFieldIndex(id: any): any;
|
|
192
216
|
orderBy(): string;
|
|
193
|
-
|
|
194
|
-
|
|
217
|
+
/**
|
|
218
|
+
* Returns a complete list of the aliased dimensions, including time
|
|
219
|
+
* dimensions.
|
|
220
|
+
* @returns {Array<string>}
|
|
221
|
+
*/
|
|
222
|
+
dimensionAliasNames(): Array<string>;
|
|
223
|
+
/**
|
|
224
|
+
* Returns an array of column names correlated to the specified cube dimensions.
|
|
225
|
+
* @param {string} cubeAlias
|
|
226
|
+
* @returns {Array<string>}
|
|
227
|
+
*/
|
|
228
|
+
dimensionColumns(cubeAlias: string): Array<string>;
|
|
195
229
|
groupByDimensionLimit(): string;
|
|
196
230
|
topLimit(): string;
|
|
197
231
|
baseSelect(): string;
|
|
198
232
|
selectAllDimensionsAndMeasures(measures: any): string;
|
|
199
|
-
forSelect():
|
|
200
|
-
|
|
233
|
+
forSelect(): BaseDimension[];
|
|
234
|
+
/**
|
|
235
|
+
* Returns a complete list of the dimensions, including time dimensions.
|
|
236
|
+
* @returns {Array<BaseDimension>}
|
|
237
|
+
*/
|
|
238
|
+
dimensionsForSelect(): Array<BaseDimension>;
|
|
201
239
|
dimensionSql(dimension: any): any;
|
|
202
240
|
segmentSql(segment: any): any;
|
|
203
241
|
measureSql(measure: any): any;
|
|
@@ -284,7 +322,7 @@ export class BaseQuery {
|
|
|
284
322
|
evaluateIndexColumns(cube: any, index: any): any;
|
|
285
323
|
createIndexSql(indexName: any, tableName: any, escapedColumns: any): string;
|
|
286
324
|
preAggregationSql(cube: any, preAggregation: any): any;
|
|
287
|
-
preAggregationReadOnly(
|
|
325
|
+
preAggregationReadOnly(_cube: any, _preAggregation: any): boolean;
|
|
288
326
|
preAggregationQueryForSqlEvaluation(cube: any, preAggregation: any): any;
|
|
289
327
|
parseCronSyntax(every: any): {
|
|
290
328
|
start: cronParser.CronDate;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseQuery.d.ts","sourceRoot":"","sources":["../../../src/adapter/BaseQuery.js"],"names":[],"mappings":"AA+CA;;;;;;;;;;GAUG;AAEH;IAgBE;;;;OAIG;IACH,uBAHW,SAAS,MAAE,gBAarB;IATC,eAA0B;IAC1B,mBAA4C;IAC5C,eAAoC;IACpC,aAA4B;
|
|
1
|
+
{"version":3,"file":"BaseQuery.d.ts","sourceRoot":"","sources":["../../../src/adapter/BaseQuery.js"],"names":[],"mappings":"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"}
|
|
@@ -364,7 +364,9 @@ class BaseQuery {
|
|
|
364
364
|
return new PreAggregations_1.PreAggregations(this, this.options.historyQueries || [], this.options.cubeLatticeCache);
|
|
365
365
|
}
|
|
366
366
|
/**
|
|
367
|
-
* Wrap
|
|
367
|
+
* Wrap specified column/table name with the double quote.
|
|
368
|
+
* @param {string} name
|
|
369
|
+
* @returns {string}
|
|
368
370
|
*/
|
|
369
371
|
escapeColumnName(name) {
|
|
370
372
|
return `"${name}"`;
|
|
@@ -437,6 +439,44 @@ class BaseQuery {
|
|
|
437
439
|
}
|
|
438
440
|
return this.compilers.compiler.withQuery(this, () => this.cacheValue(['buildSqlAndParams'], () => this.paramAllocator.buildSqlAndParams(this.buildParamAnnotatedSql()), { cache: this.queryCache }));
|
|
439
441
|
}
|
|
442
|
+
/**
|
|
443
|
+
* Returns a dictionary mapping each preagregation to its corresponding query fragment.
|
|
444
|
+
* @returns {Record<string, Array<string>>}
|
|
445
|
+
*/
|
|
446
|
+
buildLambdaQuery() {
|
|
447
|
+
var _a;
|
|
448
|
+
const preAggForQuery = this.preAggregations.findPreAggregationForQuery();
|
|
449
|
+
const result = {};
|
|
450
|
+
if (preAggForQuery && preAggForQuery.preAggregation.unionWithSourceData) {
|
|
451
|
+
// TODO(cristipp) Use source query instead of preaggregation references.
|
|
452
|
+
const references = this.cubeEvaluator.evaluatePreAggregationReferences(preAggForQuery.cube, preAggForQuery.preAggregation);
|
|
453
|
+
const lambdaQuery = this.newSubQuery({
|
|
454
|
+
measures: references.measures,
|
|
455
|
+
dimensions: references.dimensions,
|
|
456
|
+
timeDimensions: references.timeDimensions,
|
|
457
|
+
filters: [
|
|
458
|
+
...(_a = this.options.filters) !== null && _a !== void 0 ? _a : [],
|
|
459
|
+
references.timeDimensions.length > 0
|
|
460
|
+
? {
|
|
461
|
+
member: references.timeDimensions[0].dimension,
|
|
462
|
+
operator: 'afterDate',
|
|
463
|
+
values: [shared_1.FROM_PARTITION_RANGE]
|
|
464
|
+
}
|
|
465
|
+
: [],
|
|
466
|
+
],
|
|
467
|
+
segments: this.options.segments,
|
|
468
|
+
order: [],
|
|
469
|
+
limit: undefined,
|
|
470
|
+
offset: undefined,
|
|
471
|
+
rowLimit: shared_1.MAX_SOURCE_ROW_LIMIT,
|
|
472
|
+
preAggregationQuery: true,
|
|
473
|
+
});
|
|
474
|
+
const sqlAndParams = lambdaQuery.buildSqlAndParams();
|
|
475
|
+
const cacheKeyQueries = this.evaluateSymbolSqlWithContext(() => this.cacheKeyQueries(), { preAggregationQuery: true });
|
|
476
|
+
result[this.preAggregations.preAggregationId(preAggForQuery)] = { sqlAndParams, cacheKeyQueries };
|
|
477
|
+
}
|
|
478
|
+
return result;
|
|
479
|
+
}
|
|
440
480
|
externalQuery() {
|
|
441
481
|
const ExternalQuery = this.externalQueryClass;
|
|
442
482
|
return new ExternalQuery(this.compilers, {
|
|
@@ -821,6 +861,13 @@ class BaseQuery {
|
|
|
821
861
|
return `SELECT ${this.selectAllDimensionsAndMeasures(measures)} FROM ${query} ${this.baseWhere(filters.concat(inlineWhereConditions))}` +
|
|
822
862
|
(!this.safeEvaluateSymbolContext().ungrouped && this.groupByClause() || '');
|
|
823
863
|
}
|
|
864
|
+
/**
|
|
865
|
+
* Returns SQL query for the "aggregating on top of sub-queries" uses cases.
|
|
866
|
+
* @param {string} keyCubeName
|
|
867
|
+
* @param {Array<BaseMeasure>} measures
|
|
868
|
+
* @param {Array<BaseFilter>} filters
|
|
869
|
+
* @returns {string}
|
|
870
|
+
*/
|
|
824
871
|
aggregateSubQuery(keyCubeName, measures, filters) {
|
|
825
872
|
filters = filters || this.allFilters;
|
|
826
873
|
const primaryKeyDimensions = this.primaryKeyNames(keyCubeName).map((k) => this.newDimension(k));
|
|
@@ -845,23 +892,30 @@ class BaseQuery {
|
|
|
845
892
|
const selectedMeasures = shouldBuildJoinForMeasureSelect ? this.evaluateSymbolSqlWithContext(measureSelectFn, {
|
|
846
893
|
ungroupedAliases: ramda_1.default.fromPairs(measures.map(m => [m.measure, m.aliasName()]))
|
|
847
894
|
}) : measureSelectFn();
|
|
848
|
-
const columnsForSelect = this
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
895
|
+
const columnsForSelect = this
|
|
896
|
+
.dimensionColumns(this.escapeColumnName(shared_1.QueryAlias.AGG_SUB_QUERY_KEYS))
|
|
897
|
+
.concat(selectedMeasures)
|
|
898
|
+
.filter(s => !!s)
|
|
899
|
+
.join(', ');
|
|
900
|
+
const primaryKeyJoinConditions = primaryKeyDimensions.map((pkd) => (`${this.escapeColumnName(shared_1.QueryAlias.AGG_SUB_QUERY_KEYS)}.${pkd.aliasName()} = ${shouldBuildJoinForMeasureSelect
|
|
901
|
+
? `${this.cubeAlias(keyCubeName)}.${pkd.aliasName()}`
|
|
902
|
+
: this.dimensionSql(pkd)}`)).join(' AND ');
|
|
852
903
|
const subQueryJoins = shouldBuildJoinForMeasureSelect ? [] : measureSubQueryDimensions.map(d => this.subQueryJoin(d));
|
|
853
904
|
const joinSql = this.joinSql([
|
|
854
|
-
{
|
|
905
|
+
{
|
|
906
|
+
sql: `(${this.keysQuery(primaryKeyDimensions, filters)})`,
|
|
907
|
+
alias: this.escapeColumnName(shared_1.QueryAlias.AGG_SUB_QUERY_KEYS),
|
|
908
|
+
},
|
|
855
909
|
{
|
|
856
910
|
sql: keyCubeSql,
|
|
857
911
|
alias: keyCubeAlias,
|
|
858
912
|
on: `${primaryKeyJoinConditions}
|
|
859
|
-
${keyCubeInlineLeftJoinConditions ? ` AND (${keyCubeInlineLeftJoinConditions})` : ''}
|
|
913
|
+
${keyCubeInlineLeftJoinConditions ? ` AND (${keyCubeInlineLeftJoinConditions})` : ''}`,
|
|
860
914
|
},
|
|
861
915
|
...subQueryJoins
|
|
862
916
|
]);
|
|
863
917
|
return `SELECT ${columnsForSelect} FROM ${joinSql}` +
|
|
864
|
-
(!this.safeEvaluateSymbolContext().ungrouped && this.
|
|
918
|
+
(!this.safeEvaluateSymbolContext().ungrouped && this.aggregateSubQueryGroupByClause() || '');
|
|
865
919
|
}
|
|
866
920
|
checkShouldBuildJoinForMeasureSelect(measures, keyCubeName) {
|
|
867
921
|
return measures.map(measure => {
|
|
@@ -955,6 +1009,18 @@ class BaseQuery {
|
|
|
955
1009
|
const context = { inlineWhereConditions };
|
|
956
1010
|
return this.evaluateSymbolSqlWithContext(fn, context);
|
|
957
1011
|
}
|
|
1012
|
+
/**
|
|
1013
|
+
* Returns `GROUP BY` clause for the "aggregating on top of sub-queries" uses
|
|
1014
|
+
* cases. By the default returns the result of the `groupByClause` method.
|
|
1015
|
+
* @returns {string}
|
|
1016
|
+
*/
|
|
1017
|
+
aggregateSubQueryGroupByClause() {
|
|
1018
|
+
return this.groupByClause();
|
|
1019
|
+
}
|
|
1020
|
+
/**
|
|
1021
|
+
* Returns `GROUP BY` clause for the basic uses cases.
|
|
1022
|
+
* @returns {string}
|
|
1023
|
+
*/
|
|
958
1024
|
groupByClause() {
|
|
959
1025
|
if (this.ungrouped) {
|
|
960
1026
|
return '';
|
|
@@ -997,14 +1063,32 @@ class BaseQuery {
|
|
|
997
1063
|
}
|
|
998
1064
|
return ` ORDER BY ${orderByString}`;
|
|
999
1065
|
}
|
|
1066
|
+
/**
|
|
1067
|
+
* Returns a complete list of the aliased dimensions, including time
|
|
1068
|
+
* dimensions.
|
|
1069
|
+
* @returns {Array<string>}
|
|
1070
|
+
*/
|
|
1000
1071
|
dimensionAliasNames() {
|
|
1001
1072
|
return ramda_1.default.flatten(this.dimensionsForSelect().map(d => d.aliasName()).filter(d => !!d));
|
|
1002
1073
|
}
|
|
1074
|
+
/**
|
|
1075
|
+
* Returns an array of column names correlated to the specified cube dimensions.
|
|
1076
|
+
* @param {string} cubeAlias
|
|
1077
|
+
* @returns {Array<string>}
|
|
1078
|
+
*/
|
|
1003
1079
|
dimensionColumns(cubeAlias) {
|
|
1004
1080
|
return this.dimensionAliasNames().map(alias => `${cubeAlias && `${cubeAlias}.` || ''}${alias}`);
|
|
1005
1081
|
}
|
|
1006
1082
|
groupByDimensionLimit() {
|
|
1007
|
-
|
|
1083
|
+
let limitClause = '';
|
|
1084
|
+
if (this.rowLimit !== null) {
|
|
1085
|
+
if (this.rowLimit === shared_1.MAX_SOURCE_ROW_LIMIT) {
|
|
1086
|
+
limitClause = ` LIMIT ${this.paramAllocator.allocateParam(shared_1.MAX_SOURCE_ROW_LIMIT)}`;
|
|
1087
|
+
}
|
|
1088
|
+
else {
|
|
1089
|
+
limitClause = ` LIMIT ${this.rowLimit && parseInt(this.rowLimit, 10) || 10000}`;
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1008
1092
|
const offsetClause = this.offset ? ` OFFSET ${parseInt(this.offset, 10)}` : '';
|
|
1009
1093
|
return `${limitClause}${offsetClause}`;
|
|
1010
1094
|
}
|
|
@@ -1020,6 +1104,10 @@ class BaseQuery {
|
|
|
1020
1104
|
forSelect() {
|
|
1021
1105
|
return this.dimensionsForSelect().concat(this.measures);
|
|
1022
1106
|
}
|
|
1107
|
+
/**
|
|
1108
|
+
* Returns a complete list of the dimensions, including time dimensions.
|
|
1109
|
+
* @returns {Array<BaseDimension>}
|
|
1110
|
+
*/
|
|
1023
1111
|
dimensionsForSelect() {
|
|
1024
1112
|
return this.dimensions.concat(this.timeDimensions);
|
|
1025
1113
|
}
|
|
@@ -1573,7 +1661,7 @@ class BaseQuery {
|
|
|
1573
1661
|
throw new UserError_1.UserError(`Unknown pre-aggregation type '${preAggregation.type}' in '${cube}'`);
|
|
1574
1662
|
}, { inputProps: { collectOriginalSqlPreAggregations: [] }, cache: this.queryCache });
|
|
1575
1663
|
}
|
|
1576
|
-
preAggregationReadOnly(
|
|
1664
|
+
preAggregationReadOnly(_cube, _preAggregation) {
|
|
1577
1665
|
return false;
|
|
1578
1666
|
}
|
|
1579
1667
|
// eslint-disable-next-line consistent-return
|