@cubejs-backend/schema-compiler 1.3.79 → 1.3.81
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/dist/src/adapter/BaseQuery.d.ts +32 -4
- package/dist/src/adapter/BaseQuery.d.ts.map +1 -1
- package/dist/src/adapter/BaseQuery.js +145 -71
- package/dist/src/adapter/BaseQuery.js.map +1 -1
- package/dist/src/adapter/BigqueryQuery.d.ts.map +1 -1
- package/dist/src/adapter/BigqueryQuery.js +0 -1
- package/dist/src/adapter/BigqueryQuery.js.map +1 -1
- package/dist/src/compiler/CubeSymbols.d.ts +7 -1
- package/dist/src/compiler/CubeSymbols.d.ts.map +1 -1
- package/dist/src/compiler/CubeSymbols.js +6 -0
- package/dist/src/compiler/CubeSymbols.js.map +1 -1
- package/dist/src/compiler/DataSchemaCompiler.js +1 -1
- package/dist/src/compiler/DataSchemaCompiler.js.map +1 -1
- package/package.json +6 -6
|
@@ -135,6 +135,14 @@ export class BaseQuery {
|
|
|
135
135
|
neverUseSqlPlannerPreaggregation(): boolean;
|
|
136
136
|
prebuildJoin(): void;
|
|
137
137
|
joinGraphPaths: Record<string, string[]> | undefined;
|
|
138
|
+
/**
|
|
139
|
+
* Is used by native
|
|
140
|
+
* This function follows the same logic as in this.collectJoinHints()
|
|
141
|
+
* @private
|
|
142
|
+
* @param {Array<(Array<string> | string)>} hints
|
|
143
|
+
* @return {import('../compiler/JoinGraph').FinishedJoinTree}
|
|
144
|
+
*/
|
|
145
|
+
private joinTreeForHints;
|
|
138
146
|
cacheValue(key: any, fn: any, { contextPropNames, inputProps, cache }?: {
|
|
139
147
|
contextPropNames: any;
|
|
140
148
|
inputProps: any;
|
|
@@ -147,7 +155,19 @@ export class BaseQuery {
|
|
|
147
155
|
* @returns {Array<string | Array<string>>}
|
|
148
156
|
*/
|
|
149
157
|
get allJoinHints(): (string | string[])[];
|
|
150
|
-
collectedJoinHints:
|
|
158
|
+
collectedJoinHints: (string | string[])[] | undefined;
|
|
159
|
+
/**
|
|
160
|
+
* @private
|
|
161
|
+
* @return { Record<string, string[][]>}
|
|
162
|
+
*/
|
|
163
|
+
private queryJoinMap;
|
|
164
|
+
/**
|
|
165
|
+
* @private
|
|
166
|
+
* @param { (string|string[])[] } hints
|
|
167
|
+
* @param { Record<string, string[][]>} joinMap
|
|
168
|
+
* @return {(string|string[])[]}
|
|
169
|
+
*/
|
|
170
|
+
private enrichHintsWithJoinMap;
|
|
151
171
|
get dataSource(): string;
|
|
152
172
|
cubeDataSource(cube: any): string;
|
|
153
173
|
get aliasNameToMember(): {
|
|
@@ -459,11 +479,19 @@ export class BaseQuery {
|
|
|
459
479
|
*/
|
|
460
480
|
collectCubeNames(): Array<string>;
|
|
461
481
|
/**
|
|
462
|
-
*
|
|
482
|
+
* Just a helper to avoid copy/paste
|
|
483
|
+
* @private
|
|
484
|
+
* @param {import('../compiler/JoinGraph').FinishedJoinTree} a
|
|
485
|
+
* @param {import('../compiler/JoinGraph').FinishedJoinTree} b
|
|
486
|
+
* @return {boolean}
|
|
487
|
+
*/
|
|
488
|
+
private isJoinTreesEqual;
|
|
489
|
+
/**
|
|
490
|
+
* @private
|
|
463
491
|
* @param {boolean} [excludeTimeDimensions=false]
|
|
464
|
-
* @returns {Array<Array<string
|
|
492
|
+
* @returns {Array<(Array<string> | string)>}
|
|
465
493
|
*/
|
|
466
|
-
collectJoinHints
|
|
494
|
+
private collectJoinHints;
|
|
467
495
|
joinMembersFromCustomSubQuery(): {
|
|
468
496
|
getMembers: () => {
|
|
469
497
|
path: () => null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseQuery.d.ts","sourceRoot":"","sources":["../../../src/adapter/BaseQuery.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BaseQuery.d.ts","sourceRoot":"","sources":["../../../src/adapter/BaseQuery.js"],"names":[],"mappings":"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"}
|
|
@@ -348,12 +348,50 @@ class BaseQuery {
|
|
|
348
348
|
}
|
|
349
349
|
}
|
|
350
350
|
}
|
|
351
|
+
/**
|
|
352
|
+
* Is used by native
|
|
353
|
+
* This function follows the same logic as in this.collectJoinHints()
|
|
354
|
+
* @private
|
|
355
|
+
* @param {Array<(Array<string> | string)>} hints
|
|
356
|
+
* @return {import('../compiler/JoinGraph').FinishedJoinTree}
|
|
357
|
+
*/
|
|
358
|
+
joinTreeForHints(hints) {
|
|
359
|
+
const explicitJoinHintMembers = new Set(hints.filter(j => Array.isArray(j)).flat());
|
|
360
|
+
const queryJoinMaps = this.queryJoinMap();
|
|
361
|
+
const newCollectedHints = [];
|
|
362
|
+
const constructJH = () => ramda_1.default.uniq(this.enrichHintsWithJoinMap([
|
|
363
|
+
...newCollectedHints,
|
|
364
|
+
...hints,
|
|
365
|
+
], queryJoinMaps));
|
|
366
|
+
let prevJoin = null;
|
|
367
|
+
let newJoin = null;
|
|
368
|
+
// Safeguard against infinite loop in case of cyclic joins somehow managed to slip through
|
|
369
|
+
let cnt = 0;
|
|
370
|
+
let newJoinHintsCollectedCnt;
|
|
371
|
+
do {
|
|
372
|
+
const allJoinHints = constructJH();
|
|
373
|
+
prevJoin = newJoin;
|
|
374
|
+
newJoin = this.joinGraph.buildJoin(allJoinHints);
|
|
375
|
+
const allJoinHintsFlatten = new Set(allJoinHints.flat());
|
|
376
|
+
const joinMembersJoinHints = this.collectJoinHintsFromMembers(this.joinMembersFromJoin(newJoin));
|
|
377
|
+
const iterationCollectedHints = joinMembersJoinHints.filter(j => !allJoinHintsFlatten.has(j));
|
|
378
|
+
newJoinHintsCollectedCnt = iterationCollectedHints.length;
|
|
379
|
+
cnt++;
|
|
380
|
+
if (newJoin) {
|
|
381
|
+
newCollectedHints.push(...joinMembersJoinHints.filter(j => !explicitJoinHintMembers.has(j)));
|
|
382
|
+
}
|
|
383
|
+
} while (newJoin?.joins.length > 0 && !this.isJoinTreesEqual(prevJoin, newJoin) && cnt < 10000 && newJoinHintsCollectedCnt > 0);
|
|
384
|
+
if (cnt >= 10000) {
|
|
385
|
+
throw new UserError_1.UserError('Can not construct joins for the query, potential loop detected');
|
|
386
|
+
}
|
|
387
|
+
return newJoin;
|
|
388
|
+
}
|
|
351
389
|
cacheValue(key, fn, { contextPropNames, inputProps, cache } = {}) {
|
|
352
390
|
const currentContext = this.safeEvaluateSymbolContext();
|
|
353
391
|
if (contextPropNames) {
|
|
354
392
|
const contextKey = {};
|
|
355
|
-
for (
|
|
356
|
-
contextKey[
|
|
393
|
+
for (const element of contextPropNames) {
|
|
394
|
+
contextKey[element] = currentContext[element];
|
|
357
395
|
}
|
|
358
396
|
key = key.concat([JSON.stringify(contextKey)]);
|
|
359
397
|
}
|
|
@@ -393,70 +431,48 @@ class BaseQuery {
|
|
|
393
431
|
*/
|
|
394
432
|
get allJoinHints() {
|
|
395
433
|
if (!this.collectedJoinHints) {
|
|
396
|
-
|
|
397
|
-
const customSubQueryJoinHints = this.collectJoinHintsFromMembers(this.joinMembersFromCustomSubQuery());
|
|
398
|
-
let joinMembersJoinHints = this.collectJoinHintsFromMembers(this.joinMembersFromJoin(this.join));
|
|
399
|
-
// One cube may join the other cube via transitive joined cubes,
|
|
400
|
-
// members from which are referenced in the join `on` clauses.
|
|
401
|
-
// We need to collect such join hints and push them upfront of the joining one
|
|
402
|
-
// but only if they don't exist yet. Cause in other case we might affect what
|
|
403
|
-
// join path will be constructed in join graph.
|
|
404
|
-
// It is important to use queryLevelJoinHints during the calculation if it is set.
|
|
405
|
-
const constructJH = () => {
|
|
406
|
-
const filteredJoinMembersJoinHints = joinMembersJoinHints.filter(m => !allMembersJoinHints.includes(m));
|
|
407
|
-
return [
|
|
408
|
-
...this.queryLevelJoinHints,
|
|
409
|
-
...(rootOfJoin ? [rootOfJoin] : []),
|
|
410
|
-
...filteredJoinMembersJoinHints,
|
|
411
|
-
...allMembersJoinHints,
|
|
412
|
-
...customSubQueryJoinHints,
|
|
413
|
-
];
|
|
414
|
-
};
|
|
415
|
-
let prevJoins = this.join;
|
|
416
|
-
let prevJoinMembersJoinHints = joinMembersJoinHints;
|
|
417
|
-
let newJoin = this.joinGraph.buildJoin(constructJH());
|
|
418
|
-
const isOrderPreserved = (base, updated) => {
|
|
419
|
-
const common = base.filter(value => updated.includes(value));
|
|
420
|
-
const bFiltered = updated.filter(value => common.includes(value));
|
|
421
|
-
return common.every((x, i) => x === bFiltered[i]);
|
|
422
|
-
};
|
|
423
|
-
const isJoinTreesEqual = (a, b) => {
|
|
424
|
-
if (!a || !b || a.root !== b.root || a.joins.length !== b.joins.length) {
|
|
425
|
-
return false;
|
|
426
|
-
}
|
|
427
|
-
// We don't care about the order of joins on the same level, so
|
|
428
|
-
// we can compare them as sets.
|
|
429
|
-
const aJoinsSet = new Set(a.joins.map(j => `${j.originalFrom}->${j.originalTo}`));
|
|
430
|
-
const bJoinsSet = new Set(b.joins.map(j => `${j.originalFrom}->${j.originalTo}`));
|
|
431
|
-
if (aJoinsSet.size !== bJoinsSet.size) {
|
|
432
|
-
return false;
|
|
433
|
-
}
|
|
434
|
-
for (const val of aJoinsSet) {
|
|
435
|
-
if (!bJoinsSet.has(val)) {
|
|
436
|
-
return false;
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
return true;
|
|
440
|
-
};
|
|
441
|
-
// Safeguard against infinite loop in case of cyclic joins somehow managed to slip through
|
|
442
|
-
let cnt = 0;
|
|
443
|
-
while (newJoin?.joins.length > 0 && !isJoinTreesEqual(prevJoins, newJoin) && cnt < 10000) {
|
|
444
|
-
prevJoins = newJoin;
|
|
445
|
-
joinMembersJoinHints = this.collectJoinHintsFromMembers(this.joinMembersFromJoin(newJoin));
|
|
446
|
-
if (!isOrderPreserved(prevJoinMembersJoinHints, joinMembersJoinHints)) {
|
|
447
|
-
throw new UserError_1.UserError(`Can not construct joins for the query, potential loop detected: ${prevJoinMembersJoinHints.join('->')} vs ${joinMembersJoinHints.join('->')}`);
|
|
448
|
-
}
|
|
449
|
-
newJoin = this.joinGraph.buildJoin(constructJH());
|
|
450
|
-
prevJoinMembersJoinHints = joinMembersJoinHints;
|
|
451
|
-
cnt++;
|
|
452
|
-
}
|
|
453
|
-
if (cnt >= 10000) {
|
|
454
|
-
throw new UserError_1.UserError('Can not construct joins for the query, potential loop detected');
|
|
455
|
-
}
|
|
456
|
-
this.collectedJoinHints = ramda_1.default.uniq(constructJH());
|
|
434
|
+
this.collectedJoinHints = this.collectJoinHints();
|
|
457
435
|
}
|
|
458
436
|
return this.collectedJoinHints;
|
|
459
437
|
}
|
|
438
|
+
/**
|
|
439
|
+
* @private
|
|
440
|
+
* @return { Record<string, string[][]>}
|
|
441
|
+
*/
|
|
442
|
+
queryJoinMap() {
|
|
443
|
+
const queryMembers = this.allMembersConcat(false);
|
|
444
|
+
const joinMaps = {};
|
|
445
|
+
for (const member of queryMembers) {
|
|
446
|
+
const memberCube = member.cube?.();
|
|
447
|
+
if (memberCube?.isView && !joinMaps[memberCube.name] && memberCube.joinMap) {
|
|
448
|
+
joinMaps[memberCube.name] = memberCube.joinMap;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
return joinMaps;
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* @private
|
|
455
|
+
* @param { (string|string[])[] } hints
|
|
456
|
+
* @param { Record<string, string[][]>} joinMap
|
|
457
|
+
* @return {(string|string[])[]}
|
|
458
|
+
*/
|
|
459
|
+
enrichHintsWithJoinMap(hints, joinMap) {
|
|
460
|
+
// Potentially, if joins between views would take place, we need to distinguish
|
|
461
|
+
// join maps on per view basis.
|
|
462
|
+
const allPaths = Object.values(joinMap).flat();
|
|
463
|
+
return hints.map(hint => {
|
|
464
|
+
if (Array.isArray(hint)) {
|
|
465
|
+
return hint;
|
|
466
|
+
}
|
|
467
|
+
for (const path of allPaths) {
|
|
468
|
+
const hintIndex = path.indexOf(hint);
|
|
469
|
+
if (hintIndex !== -1) {
|
|
470
|
+
return path.slice(0, hintIndex + 1);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
return hint;
|
|
474
|
+
});
|
|
475
|
+
}
|
|
460
476
|
get dataSource() {
|
|
461
477
|
const dataSources = ramda_1.default.uniq(this.allCubeNames.map(c => this.cubeDataSource(c)));
|
|
462
478
|
if (dataSources.length > 1 && !this.externalPreAggregationQuery()) {
|
|
@@ -2020,17 +2036,75 @@ class BaseQuery {
|
|
|
2020
2036
|
return this.collectFromMembers(false, this.collectCubeNamesFor.bind(this), 'collectCubeNamesFor');
|
|
2021
2037
|
}
|
|
2022
2038
|
/**
|
|
2023
|
-
*
|
|
2039
|
+
* Just a helper to avoid copy/paste
|
|
2040
|
+
* @private
|
|
2041
|
+
* @param {import('../compiler/JoinGraph').FinishedJoinTree} a
|
|
2042
|
+
* @param {import('../compiler/JoinGraph').FinishedJoinTree} b
|
|
2043
|
+
* @return {boolean}
|
|
2044
|
+
*/
|
|
2045
|
+
isJoinTreesEqual(a, b) {
|
|
2046
|
+
if (!a || !b || a.root !== b.root || a.joins.length !== b.joins.length) {
|
|
2047
|
+
return false;
|
|
2048
|
+
}
|
|
2049
|
+
// We don't care about the order of joins on the same level, so
|
|
2050
|
+
// we can compare them as sets.
|
|
2051
|
+
const aJoinsSet = new Set(a.joins.map(j => `${j.originalFrom}->${j.originalTo}`));
|
|
2052
|
+
const bJoinsSet = new Set(b.joins.map(j => `${j.originalFrom}->${j.originalTo}`));
|
|
2053
|
+
if (aJoinsSet.size !== bJoinsSet.size) {
|
|
2054
|
+
return false;
|
|
2055
|
+
}
|
|
2056
|
+
for (const val of aJoinsSet) {
|
|
2057
|
+
if (!bJoinsSet.has(val)) {
|
|
2058
|
+
return false;
|
|
2059
|
+
}
|
|
2060
|
+
}
|
|
2061
|
+
return true;
|
|
2062
|
+
}
|
|
2063
|
+
/**
|
|
2064
|
+
* @private
|
|
2024
2065
|
* @param {boolean} [excludeTimeDimensions=false]
|
|
2025
|
-
* @returns {Array<Array<string
|
|
2066
|
+
* @returns {Array<(Array<string> | string)>}
|
|
2026
2067
|
*/
|
|
2027
2068
|
collectJoinHints(excludeTimeDimensions = false) {
|
|
2028
|
-
const
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
];
|
|
2033
|
-
|
|
2069
|
+
const allMembersJoinHints = this.collectJoinHintsFromMembers(this.allMembersConcat(excludeTimeDimensions));
|
|
2070
|
+
const explicitJoinHintMembers = new Set(allMembersJoinHints.filter(j => Array.isArray(j)).flat());
|
|
2071
|
+
const queryJoinMaps = this.queryJoinMap();
|
|
2072
|
+
const customSubQueryJoinHints = this.collectJoinHintsFromMembers(this.joinMembersFromCustomSubQuery());
|
|
2073
|
+
const newCollectedHints = [];
|
|
2074
|
+
// One cube may join the other cube via transitive joined cubes,
|
|
2075
|
+
// members from which are referenced in the join `on` clauses.
|
|
2076
|
+
// We need to collect such join hints and push them upfront of the joining one
|
|
2077
|
+
// but only if they don't exist yet. Cause in other case we might affect what
|
|
2078
|
+
// join path will be constructed in join graph.
|
|
2079
|
+
// It is important to use queryLevelJoinHints during the calculation if it is set.
|
|
2080
|
+
const constructJH = () => ramda_1.default.uniq(this.enrichHintsWithJoinMap([
|
|
2081
|
+
...this.queryLevelJoinHints,
|
|
2082
|
+
...newCollectedHints,
|
|
2083
|
+
...allMembersJoinHints,
|
|
2084
|
+
...customSubQueryJoinHints,
|
|
2085
|
+
], queryJoinMaps));
|
|
2086
|
+
let prevJoin = null;
|
|
2087
|
+
let newJoin = null;
|
|
2088
|
+
// Safeguard against infinite loop in case of cyclic joins somehow managed to slip through
|
|
2089
|
+
let cnt = 0;
|
|
2090
|
+
let newJoinHintsCollectedCnt;
|
|
2091
|
+
do {
|
|
2092
|
+
const allJoinHints = constructJH();
|
|
2093
|
+
prevJoin = newJoin;
|
|
2094
|
+
newJoin = this.joinGraph.buildJoin(allJoinHints);
|
|
2095
|
+
const allJoinHintsFlatten = new Set(allJoinHints.flat());
|
|
2096
|
+
const joinMembersJoinHints = this.collectJoinHintsFromMembers(this.joinMembersFromJoin(newJoin));
|
|
2097
|
+
const iterationCollectedHints = joinMembersJoinHints.filter(j => !allJoinHintsFlatten.has(j));
|
|
2098
|
+
newJoinHintsCollectedCnt = iterationCollectedHints.length;
|
|
2099
|
+
cnt++;
|
|
2100
|
+
if (newJoin) {
|
|
2101
|
+
newCollectedHints.push(...joinMembersJoinHints.filter(j => !explicitJoinHintMembers.has(j)));
|
|
2102
|
+
}
|
|
2103
|
+
} while (newJoin?.joins.length > 0 && !this.isJoinTreesEqual(prevJoin, newJoin) && cnt < 10000 && newJoinHintsCollectedCnt > 0);
|
|
2104
|
+
if (cnt >= 10000) {
|
|
2105
|
+
throw new UserError_1.UserError('Can not construct joins for the query, potential loop detected');
|
|
2106
|
+
}
|
|
2107
|
+
return constructJH();
|
|
2034
2108
|
}
|
|
2035
2109
|
joinMembersFromCustomSubQuery() {
|
|
2036
2110
|
return this.customSubQueryJoins.map(j => {
|