@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.
Files changed (122) hide show
  1. package/dist/src/adapter/BaseDimension.d.ts +1 -1
  2. package/dist/src/adapter/BaseDimension.js.map +1 -1
  3. package/dist/src/adapter/BaseFilter.js.map +1 -1
  4. package/dist/src/adapter/BaseGroupFilter.js.map +1 -1
  5. package/dist/src/adapter/BaseMeasure.d.ts +1 -1
  6. package/dist/src/adapter/BaseMeasure.js.map +1 -1
  7. package/dist/src/adapter/BaseQuery.d.ts +47 -41
  8. package/dist/src/adapter/BaseQuery.d.ts.map +1 -1
  9. package/dist/src/adapter/BaseQuery.js +91 -43
  10. package/dist/src/adapter/BaseQuery.js.map +1 -1
  11. package/dist/src/adapter/BaseSegment.js.map +1 -1
  12. package/dist/src/adapter/BaseTimeDimension.d.ts +1 -1
  13. package/dist/src/adapter/BaseTimeDimension.js.map +1 -1
  14. package/dist/src/adapter/BigqueryQuery.d.ts +8 -1
  15. package/dist/src/adapter/BigqueryQuery.d.ts.map +1 -1
  16. package/dist/src/adapter/BigqueryQuery.js.map +1 -1
  17. package/dist/src/adapter/ClickHouseQuery.d.ts +7 -1
  18. package/dist/src/adapter/ClickHouseQuery.d.ts.map +1 -1
  19. package/dist/src/adapter/ClickHouseQuery.js.map +1 -1
  20. package/dist/src/adapter/CubeStoreQuery.d.ts +5 -1
  21. package/dist/src/adapter/CubeStoreQuery.d.ts.map +1 -1
  22. package/dist/src/adapter/CubeStoreQuery.js.map +1 -1
  23. package/dist/src/adapter/Granularity.js.map +1 -1
  24. package/dist/src/adapter/HiveQuery.js.map +1 -1
  25. package/dist/src/adapter/MemberSqlTemplateCompiler.d.ts.map +1 -1
  26. package/dist/src/adapter/MemberSqlTemplateCompiler.js +49 -17
  27. package/dist/src/adapter/MemberSqlTemplateCompiler.js.map +1 -1
  28. package/dist/src/adapter/MongoBiQuery.js.map +1 -1
  29. package/dist/src/adapter/MssqlQuery.d.ts +6 -1
  30. package/dist/src/adapter/MssqlQuery.d.ts.map +1 -1
  31. package/dist/src/adapter/MssqlQuery.js +1 -1
  32. package/dist/src/adapter/MssqlQuery.js.map +1 -1
  33. package/dist/src/adapter/MysqlQuery.d.ts +6 -1
  34. package/dist/src/adapter/MysqlQuery.d.ts.map +1 -1
  35. package/dist/src/adapter/MysqlQuery.js.map +1 -1
  36. package/dist/src/adapter/OracleQuery.d.ts +10 -1
  37. package/dist/src/adapter/OracleQuery.d.ts.map +1 -1
  38. package/dist/src/adapter/OracleQuery.js.map +1 -1
  39. package/dist/src/adapter/ParamAllocator.js.map +1 -1
  40. package/dist/src/adapter/PostgresQuery.js.map +1 -1
  41. package/dist/src/adapter/PreAggregations.d.ts +7 -1
  42. package/dist/src/adapter/PreAggregations.d.ts.map +1 -1
  43. package/dist/src/adapter/PreAggregations.js +18 -5
  44. package/dist/src/adapter/PreAggregations.js.map +1 -1
  45. package/dist/src/adapter/PrestodbQuery.d.ts +7 -1
  46. package/dist/src/adapter/PrestodbQuery.d.ts.map +1 -1
  47. package/dist/src/adapter/PrestodbQuery.js.map +1 -1
  48. package/dist/src/adapter/QueryBuilder.d.ts.map +1 -1
  49. package/dist/src/adapter/QueryBuilder.js.map +1 -1
  50. package/dist/src/adapter/QueryCache.js.map +1 -1
  51. package/dist/src/adapter/QueryFactory.js.map +1 -1
  52. package/dist/src/adapter/RedshiftQuery.js.map +1 -1
  53. package/dist/src/adapter/SnowflakeQuery.d.ts +18 -1
  54. package/dist/src/adapter/SnowflakeQuery.d.ts.map +1 -1
  55. package/dist/src/adapter/SnowflakeQuery.js +40 -0
  56. package/dist/src/adapter/SnowflakeQuery.js.map +1 -1
  57. package/dist/src/adapter/SqliteQuery.d.ts +6 -1
  58. package/dist/src/adapter/SqliteQuery.d.ts.map +1 -1
  59. package/dist/src/adapter/windows-iana.js +1 -2
  60. package/dist/src/adapter/windows-iana.js.map +1 -1
  61. package/dist/src/compiler/CompileError.d.ts.map +1 -1
  62. package/dist/src/compiler/CompilerCache.js.map +1 -1
  63. package/dist/src/compiler/ContextEvaluator.js.map +1 -1
  64. package/dist/src/compiler/CubeDictionary.js.map +1 -1
  65. package/dist/src/compiler/CubeEvaluator.js.map +1 -1
  66. package/dist/src/compiler/CubeSymbols.d.ts +5 -5
  67. package/dist/src/compiler/CubeSymbols.d.ts.map +1 -1
  68. package/dist/src/compiler/CubeSymbols.js +1 -1
  69. package/dist/src/compiler/CubeSymbols.js.map +1 -1
  70. package/dist/src/compiler/CubeToMetaTransformer.js.map +1 -1
  71. package/dist/src/compiler/CubeValidator.js +29 -29
  72. package/dist/src/compiler/CubeValidator.js.map +1 -1
  73. package/dist/src/compiler/DataSchemaCompiler.d.ts +0 -1
  74. package/dist/src/compiler/DataSchemaCompiler.d.ts.map +1 -1
  75. package/dist/src/compiler/DataSchemaCompiler.js.map +1 -1
  76. package/dist/src/compiler/ErrorReporter.js.map +1 -1
  77. package/dist/src/compiler/JoinGraph.js.map +1 -1
  78. package/dist/src/compiler/PrepareCompiler.d.ts +0 -1
  79. package/dist/src/compiler/PrepareCompiler.d.ts.map +1 -1
  80. package/dist/src/compiler/PrepareCompiler.js.map +1 -1
  81. package/dist/src/compiler/ViewCompilationGate.js.map +1 -1
  82. package/dist/src/compiler/ViewGroupEvaluator.js.map +1 -1
  83. package/dist/src/compiler/YamlCompiler.js +17 -7
  84. package/dist/src/compiler/YamlCompiler.js.map +1 -1
  85. package/dist/src/compiler/converters/CubePreAggregationConverter.js +17 -7
  86. package/dist/src/compiler/converters/CubePreAggregationConverter.js.map +1 -1
  87. package/dist/src/compiler/converters/CubeSchemaConverter.js +17 -7
  88. package/dist/src/compiler/converters/CubeSchemaConverter.js.map +1 -1
  89. package/dist/src/compiler/named-numeric-formats.js +2 -2
  90. package/dist/src/compiler/named-numeric-formats.js.map +1 -1
  91. package/dist/src/compiler/transpilers/CubeCheckDuplicatePropTranspiler.js.map +1 -1
  92. package/dist/src/compiler/transpilers/CubePropContextTranspiler.js +17 -7
  93. package/dist/src/compiler/transpilers/CubePropContextTranspiler.js.map +1 -1
  94. package/dist/src/compiler/transpilers/IIFETranspiler.js +17 -7
  95. package/dist/src/compiler/transpilers/IIFETranspiler.js.map +1 -1
  96. package/dist/src/compiler/transpilers/ImportExportTranspiler.js +17 -7
  97. package/dist/src/compiler/transpilers/ImportExportTranspiler.js.map +1 -1
  98. package/dist/src/compiler/transpilers/LightweightSymbolResolver.js.map +1 -1
  99. package/dist/src/compiler/transpilers/ValidationTranspiler.js.map +1 -1
  100. package/dist/src/compiler/transpilers/transpiler_worker.js.map +1 -1
  101. package/dist/src/compiler/utils.js +1 -2
  102. package/dist/src/compiler/utils.js.map +1 -1
  103. package/dist/src/extensions/Funnels.js.map +1 -1
  104. package/dist/src/extensions/Reflection.d.ts.map +1 -1
  105. package/dist/src/extensions/Reflection.js.map +1 -1
  106. package/dist/src/extensions/RefreshKeys.d.ts.map +1 -1
  107. package/dist/src/parser/GenericSqlLexer.js.map +1 -1
  108. package/dist/src/parser/GenericSqlParser.js.map +1 -1
  109. package/dist/src/parser/Python3Lexer.js.map +1 -1
  110. package/dist/src/parser/Python3Parser.js.map +1 -1
  111. package/dist/src/parser/PythonParser.js +17 -7
  112. package/dist/src/parser/PythonParser.js.map +1 -1
  113. package/dist/src/parser/SqlParser.js +17 -7
  114. package/dist/src/parser/SqlParser.js.map +1 -1
  115. package/dist/src/scaffolding/ScaffoldingSchema.js +7 -7
  116. package/dist/src/scaffolding/ScaffoldingSchema.js.map +1 -1
  117. package/dist/src/scaffolding/formatters/BaseSchemaFormatter.js.map +1 -1
  118. package/dist/src/scaffolding/formatters/JavaScriptSchemaFormatter.js.map +1 -1
  119. package/dist/src/scaffolding/formatters/YamlSchemaFormatter.js.map +1 -1
  120. package/dist/src/scaffolding/utils.js +1 -2
  121. package/dist/src/scaffolding/utils.js.map +1 -1
  122. 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 filterParamArg = filterParamArgs.filter(p => {
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
- })[0];
4383
- if (!filterParamArg) {
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
- filter: (column) => ({
4434
- __column() {
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 {(function(member: string): (string))}
4651
+ * @returns {(member: string) => string}
4604
4652
  */
4605
4653
  resolveFullMemberPathFn() {
4606
4654
  const { root: queryJoinRoot } = this.join || {};