@cubejs-backend/schema-compiler 1.7.34 → 1.7.36
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/BaseDimension.d.ts +1 -1
- package/dist/src/adapter/BaseDimension.js.map +1 -1
- package/dist/src/adapter/BaseFilter.js.map +1 -1
- package/dist/src/adapter/BaseGroupFilter.js.map +1 -1
- package/dist/src/adapter/BaseMeasure.d.ts +1 -1
- package/dist/src/adapter/BaseMeasure.js.map +1 -1
- package/dist/src/adapter/BaseQuery.d.ts +47 -41
- package/dist/src/adapter/BaseQuery.d.ts.map +1 -1
- package/dist/src/adapter/BaseQuery.js +91 -43
- package/dist/src/adapter/BaseQuery.js.map +1 -1
- package/dist/src/adapter/BaseSegment.js.map +1 -1
- package/dist/src/adapter/BaseTimeDimension.d.ts +1 -1
- package/dist/src/adapter/BaseTimeDimension.js.map +1 -1
- package/dist/src/adapter/BigqueryQuery.d.ts +8 -1
- package/dist/src/adapter/BigqueryQuery.d.ts.map +1 -1
- package/dist/src/adapter/BigqueryQuery.js.map +1 -1
- package/dist/src/adapter/ClickHouseQuery.d.ts +7 -1
- package/dist/src/adapter/ClickHouseQuery.d.ts.map +1 -1
- package/dist/src/adapter/ClickHouseQuery.js.map +1 -1
- package/dist/src/adapter/CubeStoreQuery.d.ts +5 -1
- package/dist/src/adapter/CubeStoreQuery.d.ts.map +1 -1
- package/dist/src/adapter/CubeStoreQuery.js.map +1 -1
- package/dist/src/adapter/Granularity.js.map +1 -1
- package/dist/src/adapter/HiveQuery.js.map +1 -1
- package/dist/src/adapter/MemberSqlTemplateCompiler.d.ts.map +1 -1
- package/dist/src/adapter/MemberSqlTemplateCompiler.js +49 -17
- package/dist/src/adapter/MemberSqlTemplateCompiler.js.map +1 -1
- package/dist/src/adapter/MongoBiQuery.js.map +1 -1
- package/dist/src/adapter/MssqlQuery.d.ts +6 -1
- package/dist/src/adapter/MssqlQuery.d.ts.map +1 -1
- package/dist/src/adapter/MssqlQuery.js +1 -1
- package/dist/src/adapter/MssqlQuery.js.map +1 -1
- package/dist/src/adapter/MysqlQuery.d.ts +6 -1
- package/dist/src/adapter/MysqlQuery.d.ts.map +1 -1
- package/dist/src/adapter/MysqlQuery.js.map +1 -1
- package/dist/src/adapter/OracleQuery.d.ts +10 -1
- package/dist/src/adapter/OracleQuery.d.ts.map +1 -1
- package/dist/src/adapter/OracleQuery.js.map +1 -1
- package/dist/src/adapter/ParamAllocator.js.map +1 -1
- package/dist/src/adapter/PostgresQuery.js.map +1 -1
- package/dist/src/adapter/PreAggregations.d.ts +7 -1
- package/dist/src/adapter/PreAggregations.d.ts.map +1 -1
- package/dist/src/adapter/PreAggregations.js +18 -5
- package/dist/src/adapter/PreAggregations.js.map +1 -1
- package/dist/src/adapter/PrestodbQuery.d.ts +7 -1
- package/dist/src/adapter/PrestodbQuery.d.ts.map +1 -1
- package/dist/src/adapter/PrestodbQuery.js.map +1 -1
- package/dist/src/adapter/QueryBuilder.d.ts.map +1 -1
- package/dist/src/adapter/QueryBuilder.js.map +1 -1
- package/dist/src/adapter/QueryCache.js.map +1 -1
- package/dist/src/adapter/QueryFactory.js.map +1 -1
- package/dist/src/adapter/RedshiftQuery.js.map +1 -1
- package/dist/src/adapter/SnowflakeQuery.d.ts +18 -1
- package/dist/src/adapter/SnowflakeQuery.d.ts.map +1 -1
- package/dist/src/adapter/SnowflakeQuery.js +40 -0
- package/dist/src/adapter/SnowflakeQuery.js.map +1 -1
- package/dist/src/adapter/SqliteQuery.d.ts +6 -1
- package/dist/src/adapter/SqliteQuery.d.ts.map +1 -1
- package/dist/src/adapter/windows-iana.js +1 -2
- package/dist/src/adapter/windows-iana.js.map +1 -1
- package/dist/src/compiler/CompileError.d.ts.map +1 -1
- package/dist/src/compiler/CompilerCache.js.map +1 -1
- package/dist/src/compiler/ContextEvaluator.js.map +1 -1
- package/dist/src/compiler/CubeDictionary.js.map +1 -1
- package/dist/src/compiler/CubeEvaluator.js.map +1 -1
- package/dist/src/compiler/CubeSymbols.d.ts +5 -5
- package/dist/src/compiler/CubeSymbols.d.ts.map +1 -1
- package/dist/src/compiler/CubeSymbols.js +1 -1
- package/dist/src/compiler/CubeSymbols.js.map +1 -1
- package/dist/src/compiler/CubeToMetaTransformer.js.map +1 -1
- package/dist/src/compiler/CubeValidator.js +29 -29
- package/dist/src/compiler/CubeValidator.js.map +1 -1
- package/dist/src/compiler/DataSchemaCompiler.d.ts +0 -1
- package/dist/src/compiler/DataSchemaCompiler.d.ts.map +1 -1
- package/dist/src/compiler/DataSchemaCompiler.js.map +1 -1
- package/dist/src/compiler/ErrorReporter.js.map +1 -1
- package/dist/src/compiler/JoinGraph.js.map +1 -1
- package/dist/src/compiler/PrepareCompiler.d.ts +0 -1
- package/dist/src/compiler/PrepareCompiler.d.ts.map +1 -1
- package/dist/src/compiler/PrepareCompiler.js.map +1 -1
- package/dist/src/compiler/ViewCompilationGate.js.map +1 -1
- package/dist/src/compiler/ViewGroupEvaluator.js.map +1 -1
- package/dist/src/compiler/YamlCompiler.js +17 -7
- package/dist/src/compiler/YamlCompiler.js.map +1 -1
- package/dist/src/compiler/converters/CubePreAggregationConverter.js +17 -7
- package/dist/src/compiler/converters/CubePreAggregationConverter.js.map +1 -1
- package/dist/src/compiler/converters/CubeSchemaConverter.js +17 -7
- package/dist/src/compiler/converters/CubeSchemaConverter.js.map +1 -1
- package/dist/src/compiler/named-numeric-formats.js +2 -2
- package/dist/src/compiler/named-numeric-formats.js.map +1 -1
- package/dist/src/compiler/transpilers/CubeCheckDuplicatePropTranspiler.js.map +1 -1
- package/dist/src/compiler/transpilers/CubePropContextTranspiler.js +17 -7
- package/dist/src/compiler/transpilers/CubePropContextTranspiler.js.map +1 -1
- package/dist/src/compiler/transpilers/IIFETranspiler.js +17 -7
- package/dist/src/compiler/transpilers/IIFETranspiler.js.map +1 -1
- package/dist/src/compiler/transpilers/ImportExportTranspiler.js +17 -7
- package/dist/src/compiler/transpilers/ImportExportTranspiler.js.map +1 -1
- package/dist/src/compiler/transpilers/LightweightSymbolResolver.js.map +1 -1
- package/dist/src/compiler/transpilers/ValidationTranspiler.js.map +1 -1
- package/dist/src/compiler/transpilers/transpiler_worker.js.map +1 -1
- package/dist/src/compiler/utils.js +1 -2
- package/dist/src/compiler/utils.js.map +1 -1
- package/dist/src/extensions/Funnels.js.map +1 -1
- package/dist/src/extensions/Reflection.d.ts.map +1 -1
- package/dist/src/extensions/Reflection.js.map +1 -1
- package/dist/src/extensions/RefreshKeys.d.ts.map +1 -1
- package/dist/src/parser/GenericSqlLexer.js.map +1 -1
- package/dist/src/parser/GenericSqlParser.js.map +1 -1
- package/dist/src/parser/Python3Lexer.js.map +1 -1
- package/dist/src/parser/Python3Parser.js.map +1 -1
- package/dist/src/parser/PythonParser.js +17 -7
- package/dist/src/parser/PythonParser.js.map +1 -1
- package/dist/src/parser/SqlParser.js +17 -7
- package/dist/src/parser/SqlParser.js.map +1 -1
- package/dist/src/scaffolding/ScaffoldingSchema.js +7 -7
- package/dist/src/scaffolding/ScaffoldingSchema.js.map +1 -1
- package/dist/src/scaffolding/formatters/BaseSchemaFormatter.js.map +1 -1
- package/dist/src/scaffolding/formatters/JavaScriptSchemaFormatter.js.map +1 -1
- package/dist/src/scaffolding/formatters/YamlSchemaFormatter.js.map +1 -1
- package/dist/src/scaffolding/utils.js +1 -2
- package/dist/src/scaffolding/utils.js.map +1 -1
- package/package.json +13 -13
|
@@ -250,8 +250,8 @@ class BaseQuery {
|
|
|
250
250
|
preAggregationQuery: this.options.preAggregationQuery,
|
|
251
251
|
disableExternalPreAggregations: this.options.disableExternalPreAggregations,
|
|
252
252
|
useOriginalSqlPreAggregationsInPreAggregation: this.options.useOriginalSqlPreAggregationsInPreAggregation,
|
|
253
|
-
cubeLatticeCache: this.options.cubeLatticeCache,
|
|
254
|
-
historyQueries: this.options.historyQueries,
|
|
253
|
+
cubeLatticeCache: this.options.cubeLatticeCache, // TODO too heavy for key
|
|
254
|
+
historyQueries: this.options.historyQueries, // TODO too heavy for key
|
|
255
255
|
ungrouped: this.options.ungrouped,
|
|
256
256
|
memberToAlias: this.options.memberToAlias,
|
|
257
257
|
expressionParams: this.options.expressionParams,
|
|
@@ -1436,7 +1436,7 @@ class BaseQuery {
|
|
|
1436
1436
|
const fromSubQuery = fromMeasures && this.newSubQuery({
|
|
1437
1437
|
measures: fromMeasures,
|
|
1438
1438
|
// TODO get rid of this multiStage filter
|
|
1439
|
-
dimensions: fromDimensions,
|
|
1439
|
+
dimensions: fromDimensions, // .filter(d => !this.newDimension(d).isMultiStage()),
|
|
1440
1440
|
timeDimensions: fromTimeDimensions,
|
|
1441
1441
|
multiStageDimensions: withQuery.multiStageDimensions,
|
|
1442
1442
|
multiStageTimeDimensions: withQuery.multiStageTimeDimensions,
|
|
@@ -1447,7 +1447,7 @@ class BaseQuery {
|
|
|
1447
1447
|
// them by memberToAlias, producing `invalid identifier` errors.
|
|
1448
1448
|
memberToAlias: this.options.memberToAlias,
|
|
1449
1449
|
// TODO do we need it?
|
|
1450
|
-
multiStageQuery: true,
|
|
1450
|
+
multiStageQuery: true, // !!fromDimensions.find(d => this.newDimension(d).isMultiStage())
|
|
1451
1451
|
disableExternalPreAggregations: true,
|
|
1452
1452
|
});
|
|
1453
1453
|
const measures = fromSubQuery && fromMeasures.map(m => fromSubQuery.newMeasure(m));
|
|
@@ -3045,6 +3045,9 @@ class BaseQuery {
|
|
|
3045
3045
|
[renderContext.rootMeasure.value];
|
|
3046
3046
|
};
|
|
3047
3047
|
}
|
|
3048
|
+
/**
|
|
3049
|
+
* @returns {string[]}
|
|
3050
|
+
*/
|
|
3048
3051
|
collectLeafMeasures(fn) {
|
|
3049
3052
|
const context = { leafMeasures: {} };
|
|
3050
3053
|
this.evaluateSymbolSqlWithContext(fn, context);
|
|
@@ -3852,7 +3855,7 @@ class BaseQuery {
|
|
|
3852
3855
|
between: '{{ expr }} {% if negated %}NOT {% endif %}BETWEEN {{ low }} AND {{ high }}',
|
|
3853
3856
|
},
|
|
3854
3857
|
tesseract: {
|
|
3855
|
-
ilike: '{{ expr }} {% if negated %}NOT {% endif %}ILIKE {{ pattern }}',
|
|
3858
|
+
ilike: '{{ expr }} {% if negated %}NOT {% endif %}ILIKE {{ pattern }}', // May require different overloads in Tesseract than the ilike from expressions used in SQLAPI.
|
|
3856
3859
|
series_bounds_cast: '{{ expr }}',
|
|
3857
3860
|
bool_param_cast: '{{ expr }}',
|
|
3858
3861
|
number_param_cast: '{{ expr }}',
|
|
@@ -4373,16 +4376,22 @@ class BaseQuery {
|
|
|
4373
4376
|
return newGroupFilter({ operator: filter.operator, values }).filterToWhere();
|
|
4374
4377
|
}
|
|
4375
4378
|
const filterParams = filter.filterParams();
|
|
4376
|
-
const
|
|
4379
|
+
const matching = filterParamArgs.filter(p => {
|
|
4377
4380
|
const member = p.__member();
|
|
4378
4381
|
return member === filter.measure ||
|
|
4379
4382
|
member === filter.dimension ||
|
|
4380
4383
|
(aliases[member] && (aliases[member] === filter.measure ||
|
|
4381
4384
|
aliases[member] === filter.dimension));
|
|
4382
|
-
})
|
|
4383
|
-
if (!
|
|
4385
|
+
});
|
|
4386
|
+
if (!matching.length) {
|
|
4384
4387
|
throw new Error(`FILTER_PARAMS arg not found for ${filter.measure || filter.dimension}`);
|
|
4385
4388
|
}
|
|
4389
|
+
// Several args can name the same member, one per time shift it addresses.
|
|
4390
|
+
// Only the one addressing no shift describes the rows this query reads.
|
|
4391
|
+
const filterParamArg = matching.find(p => !(p.__timeShift && p.__timeShift()));
|
|
4392
|
+
if (!filterParamArg) {
|
|
4393
|
+
return BaseFilter_1.BaseFilter.ALWAYS_TRUE;
|
|
4394
|
+
}
|
|
4386
4395
|
if (typeof filterParamArg.__column() !== 'function') {
|
|
4387
4396
|
return filter.conditionSql(filterParamArg.__column());
|
|
4388
4397
|
}
|
|
@@ -4429,46 +4438,85 @@ class BaseQuery {
|
|
|
4429
4438
|
// and do not check cube validity as it's part of compilation step.
|
|
4430
4439
|
const cubeName = allFilters && cubeEvaluator.cubeNameFromPath(name);
|
|
4431
4440
|
return new Proxy({ cube: cubeName }, {
|
|
4432
|
-
get: (cubeNameObj, propertyName) => ({
|
|
4433
|
-
|
|
4434
|
-
|
|
4435
|
-
return column;
|
|
4436
|
-
},
|
|
4437
|
-
__member() {
|
|
4438
|
-
return cubeEvaluator.pathFromArray([cubeNameObj.cube, propertyName]);
|
|
4439
|
-
},
|
|
4440
|
-
toString() {
|
|
4441
|
-
// Segments should be excluded because they are evaluated separately in cubeReferenceProxy
|
|
4442
|
-
// In other case this falls into the recursive loop/stack exceeded caused by:
|
|
4443
|
-
// collectFrom() -> traverseSymbol() -> evaluateSymbolSql() ->
|
|
4444
|
-
// evaluateSql() -> resolveSymbolsCall() -> cubeReferenceProxy->toString() ->
|
|
4445
|
-
// evaluateSymbolSql() -> evaluateSql()... -> and got here again
|
|
4446
|
-
//
|
|
4447
|
-
// When FILTER_PARAMS is used in dimension/measure SQL - we also hit recursive loop:
|
|
4448
|
-
// allBackAliasMembersExceptSegments() -> collectFrom() -> traverseSymbol() -> evaluateSymbolSql() ->
|
|
4449
|
-
// autoPrefixAndEvaluateSql() -> evaluateSql() -> filterProxyFromAllFilters->Proxy->toString()
|
|
4450
|
-
// and so on...
|
|
4451
|
-
// For this case aliasGathering flag is added to the context in first iteration and
|
|
4452
|
-
// is checked below to prevent looping.
|
|
4453
|
-
const aliases = allFilters ?
|
|
4454
|
-
allFilters
|
|
4455
|
-
.map(v => (v.query && !v.query.safeEvaluateSymbolContext().aliasGathering ? v.query.allBackAliasMembersExceptSegments() : {}))
|
|
4456
|
-
.reduce((a, b) => ({ ...a, ...b }), {})
|
|
4457
|
-
: {};
|
|
4458
|
-
// Filtering aliases that somehow relate to this group member
|
|
4459
|
-
const groupMember = cubeEvaluator.pathFromArray([cubeNameObj.cube, propertyName]);
|
|
4460
|
-
const aliasesForGroupMembers = Object.entries(aliases)
|
|
4461
|
-
.filter(([key, _value]) => key === groupMember)
|
|
4462
|
-
.map(([_key, value]) => value);
|
|
4463
|
-
const filter = BaseQuery.findAndSubTreeForFilterGroup(newGroupFilter({ operator: 'and', values: allFilters }), [groupMember], newGroupFilter, aliasesForGroupMembers);
|
|
4464
|
-
return `(${BaseQuery.renderFilterParams(filter, [this], allocateParam, newGroupFilter, aliases)})`;
|
|
4441
|
+
get: (cubeNameObj, propertyName) => new Proxy({}, {
|
|
4442
|
+
get: (memberTarget, prop) => {
|
|
4443
|
+
if (prop === 'filter') {
|
|
4444
|
+
return (column) => BaseQuery.filterProxyBinding(cubeNameObj.cube, propertyName, false, column, allFilters, cubeEvaluator, allocateParam, newGroupFilter);
|
|
4465
4445
|
}
|
|
4466
|
-
|
|
4446
|
+
// A time shift is addressed only by the native planner. Here the
|
|
4447
|
+
// binding still has to exist, so that a model written for it
|
|
4448
|
+
// compiles and FILTER_GROUP can recover its member, but it
|
|
4449
|
+
// restates nothing.
|
|
4450
|
+
if (prop === 'time_shifts' || prop === 'timeShifts') {
|
|
4451
|
+
return new Proxy({}, {
|
|
4452
|
+
get: (_shiftTarget, timeShiftName) => {
|
|
4453
|
+
// Under `time_shifts` every string reads as the name of a
|
|
4454
|
+
// shift, so string coercion and `filter` — the plain form
|
|
4455
|
+
// with `time_shifts.` inserted by mistake — are reserved.
|
|
4456
|
+
if (typeof timeShiftName !== 'string' || BaseQuery.NOT_SHIFT_NAMES.has(timeShiftName)) {
|
|
4457
|
+
return () => {
|
|
4458
|
+
throw new UserError_1.UserError(`FILTER_PARAMS.${cubeNameObj.cube}.${propertyName}.time_shifts needs the name of a time shift: ` +
|
|
4459
|
+
'FILTER_PARAMS.<cube>.<member>.time_shifts.<name>.filter(...)');
|
|
4460
|
+
};
|
|
4461
|
+
}
|
|
4462
|
+
return {
|
|
4463
|
+
filter: (column) => BaseQuery.filterProxyBinding(cubeNameObj.cube, propertyName, true, column, allFilters, cubeEvaluator, allocateParam, newGroupFilter)
|
|
4464
|
+
};
|
|
4465
|
+
}
|
|
4466
|
+
});
|
|
4467
|
+
}
|
|
4468
|
+
return Reflect.get(memberTarget, prop);
|
|
4469
|
+
}
|
|
4467
4470
|
})
|
|
4468
4471
|
});
|
|
4469
4472
|
}
|
|
4470
4473
|
});
|
|
4471
4474
|
}
|
|
4475
|
+
static get NOT_SHIFT_NAMES() {
|
|
4476
|
+
return new Set(['toString', 'valueOf', 'filter']);
|
|
4477
|
+
}
|
|
4478
|
+
static filterProxyBinding(cubeName, propertyName, isTimeShift, column, allFilters, cubeEvaluator, allocateParam, newGroupFilter) {
|
|
4479
|
+
return {
|
|
4480
|
+
__column() {
|
|
4481
|
+
return column;
|
|
4482
|
+
},
|
|
4483
|
+
__member() {
|
|
4484
|
+
return cubeEvaluator.pathFromArray([cubeName, propertyName]);
|
|
4485
|
+
},
|
|
4486
|
+
__timeShift() {
|
|
4487
|
+
return isTimeShift;
|
|
4488
|
+
},
|
|
4489
|
+
toString() {
|
|
4490
|
+
if (isTimeShift) {
|
|
4491
|
+
return `(${BaseFilter_1.BaseFilter.ALWAYS_TRUE})`;
|
|
4492
|
+
}
|
|
4493
|
+
// Segments should be excluded because they are evaluated separately in cubeReferenceProxy
|
|
4494
|
+
// In other case this falls into the recursive loop/stack exceeded caused by:
|
|
4495
|
+
// collectFrom() -> traverseSymbol() -> evaluateSymbolSql() ->
|
|
4496
|
+
// evaluateSql() -> resolveSymbolsCall() -> cubeReferenceProxy->toString() ->
|
|
4497
|
+
// evaluateSymbolSql() -> evaluateSql()... -> and got here again
|
|
4498
|
+
//
|
|
4499
|
+
// When FILTER_PARAMS is used in dimension/measure SQL - we also hit recursive loop:
|
|
4500
|
+
// allBackAliasMembersExceptSegments() -> collectFrom() -> traverseSymbol() -> evaluateSymbolSql() ->
|
|
4501
|
+
// autoPrefixAndEvaluateSql() -> evaluateSql() -> filterProxyFromAllFilters->Proxy->toString()
|
|
4502
|
+
// and so on...
|
|
4503
|
+
// For this case aliasGathering flag is added to the context in first iteration and
|
|
4504
|
+
// is checked below to prevent looping.
|
|
4505
|
+
const aliases = allFilters ?
|
|
4506
|
+
allFilters
|
|
4507
|
+
.map(v => (v.query && !v.query.safeEvaluateSymbolContext().aliasGathering ? v.query.allBackAliasMembersExceptSegments() : {}))
|
|
4508
|
+
.reduce((a, b) => ({ ...a, ...b }), {})
|
|
4509
|
+
: {};
|
|
4510
|
+
// Filtering aliases that somehow relate to this group member
|
|
4511
|
+
const groupMember = cubeEvaluator.pathFromArray([cubeName, propertyName]);
|
|
4512
|
+
const aliasesForGroupMembers = Object.entries(aliases)
|
|
4513
|
+
.filter(([key, _value]) => key === groupMember)
|
|
4514
|
+
.map(([_key, value]) => value);
|
|
4515
|
+
const filter = BaseQuery.findAndSubTreeForFilterGroup(newGroupFilter({ operator: 'and', values: allFilters }), [groupMember], newGroupFilter, aliasesForGroupMembers);
|
|
4516
|
+
return `(${BaseQuery.renderFilterParams(filter, [this], allocateParam, newGroupFilter, aliases)})`;
|
|
4517
|
+
}
|
|
4518
|
+
};
|
|
4519
|
+
}
|
|
4472
4520
|
/**
|
|
4473
4521
|
*
|
|
4474
4522
|
* @param {boolean} excludeSegments
|
|
@@ -4600,7 +4648,7 @@ class BaseQuery {
|
|
|
4600
4648
|
/**
|
|
4601
4649
|
* Returns a function that constructs the full member path
|
|
4602
4650
|
* based on the query's join structure.
|
|
4603
|
-
* @returns {(
|
|
4651
|
+
* @returns {(member: string) => string}
|
|
4604
4652
|
*/
|
|
4605
4653
|
resolveFullMemberPathFn() {
|
|
4606
4654
|
const { root: queryJoinRoot } = this.join || {};
|