@cubejs-backend/schema-compiler 1.2.30 → 1.2.31
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/BaseMeasure.d.ts +7 -2
- package/dist/src/adapter/BaseMeasure.d.ts.map +1 -1
- package/dist/src/adapter/BaseMeasure.js +86 -0
- package/dist/src/adapter/BaseMeasure.js.map +1 -1
- package/dist/src/adapter/BaseQuery.d.ts +2 -2
- package/dist/src/adapter/BaseQuery.d.ts.map +1 -1
- package/dist/src/adapter/BaseQuery.js +13 -3
- 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 +11 -3
- package/dist/src/adapter/BigqueryQuery.js.map +1 -1
- package/dist/src/compiler/CompilerCache.d.ts +1 -1
- package/dist/src/compiler/CompilerCache.d.ts.map +1 -1
- package/dist/src/compiler/CompilerCache.js +5 -8
- package/dist/src/compiler/CompilerCache.js.map +1 -1
- package/dist/src/compiler/ContextEvaluator.d.ts +1 -1
- package/dist/src/compiler/CubeEvaluator.d.ts +47 -43
- package/dist/src/compiler/CubeEvaluator.d.ts.map +1 -1
- package/dist/src/compiler/CubeEvaluator.js +2 -3
- package/dist/src/compiler/CubeEvaluator.js.map +1 -1
- package/dist/src/compiler/CubeSymbols.d.ts +16 -5
- package/dist/src/compiler/CubeSymbols.d.ts.map +1 -1
- package/dist/src/compiler/CubeSymbols.js +11 -2
- package/dist/src/compiler/CubeSymbols.js.map +1 -1
- package/dist/src/compiler/DataSchemaCompiler.d.ts +2 -0
- package/dist/src/compiler/DataSchemaCompiler.d.ts.map +1 -1
- package/dist/src/compiler/DataSchemaCompiler.js +13 -1
- package/dist/src/compiler/DataSchemaCompiler.js.map +1 -1
- package/dist/src/compiler/DynamicReference.d.ts +4 -4
- package/dist/src/compiler/DynamicReference.d.ts.map +1 -1
- package/dist/src/compiler/DynamicReference.js +2 -0
- package/dist/src/compiler/DynamicReference.js.map +1 -1
- package/dist/src/compiler/PrepareCompiler.d.ts +4 -0
- package/dist/src/compiler/PrepareCompiler.d.ts.map +1 -1
- package/dist/src/compiler/PrepareCompiler.js +3 -0
- package/dist/src/compiler/PrepareCompiler.js.map +1 -1
- package/dist/src/extensions/Reflection.d.ts +1 -1
- package/dist/src/extensions/Reflection.d.ts.map +1 -1
- package/package.json +10 -10
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { BaseQuery } from './BaseQuery';
|
|
2
|
+
import { MeasureDefinition } from "../compiler/CubeEvaluator";
|
|
2
3
|
export declare class BaseMeasure {
|
|
3
4
|
protected readonly query: BaseQuery;
|
|
4
5
|
readonly measure: any;
|
|
@@ -6,6 +7,10 @@ export declare class BaseMeasure {
|
|
|
6
7
|
readonly expressionCubeName: any;
|
|
7
8
|
readonly expressionName: any;
|
|
8
9
|
readonly isMemberExpression: boolean;
|
|
10
|
+
protected readonly patchedMeasure: MeasureDefinition | null;
|
|
11
|
+
protected preparePatchedMeasure(sourceMeasure: string, newMeasureType: string | null, addFilters: Array<{
|
|
12
|
+
sql: Function;
|
|
13
|
+
}>): MeasureDefinition;
|
|
9
14
|
constructor(query: BaseQuery, measure: any);
|
|
10
15
|
getMembers(): this[];
|
|
11
16
|
selectColumns(): string[];
|
|
@@ -15,7 +20,7 @@ export declare class BaseMeasure {
|
|
|
15
20
|
measureSql(): any;
|
|
16
21
|
convertTzForRawTimeDimensionIfNeeded(sql: any): any;
|
|
17
22
|
cube(): any;
|
|
18
|
-
measureDefinition():
|
|
23
|
+
measureDefinition(): MeasureDefinition;
|
|
19
24
|
definition(): any;
|
|
20
25
|
aliasName(): string;
|
|
21
26
|
unescapedAliasName(): string;
|
|
@@ -27,7 +32,7 @@ export declare class BaseMeasure {
|
|
|
27
32
|
dateJoinCondition(): any;
|
|
28
33
|
windowGranularity(): any;
|
|
29
34
|
minGranularity(granularityA: string | undefined, granularityB: string | undefined): any;
|
|
30
|
-
granularityFromInterval(interval: string): "
|
|
35
|
+
granularityFromInterval(interval: string): "hour" | "day" | "week" | "month" | "year" | undefined;
|
|
31
36
|
shouldUngroupForCumulative(): any;
|
|
32
37
|
sqlDefinition(): Function;
|
|
33
38
|
path(): any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseMeasure.d.ts","sourceRoot":"","sources":["../../../src/adapter/BaseMeasure.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"BaseMeasure.d.ts","sourceRoot":"","sources":["../../../src/adapter/BaseMeasure.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,qBAAa,WAAW;IAwGpB,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS;aACnB,OAAO,EAAE,GAAG;IAxG9B,SAAgB,UAAU,EAAE,GAAG,CAAC;IAEhC,SAAgB,kBAAkB,EAAE,GAAG,CAAC;IAExC,SAAgB,cAAc,EAAE,GAAG,CAAC;IAEpC,SAAgB,kBAAkB,EAAE,OAAO,CAAS;IAEpD,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAEnE,SAAS,CAAC,qBAAqB,CAAC,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,QAAQ,CAAA;KAAC,CAAC,GAAG,iBAAiB;gBA6FvH,KAAK,EAAE,SAAS,EACnB,OAAO,EAAE,GAAG;IAmBvB,UAAU;IAIV,aAAa;IAIb,cAAc;IAId,uBAAuB;IAIvB,oBAAoB;IASpB,UAAU;IAQV,oCAAoC,CAAC,GAAG,KAAA;IAUxC,IAAI;IAOJ,iBAAiB;IAOjB,UAAU,IAAI,GAAG;IAcjB,SAAS;IAIT,kBAAkB;IAOlB,YAAY;IAOZ,YAAY;IAOZ,UAAU;WAYH,YAAY,CAAC,UAAU,KAAA;IAI9B,uBAAuB;IAWvB,iBAAiB;IAqBjB,iBAAiB;IAWjB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS;IAIjF,uBAAuB,CAAC,QAAQ,EAAE,MAAM;IAkBxC,0BAA0B;IAI1B,aAAa;IAIb,IAAI;IAOJ,cAAc;CAMtB"}
|
|
@@ -9,6 +9,83 @@ class BaseMeasure {
|
|
|
9
9
|
expressionCubeName;
|
|
10
10
|
expressionName;
|
|
11
11
|
isMemberExpression = false;
|
|
12
|
+
patchedMeasure = null;
|
|
13
|
+
preparePatchedMeasure(sourceMeasure, newMeasureType, addFilters) {
|
|
14
|
+
const source = this.query.cubeEvaluator.measureByPath(sourceMeasure);
|
|
15
|
+
let resultMeasureType = source.type;
|
|
16
|
+
if (newMeasureType !== null) {
|
|
17
|
+
switch (source.type) {
|
|
18
|
+
case 'sum':
|
|
19
|
+
case 'avg':
|
|
20
|
+
case 'min':
|
|
21
|
+
case 'max':
|
|
22
|
+
switch (newMeasureType) {
|
|
23
|
+
case 'sum':
|
|
24
|
+
case 'avg':
|
|
25
|
+
case 'min':
|
|
26
|
+
case 'max':
|
|
27
|
+
case 'count_distinct':
|
|
28
|
+
case 'count_distinct_approx':
|
|
29
|
+
// Can change from avg/... to count_distinct
|
|
30
|
+
// Latter does not care what input value is
|
|
31
|
+
// ok, do nothing
|
|
32
|
+
break;
|
|
33
|
+
default:
|
|
34
|
+
throw new UserError_1.UserError(`Unsupported measure type replacement for ${sourceMeasure}: ${source.type} => ${newMeasureType}`);
|
|
35
|
+
}
|
|
36
|
+
break;
|
|
37
|
+
case 'count_distinct':
|
|
38
|
+
case 'count_distinct_approx':
|
|
39
|
+
switch (newMeasureType) {
|
|
40
|
+
case 'count_distinct':
|
|
41
|
+
case 'count_distinct_approx':
|
|
42
|
+
// ok, do nothing
|
|
43
|
+
break;
|
|
44
|
+
default:
|
|
45
|
+
// Can not change from count_distinct to avg/...
|
|
46
|
+
// Latter do care what input value is, and original measure can be defined on strings
|
|
47
|
+
throw new UserError_1.UserError(`Unsupported measure type replacement for ${sourceMeasure}: ${source.type} => ${newMeasureType}`);
|
|
48
|
+
}
|
|
49
|
+
break;
|
|
50
|
+
default:
|
|
51
|
+
// Can not change from string, time, boolean, number
|
|
52
|
+
// Aggregation is already included in SQL, it's hard to patch that
|
|
53
|
+
// Can not change from count
|
|
54
|
+
// There's no SQL at all
|
|
55
|
+
throw new UserError_1.UserError(`Unsupported measure type replacement for ${sourceMeasure}: ${source.type} => ${newMeasureType}`);
|
|
56
|
+
}
|
|
57
|
+
resultMeasureType = newMeasureType;
|
|
58
|
+
}
|
|
59
|
+
const resultFilters = source.filters ?? [];
|
|
60
|
+
if (addFilters.length > 0) {
|
|
61
|
+
switch (resultMeasureType) {
|
|
62
|
+
case 'sum':
|
|
63
|
+
case 'avg':
|
|
64
|
+
case 'min':
|
|
65
|
+
case 'max':
|
|
66
|
+
case 'count':
|
|
67
|
+
case 'count_distinct':
|
|
68
|
+
case 'count_distinct_approx':
|
|
69
|
+
// ok, do nothing
|
|
70
|
+
break;
|
|
71
|
+
default:
|
|
72
|
+
// Can not add filters to string, time, boolean, number
|
|
73
|
+
// Aggregation is already included in SQL, it's hard to patch that
|
|
74
|
+
throw new UserError_1.UserError(`Unsupported additional filters for measure ${sourceMeasure} type ${source.type}`);
|
|
75
|
+
}
|
|
76
|
+
resultFilters.push(...addFilters);
|
|
77
|
+
}
|
|
78
|
+
const patchedFrom = this.query.cubeEvaluator.parsePath('measures', sourceMeasure);
|
|
79
|
+
return {
|
|
80
|
+
...source,
|
|
81
|
+
type: resultMeasureType,
|
|
82
|
+
filters: resultFilters,
|
|
83
|
+
patchedFrom: {
|
|
84
|
+
cubeName: patchedFrom[0],
|
|
85
|
+
name: patchedFrom[1],
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
12
89
|
constructor(query, measure) {
|
|
13
90
|
this.query = query;
|
|
14
91
|
this.measure = measure;
|
|
@@ -18,6 +95,9 @@ class BaseMeasure {
|
|
|
18
95
|
// In case of SQL push down expressionName doesn't contain cube name. It's just a column name.
|
|
19
96
|
this.expressionName = measure.expressionName || `${measure.cubeName}.${measure.name}`;
|
|
20
97
|
this.isMemberExpression = !!measure.definition;
|
|
98
|
+
if (measure.expression.type === 'PatchMeasure') {
|
|
99
|
+
this.patchedMeasure = this.preparePatchedMeasure(measure.expression.sourceMeasure, measure.expression.replaceAggregationType, measure.expression.addFilters);
|
|
100
|
+
}
|
|
21
101
|
}
|
|
22
102
|
}
|
|
23
103
|
getMembers() {
|
|
@@ -61,9 +141,15 @@ class BaseMeasure {
|
|
|
61
141
|
return this.query.cubeEvaluator.cubeFromPath(this.measure);
|
|
62
142
|
}
|
|
63
143
|
measureDefinition() {
|
|
144
|
+
if (this.patchedMeasure) {
|
|
145
|
+
return this.patchedMeasure;
|
|
146
|
+
}
|
|
64
147
|
return this.query.cubeEvaluator.measureByPath(this.measure);
|
|
65
148
|
}
|
|
66
149
|
definition() {
|
|
150
|
+
if (this.patchedMeasure) {
|
|
151
|
+
return this.patchedMeasure;
|
|
152
|
+
}
|
|
67
153
|
if (this.expression) {
|
|
68
154
|
return {
|
|
69
155
|
sql: this.expression,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseMeasure.js","sourceRoot":"","sources":["../../../src/adapter/BaseMeasure.ts"],"names":[],"mappings":";;;AAAA,qDAAkD;
|
|
1
|
+
{"version":3,"file":"BaseMeasure.js","sourceRoot":"","sources":["../../../src/adapter/BaseMeasure.ts"],"names":[],"mappings":"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"}
|
|
@@ -445,7 +445,7 @@ export class BaseQuery {
|
|
|
445
445
|
castToString(sql: any): string;
|
|
446
446
|
countDistinctApprox(sql: any): void;
|
|
447
447
|
primaryKeyCount(cubeName: any, distinct: any): any;
|
|
448
|
-
renderDimensionCase(symbol: any, cubeName: any):
|
|
448
|
+
renderDimensionCase(symbol: any, cubeName: any): any;
|
|
449
449
|
renderDimensionCaseLabel(label: any, cubeName: any): any;
|
|
450
450
|
caseWhenStatement(when: any, elseLabel: any): string;
|
|
451
451
|
applyMeasureFilters(evaluateSql: any, symbol: any, cubeName: any): any;
|
|
@@ -543,7 +543,7 @@ export class BaseQuery {
|
|
|
543
543
|
dayOffset: number;
|
|
544
544
|
};
|
|
545
545
|
everyRefreshKeySql(refreshKey: any, external?: boolean): any;
|
|
546
|
-
granularityFor(momentDate: any): "
|
|
546
|
+
granularityFor(momentDate: any): "hour" | "day" | "week" | "month" | "year" | "minute" | "second";
|
|
547
547
|
/**
|
|
548
548
|
* @protected
|
|
549
549
|
* @param {string} interval
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseQuery.d.ts","sourceRoot":"","sources":["../../../src/adapter/BaseQuery.js"],"names":[],"mappings":"AA2DA;;;;;;;;;;GAUG;AAEH;;;;GAIG;AAEH;;;;;GAKG;AAEH;;GAEG;AAEH;;;;;;;;;;;;GAYG;AACH;
|
|
1
|
+
{"version":3,"file":"BaseQuery.d.ts","sourceRoot":"","sources":["../../../src/adapter/BaseQuery.js"],"names":[],"mappings":"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"}
|
|
@@ -1624,9 +1624,16 @@ class BaseQuery {
|
|
|
1624
1624
|
return `(${evaluatedSql})`;
|
|
1625
1625
|
}
|
|
1626
1626
|
traverseSymbol(s) {
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
this.
|
|
1627
|
+
// TODO why not just evaluateSymbolSql for every branch?
|
|
1628
|
+
if (s.path()) {
|
|
1629
|
+
return [s.cube().name].concat(this.evaluateSymbolSql(s.path()[0], s.path()[1], s.definition()));
|
|
1630
|
+
}
|
|
1631
|
+
else if (s.patchedMeasure?.patchedFrom) {
|
|
1632
|
+
return [s.patchedMeasure.patchedFrom.cubeName].concat(this.evaluateSymbolSql(s.patchedMeasure.patchedFrom.cubeName, s.patchedMeasure.patchedFrom.name, s.definition()));
|
|
1633
|
+
}
|
|
1634
|
+
else {
|
|
1635
|
+
return this.evaluateSql(s.cube().name, s.definition().sql);
|
|
1636
|
+
}
|
|
1630
1637
|
}
|
|
1631
1638
|
collectCubeNames(excludeTimeDimensions) {
|
|
1632
1639
|
return this.collectFromMembers(excludeTimeDimensions, this.collectCubeNamesFor.bind(this), 'collectCubeNamesFor');
|
|
@@ -1888,6 +1895,9 @@ class BaseQuery {
|
|
|
1888
1895
|
if (!memberExpressionType) {
|
|
1889
1896
|
this.pushMemberNameForCollectionIfNecessary(cubeName, name);
|
|
1890
1897
|
}
|
|
1898
|
+
if (symbol.patchedFrom) {
|
|
1899
|
+
this.pushMemberNameForCollectionIfNecessary(symbol.patchedFrom.cubeName, symbol.patchedFrom.name);
|
|
1900
|
+
}
|
|
1891
1901
|
const memberPathArray = [cubeName, name];
|
|
1892
1902
|
// Member path needs to be expanded to granularity if subPropertyName is provided.
|
|
1893
1903
|
// Without this: infinite recursion with maximum call stack size exceeded.
|