@hypequery/datasets 0.23.1 → 0.25.0

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 (255) hide show
  1. package/README.md +14 -0
  2. package/dist/aggregations.d.ts +3 -0
  3. package/dist/aggregations.d.ts.map +1 -1
  4. package/dist/aggregations.js +6 -0
  5. package/dist/cache/definition-identity.d.ts +9 -6
  6. package/dist/cache/definition-identity.d.ts.map +1 -1
  7. package/dist/cache/definition-identity.js +14 -8
  8. package/dist/cache/protocol-cache-keys.d.ts.map +1 -1
  9. package/dist/cache/protocol-cache-keys.js +29 -6
  10. package/dist/cache/query-signature.d.ts.map +1 -1
  11. package/dist/cache/query-signature.js +12 -1
  12. package/dist/catalog.d.ts +7 -0
  13. package/dist/catalog.d.ts.map +1 -1
  14. package/dist/catalog.js +5 -2
  15. package/dist/client-contract/query-schema.d.ts +19 -0
  16. package/dist/client-contract/query-schema.d.ts.map +1 -0
  17. package/dist/client-contract/query-schema.js +85 -0
  18. package/dist/constants.d.ts +5 -4
  19. package/dist/constants.d.ts.map +1 -1
  20. package/dist/constants.js +7 -6
  21. package/dist/contract.d.ts +5 -0
  22. package/dist/contract.d.ts.map +1 -1
  23. package/dist/contract.js +6 -3
  24. package/dist/dataset-compilation.d.ts +2 -0
  25. package/dist/dataset-compilation.d.ts.map +1 -1
  26. package/dist/dataset-sql-dialect.d.ts +119 -0
  27. package/dist/dataset-sql-dialect.d.ts.map +1 -1
  28. package/dist/dataset.d.ts +4 -2
  29. package/dist/dataset.d.ts.map +1 -1
  30. package/dist/dataset.js +23 -31
  31. package/dist/in-memory-backend.d.ts.map +1 -1
  32. package/dist/in-memory-backend.js +2 -0
  33. package/dist/index.d.ts +49 -6
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +34 -6
  36. package/dist/internal.d.ts +5 -1
  37. package/dist/internal.d.ts.map +1 -1
  38. package/dist/internal.js +5 -1
  39. package/dist/measure.d.ts +9 -1
  40. package/dist/measure.d.ts.map +1 -1
  41. package/dist/measure.js +9 -1
  42. package/dist/metric-query-engine.d.ts +0 -1
  43. package/dist/metric-query-engine.d.ts.map +1 -1
  44. package/dist/metric-query-engine.js +11 -3
  45. package/dist/protocol-adapter.d.ts.map +1 -1
  46. package/dist/protocol-adapter.js +2 -3
  47. package/dist/protocol-deployment-adapter.d.ts.map +1 -1
  48. package/dist/protocol-deployment-adapter.js +7 -1
  49. package/dist/protocol-rehydrate.d.ts.map +1 -1
  50. package/dist/protocol-rehydrate.js +1 -0
  51. package/dist/protocol-schema-adapter.d.ts +7 -7
  52. package/dist/protocol-schema-adapter.d.ts.map +1 -1
  53. package/dist/protocol-schema-adapter.js +12 -245
  54. package/dist/query-builder-protocol.d.ts +34 -1
  55. package/dist/query-builder-protocol.d.ts.map +1 -1
  56. package/dist/query-planner.d.ts +14 -5
  57. package/dist/query-planner.d.ts.map +1 -1
  58. package/dist/query-planner.js +53 -34
  59. package/dist/relationship-check.d.ts.map +1 -1
  60. package/dist/relationship-check.js +8 -8
  61. package/dist/schemas.d.ts +17 -0
  62. package/dist/schemas.d.ts.map +1 -0
  63. package/dist/schemas.js +16 -0
  64. package/dist/semantic-planner.d.ts.map +1 -1
  65. package/dist/semantic-planner.js +49 -13
  66. package/dist/semantic-query-schema.d.ts +8 -1
  67. package/dist/semantic-query-schema.d.ts.map +1 -1
  68. package/dist/semantic-query-schema.js +18 -12
  69. package/dist/tools.d.ts.map +1 -1
  70. package/dist/tools.js +4 -3
  71. package/dist/types.d.ts +105 -7
  72. package/dist/types.d.ts.map +1 -1
  73. package/dist/utils/aggregate-state-functions.d.ts +24 -0
  74. package/dist/utils/aggregate-state-functions.d.ts.map +1 -0
  75. package/dist/utils/aggregate-state-functions.js +60 -0
  76. package/dist/utils/approximate-measures.d.ts +3 -1
  77. package/dist/utils/approximate-measures.d.ts.map +1 -1
  78. package/dist/utils/approximate-measures.js +8 -2
  79. package/dist/utils/base-measure-definition.d.ts +16 -0
  80. package/dist/utils/base-measure-definition.d.ts.map +1 -1
  81. package/dist/utils/base-measure-definition.js +31 -0
  82. package/dist/utils/build-dataset-query-builder.d.ts +1 -1
  83. package/dist/utils/build-dataset-query-builder.d.ts.map +1 -1
  84. package/dist/utils/build-dataset-query-builder.js +26 -21
  85. package/dist/utils/by-name.d.ts +8 -0
  86. package/dist/utils/by-name.d.ts.map +1 -0
  87. package/dist/utils/by-name.js +44 -0
  88. package/dist/utils/calendar-shift-sql.d.ts +5 -4
  89. package/dist/utils/calendar-shift-sql.d.ts.map +1 -1
  90. package/dist/utils/calendar-shift-sql.js +8 -8
  91. package/dist/utils/clickhouse-dataset-sql-dialect.d.ts +2 -2
  92. package/dist/utils/clickhouse-dataset-sql-dialect.d.ts.map +1 -1
  93. package/dist/utils/clickhouse-dataset-sql-dialect.js +143 -1
  94. package/dist/utils/compile-dataset-query.d.ts +1 -1
  95. package/dist/utils/compile-dataset-query.d.ts.map +1 -1
  96. package/dist/utils/compile-dataset-query.js +22 -8
  97. package/dist/utils/composite-time-measure-sql.d.ts +3 -5
  98. package/dist/utils/composite-time-measure-sql.d.ts.map +1 -1
  99. package/dist/utils/composite-time-measure-sql.js +15 -16
  100. package/dist/utils/count-aggregations.d.ts +4 -0
  101. package/dist/utils/count-aggregations.d.ts.map +1 -0
  102. package/dist/utils/count-aggregations.js +6 -0
  103. package/dist/utils/dataset-definition-validation.d.ts +1 -1
  104. package/dist/utils/dataset-definition-validation.d.ts.map +1 -1
  105. package/dist/utils/dataset-definition-validation.js +55 -26
  106. package/dist/utils/dataset-derived-query.d.ts +2 -4
  107. package/dist/utils/dataset-derived-query.d.ts.map +1 -1
  108. package/dist/utils/dataset-derived-query.js +11 -14
  109. package/dist/utils/dataset-having.d.ts +5 -7
  110. package/dist/utils/dataset-having.d.ts.map +1 -1
  111. package/dist/utils/dataset-having.js +9 -12
  112. package/dist/utils/dataset-normalization.d.ts.map +1 -1
  113. package/dist/utils/dataset-normalization.js +1 -0
  114. package/dist/utils/dataset-query-validation.d.ts +1 -1
  115. package/dist/utils/dataset-query-validation.d.ts.map +1 -1
  116. package/dist/utils/dataset-query-validation.js +19 -2
  117. package/dist/utils/dataset-source.d.ts +42 -0
  118. package/dist/utils/dataset-source.d.ts.map +1 -0
  119. package/dist/utils/dataset-source.js +59 -0
  120. package/dist/utils/dataset-sql-dialect.d.ts +13 -2
  121. package/dist/utils/dataset-sql-dialect.d.ts.map +1 -1
  122. package/dist/utils/dataset-sql-dialect.js +74 -1
  123. package/dist/utils/dataset-time-keys.d.ts +32 -0
  124. package/dist/utils/dataset-time-keys.d.ts.map +1 -0
  125. package/dist/utils/dataset-time-keys.js +55 -0
  126. package/dist/utils/dataset-validation.d.ts.map +1 -1
  127. package/dist/utils/dataset-validation.js +7 -0
  128. package/dist/utils/deployable-formulas.d.ts +33 -0
  129. package/dist/utils/deployable-formulas.d.ts.map +1 -0
  130. package/dist/utils/deployable-formulas.js +102 -0
  131. package/dist/utils/derived-cte-validation.d.ts +5 -0
  132. package/dist/utils/derived-cte-validation.d.ts.map +1 -1
  133. package/dist/utils/derived-cte-validation.js +77 -8
  134. package/dist/utils/derived-measure-sql.d.ts +10 -2
  135. package/dist/utils/derived-measure-sql.d.ts.map +1 -1
  136. package/dist/utils/derived-measure-sql.js +23 -43
  137. package/dist/utils/enforced-constraints.d.ts +14 -0
  138. package/dist/utils/enforced-constraints.d.ts.map +1 -0
  139. package/dist/utils/enforced-constraints.js +57 -0
  140. package/dist/utils/filter-field-type.d.ts +14 -0
  141. package/dist/utils/filter-field-type.d.ts.map +1 -0
  142. package/dist/utils/filter-field-type.js +21 -0
  143. package/dist/utils/filtered-aggregation-sql.d.ts +2 -1
  144. package/dist/utils/filtered-aggregation-sql.d.ts.map +1 -1
  145. package/dist/utils/filtered-aggregation-sql.js +18 -35
  146. package/dist/utils/groupable.d.ts +7 -0
  147. package/dist/utils/groupable.d.ts.map +1 -0
  148. package/dist/utils/groupable.js +8 -0
  149. package/dist/utils/metric-derived-query.d.ts +2 -4
  150. package/dist/utils/metric-derived-query.d.ts.map +1 -1
  151. package/dist/utils/metric-derived-query.js +58 -51
  152. package/dist/utils/metric-query-builder.d.ts +1 -1
  153. package/dist/utils/metric-query-builder.d.ts.map +1 -1
  154. package/dist/utils/metric-query-builder.js +22 -20
  155. package/dist/utils/metric-query-validation.d.ts.map +1 -1
  156. package/dist/utils/metric-query-validation.js +14 -1
  157. package/dist/utils/portable-aggregations.d.ts +1 -0
  158. package/dist/utils/portable-aggregations.d.ts.map +1 -1
  159. package/dist/utils/portable-aggregations.js +5 -0
  160. package/dist/utils/protocol-schema-conversion.d.ts +12 -0
  161. package/dist/utils/protocol-schema-conversion.d.ts.map +1 -0
  162. package/dist/utils/protocol-schema-conversion.js +61 -0
  163. package/dist/utils/query-field-references.d.ts +10 -0
  164. package/dist/utils/query-field-references.d.ts.map +1 -0
  165. package/dist/utils/query-field-references.js +38 -0
  166. package/dist/utils/query-timezone.d.ts +41 -3
  167. package/dist/utils/query-timezone.d.ts.map +1 -1
  168. package/dist/utils/query-timezone.js +76 -9
  169. package/dist/utils/raw-sql-dialect-check.d.ts +12 -0
  170. package/dist/utils/raw-sql-dialect-check.d.ts.map +1 -0
  171. package/dist/utils/raw-sql-dialect-check.js +37 -0
  172. package/dist/utils/relationship-builder-plan.d.ts +37 -18
  173. package/dist/utils/relationship-builder-plan.d.ts.map +1 -1
  174. package/dist/utils/relationship-builder-plan.js +43 -28
  175. package/dist/utils/relationship-measure-sql.d.ts +14 -4
  176. package/dist/utils/relationship-measure-sql.d.ts.map +1 -1
  177. package/dist/utils/relationship-measure-sql.js +36 -10
  178. package/dist/utils/relationship-measures.d.ts.map +1 -1
  179. package/dist/utils/relationship-measures.js +3 -0
  180. package/dist/utils/relationship-validation.d.ts.map +1 -1
  181. package/dist/utils/relationship-validation.js +2 -0
  182. package/dist/utils/row-scope.d.ts +23 -0
  183. package/dist/utils/row-scope.d.ts.map +1 -0
  184. package/dist/utils/row-scope.js +26 -0
  185. package/dist/utils/scoped-dataset-source.d.ts +23 -0
  186. package/dist/utils/scoped-dataset-source.d.ts.map +1 -0
  187. package/dist/utils/scoped-dataset-source.js +34 -0
  188. package/dist/utils/semantic-tool.d.ts +2 -2
  189. package/dist/utils/semantic-tool.d.ts.map +1 -1
  190. package/dist/utils/semantic-tool.js +1 -1
  191. package/dist/utils/shift-measure-sql.d.ts +5 -4
  192. package/dist/utils/shift-measure-sql.d.ts.map +1 -1
  193. package/dist/utils/shift-measure-sql.js +25 -26
  194. package/dist/utils/shift-wall-time-sql.d.ts +2 -1
  195. package/dist/utils/shift-wall-time-sql.d.ts.map +1 -1
  196. package/dist/utils/shift-wall-time-sql.js +7 -7
  197. package/dist/utils/snapshot-execution-context.d.ts.map +1 -1
  198. package/dist/utils/snapshot-execution-context.js +3 -0
  199. package/dist/utils/statement-parameters.d.ts +58 -0
  200. package/dist/utils/statement-parameters.d.ts.map +1 -0
  201. package/dist/utils/statement-parameters.js +101 -0
  202. package/dist/utils/time-axis-calendar-guard.d.ts +2 -1
  203. package/dist/utils/time-axis-calendar-guard.d.ts.map +1 -1
  204. package/dist/utils/time-axis-calendar-guard.js +5 -7
  205. package/dist/utils/time-measure-axis-sql.d.ts +3 -2
  206. package/dist/utils/time-measure-axis-sql.d.ts.map +1 -1
  207. package/dist/utils/time-measure-axis-sql.js +20 -22
  208. package/dist/utils/time-measure-context-sql.d.ts +3 -2
  209. package/dist/utils/time-measure-context-sql.d.ts.map +1 -1
  210. package/dist/utils/time-measure-context-sql.js +11 -11
  211. package/dist/utils/time-measure-dataset-sql.d.ts +7 -5
  212. package/dist/utils/time-measure-dataset-sql.d.ts.map +1 -1
  213. package/dist/utils/time-measure-dataset-sql.js +17 -12
  214. package/dist/utils/time-measure-leaf-sql.d.ts +3 -2
  215. package/dist/utils/time-measure-leaf-sql.d.ts.map +1 -1
  216. package/dist/utils/time-measure-leaf-sql.js +19 -18
  217. package/dist/utils/time-measure-result-sql.d.ts.map +1 -1
  218. package/dist/utils/time-measure-result-sql.js +10 -11
  219. package/dist/utils/time-measure-source-sql.d.ts +5 -2
  220. package/dist/utils/time-measure-source-sql.d.ts.map +1 -1
  221. package/dist/utils/time-measure-source-sql.js +33 -23
  222. package/dist/utils/time-measure-values-sql.d.ts +4 -3
  223. package/dist/utils/time-measure-values-sql.d.ts.map +1 -1
  224. package/dist/utils/time-measure-values-sql.js +26 -29
  225. package/dist/utils/timestamp-instants.d.ts +17 -0
  226. package/dist/utils/timestamp-instants.d.ts.map +1 -0
  227. package/dist/utils/timestamp-instants.js +34 -0
  228. package/dist/utils/timestamp-text.d.ts +12 -0
  229. package/dist/utils/timestamp-text.d.ts.map +1 -0
  230. package/dist/utils/timestamp-text.js +18 -0
  231. package/dist/utils/zod-json-schema.d.ts +8 -0
  232. package/dist/utils/zod-json-schema.d.ts.map +1 -0
  233. package/dist/utils/zod-json-schema.js +18 -0
  234. package/dist/utils/zod-schema-version.d.ts +19 -0
  235. package/dist/utils/zod-schema-version.d.ts.map +1 -0
  236. package/dist/utils/zod-schema-version.js +6 -0
  237. package/dist/utils/zod-v3-protocol-schema.d.ts +10 -0
  238. package/dist/utils/zod-v3-protocol-schema.d.ts.map +1 -0
  239. package/dist/utils/zod-v3-protocol-schema.js +164 -0
  240. package/dist/utils/zod-v4-protocol-schema.d.ts +12 -0
  241. package/dist/utils/zod-v4-protocol-schema.d.ts.map +1 -0
  242. package/dist/utils/zod-v4-protocol-schema.js +171 -0
  243. package/dist/validation.d.ts +7 -0
  244. package/dist/validation.d.ts.map +1 -1
  245. package/dist/validation.js +42 -8
  246. package/package.json +21 -12
  247. package/dist/api.type-test.d.ts +0 -2
  248. package/dist/api.type-test.d.ts.map +0 -1
  249. package/dist/api.type-test.js +0 -251
  250. package/dist/utils/time-arithmetic-sql.d.ts +0 -4
  251. package/dist/utils/time-arithmetic-sql.d.ts.map +0 -1
  252. package/dist/utils/time-arithmetic-sql.js +0 -9
  253. package/dist/utils/window-aggregation-sql.d.ts +0 -5
  254. package/dist/utils/window-aggregation-sql.d.ts.map +0 -1
  255. package/dist/utils/window-aggregation-sql.js +0 -17
@@ -1,42 +1,40 @@
1
- import { GRAIN_FUNCTIONS } from '../constants.js';
2
- import { addTimeSql as add, subtractTimeSql as subtract } from './time-arithmetic-sql.js';
1
+ import { sourceTimezoneSql } from './time-measure-source-sql.js';
3
2
  import { calendarBucketGuardSql } from './time-axis-calendar-guard.js';
4
3
  import { shiftCalendarGuardSql, shiftWallTimeSeriesGuardSql } from './shift-measure-sql.js';
5
- function literal(value) {
6
- return `'${value.replace(/\\/g, '\\\\').replace(/'/g, "''")}'`;
7
- }
8
4
  /** Build bounded output buckets using the query timezone. */
9
- export function buildTimeMeasureAxisSql(source, axis, shifts = []) {
10
- const first = `${GRAIN_FUNCTIONS[axis.grain]}(_hq_lower)`;
11
- const upperBucket = `${GRAIN_FUNCTIONS[axis.grain]}(_hq_upper)`;
5
+ export function buildTimeMeasureAxisSql(statement, source, axis, shifts = []) {
6
+ const { dialect } = statement;
7
+ const first = dialect.truncateTime('_hq_lower', axis.grain);
8
+ const upperBucket = dialect.truncateTime('_hq_upper', axis.grain);
12
9
  const last = axis.upperInclusive
13
10
  ? upperBucket
14
- : `if(_hq_upper = ${upperBucket}, ${subtract(upperBucket, 1, axis.grain)}, ${upperBucket})`;
15
- const count = `dateDiff('${axis.grain}', _hq_first, _hq_last) + 1`;
11
+ : dialect.ifElse(`_hq_upper = ${upperBucket}`, dialect.subtractTime(upperBucket, 1, axis.grain), upperBucket);
12
+ const count = `${dialect.timeDiff(axis.grain, '_hq_first', '_hq_last')} + 1`;
16
13
  const emptyRange = axis.lowerInclusive && axis.upperInclusive ? '' : ' OR _hq_lower = _hq_upper';
17
- const rangeGuard = `throwIf(_hq_lower > _hq_upper${emptyRange}, 'Window measure time range must be non-empty and ordered.')`;
14
+ const rangeGuard = dialect.guard(`_hq_lower > _hq_upper${emptyRange}`, 'Window measure time range must be non-empty and ordered.');
18
15
  const limitGuard = axis.resultLimit === undefined
19
16
  ? '0'
20
- : `throwIf(${count} > ${axis.resultLimit}, 'Window series exceeds the effective result limit of ${axis.resultLimit} buckets.')`;
21
- const calendarGuard = calendarBucketGuardSql('_hq_first', `${count} + ${limitGuard} + ${rangeGuard}`, axis.grain);
22
- const physicalTimeType = `toTypeName(tupleElement((SELECT ${source.rowAlias} FROM _hq_raw LIMIT 0), 1))`;
17
+ : dialect.guard(`${count} > ${axis.resultLimit}`, `Window series exceeds the effective result limit of ${axis.resultLimit} buckets.`);
18
+ const calendarGuard = calendarBucketGuardSql(dialect, '_hq_first', `${count} + ${limitGuard} + ${rangeGuard}`, axis.grain);
19
+ const physicalTime = dialect.rowElement(`(SELECT ${source.rowAlias} FROM _hq_raw LIMIT 0)`, 1);
23
20
  const physicalGuard = axis.grain === 'minute' || axis.grain === 'hour'
24
- ? `throwIf(position(${physicalTimeType}, 'Date') > 0 AND position(${physicalTimeType}, 'DateTime') = 0, 'Sub-day time measures require a time-of-day column; Date and Date32 are not supported.')`
21
+ ? dialect.guard(dialect.isDateOnlyType(physicalTime), 'Sub-day time measures require a time-of-day column; Date and Date32 are not supported.')
25
22
  : '0';
26
- const shiftGuards = shifts.map(shift => shiftCalendarGuardSql(shift, axis, `${limitGuard} + ${rangeGuard}`));
23
+ const shiftGuards = shifts.map(shift => shiftCalendarGuardSql(dialect, shift, axis, `${limitGuard} + ${rangeGuard}`));
27
24
  const guard = [limitGuard, physicalGuard, calendarGuard, ...shiftGuards].join(' + ');
28
- const postSeriesGuard = shifts.map(shift => shiftWallTimeSeriesGuardSql(shift, axis.grain)).join(' + ') || '0';
25
+ const postSeriesGuard = shifts.map(shift => shiftWallTimeSeriesGuardSql(dialect, shift, axis.grain)).join(' + ') || '0';
29
26
  // A zero-row scalar retains the converted timestamp type and query timezone.
30
27
  // Reading any(time) here would scan the entire population just for its type.
31
- const timezone = 'timezoneOf(assumeNotNull((SELECT _hq_time FROM _hq_source LIMIT 0)))';
28
+ const timezone = sourceTimezoneSql(dialect);
32
29
  const bounds = [
33
- `parseDateTime64BestEffort(${literal(axis.lower)}, 9, ${timezone}) AS _hq_lower`,
34
- `parseDateTime64BestEffort(${literal(axis.upper)}, 9, ${timezone}) AS _hq_upper`,
30
+ // The bounds come from the caller's time filter: bind them, never inline them.
31
+ `${dialect.parseTimestamp(statement.bind(axis.lower, 'string'), timezone)} AS _hq_lower`,
32
+ `${dialect.parseTimestamp(statement.bind(axis.upper, 'string'), timezone)} AS _hq_upper`,
35
33
  `${first} AS _hq_first`,
36
34
  `${last} AS _hq_last`,
37
35
  ];
38
- const bucketIndices = `arrayJoin(range(toUInt64(${count} + ${guard} + ${rangeGuard})))`;
39
- const period = add('_hq_first', bucketIndices, axis.grain);
36
+ const bucketIndices = dialect.seriesIndex(`${count} + ${guard} + ${rangeGuard}`);
37
+ const period = dialect.addTime('_hq_first', bucketIndices, axis.grain);
40
38
  const ctes = [
41
39
  `_hq_bounds AS (SELECT ${bounds.join(', ')})`,
42
40
  `_hq_series AS (SELECT ${period} AS _hq_period FROM _hq_bounds)`,
@@ -1,6 +1,7 @@
1
+ import type { DatasetSqlDialectRules } from '../dataset-sql-dialect.js';
1
2
  import type { MeasureEvaluationContext } from './measure-evaluation-graph.js';
2
3
  import type { TimeMeasureAxis } from './time-measure-axis.js';
3
4
  /** Keep output coordinates separate from each shifted evaluation interval. */
4
- export declare function timeMeasureContextCtes(contexts: readonly MeasureEvaluationContext[], axis: TimeMeasureAxis): string[];
5
- export declare function timeMeasureContextGuard(context: MeasureEvaluationContext, axis: TimeMeasureAxis): string;
5
+ export declare function timeMeasureContextCtes(dialect: DatasetSqlDialectRules, contexts: readonly MeasureEvaluationContext[], axis: TimeMeasureAxis): string[];
6
+ export declare function timeMeasureContextGuard(dialect: DatasetSqlDialectRules, context: MeasureEvaluationContext, axis: TimeMeasureAxis): string;
6
7
  //# sourceMappingURL=time-measure-context-sql.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"time-measure-context-sql.d.ts","sourceRoot":"","sources":["../../src/utils/time-measure-context-sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAO9D,8EAA8E;AAC9E,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,SAAS,wBAAwB,EAAE,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,EAAE,CAerH;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,CAOxG"}
1
+ {"version":3,"file":"time-measure-context-sql.d.ts","sourceRoot":"","sources":["../../src/utils/time-measure-context-sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAM9D,8EAA8E;AAC9E,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,SAAS,wBAAwB,EAAE,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,EAAE,CAgBtJ;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,wBAAwB,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,CAOzI"}
@@ -1,27 +1,27 @@
1
- import { addTimeSql as add, subtractTimeSql as subtract } from './time-arithmetic-sql.js';
2
1
  import { calendarShiftAtFineGrain } from './shift-measure-grains.js';
3
2
  import { calendarBucketGuardSql } from './time-axis-calendar-guard.js';
4
3
  import { shiftWallTimeGuardSql } from './shift-wall-time-sql.js';
5
4
  import { anchoredCalendarShiftSql } from './calendar-shift-sql.js';
6
5
  /** Keep output coordinates separate from each shifted evaluation interval. */
7
- export function timeMeasureContextCtes(contexts, axis) {
8
- const end = add('_hq_period', 1, axis.grain);
9
- const root = `_hq_context0 AS (SELECT _hq_period, _hq_period AS _hq_eval_period, ${end} AS _hq_eval_end, greatest(_hq_period, _hq_lower) AS _hq_eval_lower, least(${end}, _hq_upper) AS _hq_eval_upper, (_hq_period > _hq_lower OR ${Number(axis.lowerInclusive)}) AS _hq_lower_inclusive, (_hq_upper < ${end} AND ${Number(axis.upperInclusive)}) AS _hq_upper_inclusive FROM _hq_series CROSS JOIN _hq_bounds)`;
6
+ export function timeMeasureContextCtes(dialect, contexts, axis) {
7
+ const end = dialect.addTime('_hq_period', 1, axis.grain);
8
+ const root = `_hq_context0 AS (SELECT _hq_period, _hq_period AS _hq_eval_period, ${end} AS _hq_eval_end, ${dialect.greatest('_hq_period', '_hq_lower')} AS _hq_eval_lower, ${dialect.least(end, '_hq_upper')} AS _hq_eval_upper, (_hq_period > _hq_lower OR ${Number(axis.lowerInclusive)}) AS _hq_lower_inclusive, (_hq_upper < ${end} AND ${Number(axis.upperInclusive)}) AS _hq_upper_inclusive FROM _hq_series CROSS JOIN _hq_bounds)`;
10
9
  return [root, ...contexts.slice(1).map(context => {
11
10
  const interval = context.interval;
12
11
  const calendar = calendarShiftAtFineGrain(interval, axis.grain);
13
- const shift = (value) => subtract(`p.${value}`, interval.amount, interval.unit);
12
+ const shift = (value) => dialect.subtractTime(`p.${value}`, interval.amount, interval.unit);
14
13
  // Partial bounds stay inside the shifted bucket; see anchoredCalendarShiftSql.
15
14
  const shiftBound = (value) => calendar
16
- ? anchoredCalendarShiftSql(`p.${value}`, 'p._hq_eval_period', interval)
15
+ ? anchoredCalendarShiftSql(dialect, `p.${value}`, 'p._hq_eval_period', interval)
17
16
  : shift(value);
18
17
  const period = shift('_hq_eval_period');
19
- const shiftedEnd = calendar ? add(period, 1, axis.grain) : shift('_hq_eval_end');
20
- return `_hq_context${context.id} AS (SELECT p._hq_period, ${period} AS _hq_eval_period, ${shiftedEnd} AS _hq_eval_end, ${shiftBound('_hq_eval_lower')} AS _hq_eval_lower, if(p._hq_eval_upper = p._hq_eval_end, ${shiftedEnd}, ${shiftBound('_hq_eval_upper')}) AS _hq_eval_upper, p._hq_lower_inclusive, p._hq_upper_inclusive FROM _hq_context${context.parent} AS p)`;
18
+ const shiftedEnd = calendar ? dialect.addTime(period, 1, axis.grain) : shift('_hq_eval_end');
19
+ const upper = dialect.ifElse('p._hq_eval_upper = p._hq_eval_end', shiftedEnd, shiftBound('_hq_eval_upper'));
20
+ return `_hq_context${context.id} AS (SELECT p._hq_period, ${period} AS _hq_eval_period, ${shiftedEnd} AS _hq_eval_end, ${shiftBound('_hq_eval_lower')} AS _hq_eval_lower, ${upper} AS _hq_eval_upper, p._hq_lower_inclusive, p._hq_upper_inclusive FROM _hq_context${context.parent} AS p)`;
21
21
  })];
22
22
  }
23
- export function timeMeasureContextGuard(context, axis) {
24
- const guard = calendarBucketGuardSql('_hq_eval_period', '1', axis.grain);
25
- const wallTimeGuard = context.interval === undefined ? '0' : shiftWallTimeGuardSql(context.interval, axis.grain, `_hq_context${context.parent} AS p`, 'p._hq_eval_period', 'p._hq_eval_lower', 'p._hq_eval_upper', 'p._hq_eval_end');
23
+ export function timeMeasureContextGuard(dialect, context, axis) {
24
+ const guard = calendarBucketGuardSql(dialect, '_hq_eval_period', '1', axis.grain);
25
+ const wallTimeGuard = context.interval === undefined ? '0' : shiftWallTimeGuardSql(dialect, context.interval, axis.grain, `_hq_context${context.parent} AS p`, 'p._hq_eval_period', 'p._hq_eval_lower', 'p._hq_eval_upper', 'p._hq_eval_end');
26
26
  return `(SELECT coalesce(max(${guard}), 0) FROM _hq_context${context.id}) + ${wallTimeGuard}`;
27
27
  }
@@ -1,9 +1,11 @@
1
1
  import type { AnyDatasetInstance, DatasetQuery } from '../types.js';
2
2
  import type { DatasetQueryExecutionOptions } from '../dataset-query.js';
3
+ import { type PlannedStatement } from './statement-parameters.js';
4
+ /** A time-measure statement and the axis check that must run before it. */
5
+ export interface PlannedTimeMeasureStatements {
6
+ readonly statement: PlannedStatement;
7
+ readonly preflight: PlannedStatement;
8
+ }
3
9
  /** Plan source rows → output axis → window/shift values → final projection. */
4
- export declare function buildTimeMeasureDatasetSql(ds: AnyDatasetInstance, query: DatasetQuery, options: DatasetQueryExecutionOptions): {
5
- sql: string;
6
- parameters: unknown[];
7
- timeAxisSql: string;
8
- };
10
+ export declare function buildTimeMeasureDatasetSql(ds: AnyDatasetInstance, query: DatasetQuery, options: DatasetQueryExecutionOptions): PlannedTimeMeasureStatements;
9
11
  //# sourceMappingURL=time-measure-dataset-sql.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"time-measure-dataset-sql.d.ts","sourceRoot":"","sources":["../../src/utils/time-measure-dataset-sql.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAYxE,+EAA+E;AAC/E,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,4BAA4B,GACpC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAmE7D"}
1
+ {"version":3,"file":"time-measure-dataset-sql.d.ts","sourceRoot":"","sources":["../../src/utils/time-measure-dataset-sql.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAOxE,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAOvF,2EAA2E;AAC3E,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;CACtC;AAED,+EAA+E;AAC/E,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,4BAA4B,GACpC,4BAA4B,CAsE9B"}
@@ -5,7 +5,9 @@ import { getBaseMeasure, getDerivedMeasure, isShiftMeasure, isWindowMeasure } fr
5
5
  import { selectedTimeMeasures } from './time-query-measures.js';
6
6
  import { analyzeTimeMeasureAxis } from './time-measure-axis.js';
7
7
  import { validateDatasetQueryInput } from './dataset-query-validation.js';
8
- import { addTimeSql as add } from './time-arithmetic-sql.js';
8
+ import { resolveDatasetSqlDialect } from './dataset-sql-dialect.js';
9
+ import { assertRawSqlForDialect } from './raw-sql-dialect-check.js';
10
+ import { StatementParameters } from './statement-parameters.js';
9
11
  import { shiftBucketCtes } from './shift-measure-sql.js';
10
12
  import { buildTimeMeasureSourceSql } from './time-measure-source-sql.js';
11
13
  import { buildTimeMeasureAxisSql } from './time-measure-axis-sql.js';
@@ -16,6 +18,8 @@ export function buildTimeMeasureDatasetSql(ds, query, options) {
16
18
  const validation = validateDatasetQueryInput(ds, query, options.context);
17
19
  if (!validation.valid)
18
20
  throw new Error(`Invalid dataset query: ${validation.errors.join('; ')}`);
21
+ const dialect = resolveDatasetSqlDialect(options.builderFactory);
22
+ assertRawSqlForDialect(ds, dialect);
19
23
  const { axis } = analyzeTimeMeasureAxis(ds, query);
20
24
  if (!axis || !ds.timeKey)
21
25
  throw new Error('Window measures require a bounded time axis.');
@@ -27,8 +31,9 @@ export function buildTimeMeasureDatasetSql(ds, query, options) {
27
31
  const derived = getDerivedMeasure(ds.measures, name);
28
32
  return derived && Object.values(derived.uses).some(input => getDerivedMeasure(ds.measures, input));
29
33
  });
34
+ const parameters = new StatementParameters(dialect);
30
35
  if (composite)
31
- return buildCompositeTimeMeasureSql(ds, query, options, axis);
36
+ return buildCompositeTimeMeasureSql(ds, query, options, axis, parameters);
32
37
  const timeMeasures = selectedTimeMeasures(ds, query);
33
38
  const windows = [...timeMeasures.values()].filter(isWindowMeasure);
34
39
  const shifts = [...timeMeasures.values()].filter(isShiftMeasure);
@@ -39,25 +44,25 @@ export function buildTimeMeasureDatasetSql(ds, query, options) {
39
44
  Object.values(derived.uses).forEach(input => needed.add(input));
40
45
  }
41
46
  const baseNames = new Set([...needed].map(name => timeMeasures.get(name)?.measure ?? name));
42
- const source = buildTimeMeasureSourceSql(ds, query, baseNames, axis.filters, options);
43
- const timeAxis = buildTimeMeasureAxisSql(source, axis, shifts);
47
+ const source = buildTimeMeasureSourceSql(ds, query, baseNames, axis.filters, options, parameters);
48
+ const timeAxis = buildTimeMeasureAxisSql(parameters, source, axis, shifts);
44
49
  const shiftedInputs = new Map();
45
50
  [...needed].forEach((name, index) => {
46
51
  const measure = timeMeasures.get(name);
47
52
  if (isShiftMeasure(measure))
48
- shiftedInputs.set(name, shiftBucketCtes(measure, axis, index));
53
+ shiftedInputs.set(name, shiftBucketCtes(dialect, measure, axis, index));
49
54
  });
50
55
  // Scan only requested populations: intervening rows must not introduce dimensions.
51
- const end = add('_hq_last', 1, axis.grain);
56
+ const end = dialect.addTime('_hq_last', 1, axis.grain);
52
57
  const populations = [];
53
58
  if ([...needed].some(name => name.includes('.') || getBaseMeasure(ds.measures, name))) {
54
59
  populations.push(`(_hq_time >= _hq_first AND _hq_time < ${end})`);
55
60
  }
56
61
  if (windows.length) {
57
62
  const starts = windows.filter(window => !window.cumulative)
58
- .map(window => windowScanStartSql(window, axis.grain));
63
+ .map(window => windowScanStartSql(dialect, window, axis.grain));
59
64
  const lower = windows.some(window => window.cumulative)
60
- ? '' : ` AND _hq_time >= least(${starts.join(', ')})`;
65
+ ? '' : ` AND _hq_time >= ${dialect.least(...starts)}`;
61
66
  populations.push(`(_hq_time < ${end}${lower})`);
62
67
  }
63
68
  for (const shifted of shiftedInputs.values())
@@ -73,9 +78,9 @@ export function buildTimeMeasureDatasetSql(ds, query, options) {
73
78
  const shifted = shiftedInputs.get(name);
74
79
  return { name, base, rowsSql: shifted.rowsSql, restrictToAxis: false };
75
80
  }
76
- return { name, base, window, rowsSql: windowMeasureRowsSql(window, axis) };
81
+ return { name, base, window, rowsSql: windowMeasureRowsSql(dialect, window, axis) };
77
82
  });
78
- const values = buildTimeMeasureValuesSql(source.dimensions, inputs, axis);
79
- const sql = buildTimeMeasureResultSql(ds, query, options, source.dimensions, [...source.ctes, ...timeAxis.ctes, ...[...shiftedInputs.values()].flatMap(input => input.ctes), scanCte, ...values], `${timeAxis.guard} + ${timeAxis.rangeGuard} + ${timeAxis.postSeriesGuard}`);
80
- return { sql, parameters: source.parameters, timeAxisSql: timeAxis.timeAxisSql };
83
+ const values = buildTimeMeasureValuesSql(dialect, source.dimensions, inputs, axis);
84
+ const text = buildTimeMeasureResultSql(ds, query, options, source.dimensions, [...source.ctes, ...timeAxis.ctes, ...[...shiftedInputs.values()].flatMap(input => input.ctes), scanCte, ...values], `${timeAxis.guard} + ${timeAxis.rangeGuard} + ${timeAxis.postSeriesGuard}`);
85
+ return { statement: { text, parameters }, preflight: { text: timeAxis.timeAxisSql, parameters } };
81
86
  }
@@ -1,8 +1,9 @@
1
+ import type { DatasetSqlDialectRules } from '../dataset-sql-dialect.js';
1
2
  import type { WindowMeasureDefinition } from '../types.js';
2
3
  import type { TimeMeasureAxis } from './time-measure-axis.js';
3
- import type { TimeMeasureSqlBase, TimeMeasureSqlDimension } from './time-measure-source-sql.js';
4
+ import { type TimeMeasureSqlBase, type TimeMeasureSqlDimension } from './time-measure-source-sql.js';
4
5
  /** Keyed source membership retains distinct/average semantics and row multiplicity. */
5
- export declare function timeMeasureLeafSql(id: number, context: number, base: TimeMeasureSqlBase, window: WindowMeasureDefinition | undefined, axis: TimeMeasureAxis, dims: readonly TimeMeasureSqlDimension[]): {
6
+ export declare function timeMeasureLeafSql(dialect: DatasetSqlDialectRules, id: number, context: number, base: TimeMeasureSqlBase, window: WindowMeasureDefinition | undefined, axis: TimeMeasureAxis, dims: readonly TimeMeasureSqlDimension[]): {
6
7
  ctes: string[];
7
8
  population: string;
8
9
  aggregate: string;
@@ -1 +1 @@
1
- {"version":3,"file":"time-measure-leaf-sql.d.ts","sourceRoot":"","sources":["../../src/utils/time-measure-leaf-sql.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAMhG,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,uBAAuB,GAAG,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,uBAAuB,EAAE;;;;;;;;EA6CrM"}
1
+ {"version":3,"file":"time-measure-leaf-sql.d.ts","sourceRoot":"","sources":["../../src/utils/time-measure-leaf-sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAqB,KAAK,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAKxH,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,uBAAuB,GAAG,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,uBAAuB,EAAE;;;;;;;;EA+CtO"}
@@ -1,50 +1,51 @@
1
- import { GRAIN_FUNCTIONS } from '../constants.js';
2
- import { addTimeSql as add, subtractTimeSql as subtract } from './time-arithmetic-sql.js';
1
+ import { sourceTimezoneSql } from './time-measure-source-sql.js';
3
2
  import { calendarBucketGuardSql } from './time-axis-calendar-guard.js';
4
3
  import { shiftRangePredicateSql } from './shift-measure-sql.js';
5
- import { isCountAggregation, windowAggregateSql } from './window-aggregation-sql.js';
4
+ import { isCountAggregation } from './count-aggregations.js';
6
5
  /** Keyed source membership retains distinct/average semantics and row multiplicity. */
7
- export function timeMeasureLeafSql(id, context, base, window, axis, dims) {
6
+ export function timeMeasureLeafSql(dialect, id, context, base, window, axis, dims) {
8
7
  const keys = dims.map(dim => dim.alias);
9
8
  const ranges = `_hq_ranges${id}`;
10
9
  const rows = `_hq_rows${id}`;
11
10
  const aggregate = `_hq_leaf${id}`;
12
11
  const value = `_hq_value${id}`;
13
12
  const group = `_hq_period${keys.length ? `, ${keys.join(', ')}` : ''}`;
14
- const expression = windowAggregateSql(base.definition, base.value, base.arg);
13
+ const expression = dialect.windowAggregate(base.definition, base.value, base.arg);
15
14
  if (window?.cumulative) {
16
15
  const population = `_hq_history${id}`;
17
16
  const partial = `_hq_partial${id}`;
18
17
  const operation = base.definition.aggregation === 'count' ? 'sum' : base.definition.aggregation;
19
- const partition = keys.length ? `tuple(${keys.join(', ')})` : 'tuple(0)';
18
+ const partition = dialect.packRow(keys.length ? keys : ['0']);
20
19
  const historyGroup = `_hq_time${keys.length ? `, ${keys.join(', ')}` : ''}`;
21
20
  return {
22
21
  ctes: [
23
22
  `${population} AS (SELECT * FROM _hq_source WHERE _hq_time < (SELECT max(_hq_eval_end) FROM _hq_context${context}))`,
24
- `${partial} AS (SELECT ${historyGroup}, ${partition} AS _hq_partition, toNullable(${expression}) AS _hq_partial FROM ${population} GROUP BY ${historyGroup})`,
25
- `${aggregate} AS (SELECT _hq_time, _hq_partition, ${operation}OrNull(_hq_partial) OVER (PARTITION BY _hq_partition ORDER BY _hq_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS ${value} FROM ${partial})`,
23
+ `${partial} AS (SELECT ${historyGroup}, ${partition} AS _hq_partition, ${dialect.toNullable(expression)} AS _hq_partial FROM ${population} GROUP BY ${historyGroup})`,
24
+ `${aggregate} AS (SELECT _hq_time, _hq_partition, ${dialect.reaggregate(operation, '_hq_partial')} OVER (PARTITION BY _hq_partition ORDER BY _hq_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS ${value} FROM ${partial})`,
26
25
  ],
27
26
  population, aggregate, context, cumulative: true, guard: '0',
28
27
  count: isCountAggregation(base.definition),
29
28
  };
30
29
  }
31
- const lower = window?.trailing ? subtract('_hq_eval_end', window.trailing.amount, window.trailing.unit)
32
- : window?.toDate ? `${GRAIN_FUNCTIONS[window.toDate]}(_hq_eval_period)` : '_hq_eval_lower';
30
+ const lower = window?.trailing ? dialect.subtractTime('_hq_eval_end', window.trailing.amount, window.trailing.unit)
31
+ // Keep the to-date start zoned: a calendar Date would bucket in server time.
32
+ : window?.toDate ? dialect.truncateTimeInZone('_hq_eval_period', window.toDate, sourceTimezoneSql(dialect)) : '_hq_eval_lower';
33
33
  const upper = window ? '_hq_eval_end' : '_hq_eval_upper';
34
34
  const lowerInclusive = window ? '1' : '_hq_lower_inclusive';
35
35
  const upperInclusive = window ? '0' : '_hq_upper_inclusive';
36
- const first = `${GRAIN_FUNCTIONS[axis.grain]}(_hq_scan_lower)`;
37
- const last = `${GRAIN_FUNCTIONS[axis.grain]}(_hq_scan_upper)`;
38
- const count = `greatest(0, dateDiff('${axis.grain}', ${first}, ${last}) + if(_hq_scan_upper > ${last} OR _hq_scan_upper_inclusive, 1, 0))`;
39
- const fanout = window ? `throwIf(${count} > 1000, 'A window row contributes to more than 1000 buckets.')` : '0';
40
- const guard = `${fanout} + ${calendarBucketGuardSql(first, `${count} + ${fanout}`, axis.grain)}`;
36
+ const first = dialect.truncateTime('_hq_scan_lower', axis.grain);
37
+ const last = dialect.truncateTime('_hq_scan_upper', axis.grain);
38
+ const partialUpper = dialect.ifElse(`_hq_scan_upper > ${last} OR _hq_scan_upper_inclusive`, '1', '0');
39
+ const count = dialect.greatest('0', `${dialect.timeDiff(axis.grain, first, last)} + ${partialUpper}`);
40
+ const fanout = window ? dialect.guard(`${count} > 1000`, 'A window row contributes to more than 1000 buckets.') : '0';
41
+ const guard = `${fanout} + ${calendarBucketGuardSql(dialect, first, `${count} + ${fanout}`, axis.grain)}`;
41
42
  const predicate = shiftRangePredicateSql('r._hq_time', { lower: 'b._hq_scan_lower', upper: 'b._hq_scan_upper', lowerInclusive: 'b._hq_scan_lower_inclusive', upperInclusive: 'b._hq_scan_upper_inclusive' });
42
43
  return {
43
44
  ctes: [
44
45
  `${ranges} AS (SELECT _hq_period, ${lower} AS _hq_scan_lower, ${upper} AS _hq_scan_upper, ${lowerInclusive} AS _hq_scan_lower_inclusive, ${upperInclusive} AS _hq_scan_upper_inclusive FROM _hq_context${context})`,
45
- `_hq_keys${id} AS (SELECT *, ${add(first, `arrayJoin(range(toUInt64(${count} + ${guard})))`, axis.grain)} AS _hq_source_period FROM ${ranges})`,
46
- `${rows} AS (SELECT r.*, b._hq_period FROM _hq_source AS r INNER JOIN _hq_keys${id} AS b ON ${GRAIN_FUNCTIONS[axis.grain]}(r._hq_time) = b._hq_source_period WHERE ${predicate})`,
47
- `${aggregate} AS (SELECT ${group}, toNullable(${expression}) AS ${value} FROM ${rows} GROUP BY ${group})`,
46
+ `_hq_keys${id} AS (SELECT *, ${dialect.addTime(first, dialect.seriesIndex(`${count} + ${guard}`), axis.grain)} AS _hq_source_period FROM ${ranges})`,
47
+ `${rows} AS (SELECT r.*, b._hq_period FROM _hq_source AS r INNER JOIN _hq_keys${id} AS b ON ${dialect.truncateTime('r._hq_time', axis.grain)} = b._hq_source_period WHERE ${predicate})`,
48
+ `${aggregate} AS (SELECT ${group}, ${dialect.toNullable(expression)} AS ${value} FROM ${rows} GROUP BY ${group})`,
48
49
  ],
49
50
  population: rows, aggregate, context, cumulative: false,
50
51
  guard: `(SELECT coalesce(max(${guard}), 0) FROM ${ranges})`, count: isCountAggregation(base.definition),
@@ -1 +1 @@
1
- {"version":3,"file":"time-measure-result-sql.d.ts","sourceRoot":"","sources":["../../src/utils/time-measure-result-sql.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAIxE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5E,sFAAsF;AACtF,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,4BAA4B,EACrC,IAAI,EAAE,SAAS,uBAAuB,EAAE,EACxC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,eAAe,EAAE,MAAM,EACvB,iBAAiB,UAAQ,GACxB,MAAM,CAuBR"}
1
+ {"version":3,"file":"time-measure-result-sql.d.ts","sourceRoot":"","sources":["../../src/utils/time-measure-result-sql.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAIxE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5E,sFAAsF;AACtF,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,4BAA4B,EACrC,IAAI,EAAE,SAAS,uBAAuB,EAAE,EACxC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,eAAe,EAAE,MAAM,EACvB,iBAAiB,UAAQ,GACxB,MAAM,CAwBR"}
@@ -1,31 +1,30 @@
1
1
  import { semanticOrderDirection } from './semantic-query-syntax.js';
2
- import { quoteSQLIdentifier } from '../sql-utils.js';
2
+ import { resolveDatasetSqlDialect } from './dataset-sql-dialect.js';
3
3
  import { getDerivedMeasure } from './dataset-measures.js';
4
4
  import { derivedProjection } from './derived-measure-sql.js';
5
5
  /** Evaluate formulas after aggregation, then apply output ordering and pagination. */
6
6
  export function buildTimeMeasureResultSql(ds, query, options, dims, ctes, validationGuard, formulasEvaluated = false) {
7
+ const dialect = resolveDatasetSqlDialect(options.builderFactory);
8
+ const quote = dialect.quoteIdentifier;
7
9
  const selected = query.measures ?? [];
8
10
  const projections = [
9
- quoteSQLIdentifier('period'),
10
- ...dims.map(dimension => quoteSQLIdentifier(dimension.name)),
11
+ quote('period'),
12
+ ...dims.map(dimension => quote(dimension.name)),
11
13
  ...selected.map(name => {
12
14
  const derived = getDerivedMeasure(ds.measures, name);
13
- return derived && !formulasEvaluated ? derivedProjection(name, derived) : quoteSQLIdentifier(name);
15
+ return derived && !formulasEvaluated ? derivedProjection(dialect, name, derived) : quote(name);
14
16
  }),
15
17
  ];
16
18
  // Keep toSQL independently guarded too. This branch produces no valid
17
19
  // result rows, and forces axis validation even when _hq_values is empty.
18
20
  const outputNames = ['period', ...dims.map(dimension => dimension.name), ...selected];
19
- const nullProjections = outputNames.map(name => `NULL AS ${quoteSQLIdentifier(name)}`).join(', ');
21
+ const nullProjections = outputNames.map(name => `NULL AS ${quote(name)}`).join(', ');
20
22
  const resultCte = `_hq_result AS (SELECT ${projections.join(', ')} FROM _hq_values`
21
23
  + ` UNION ALL SELECT ${nullProjections} FROM _hq_bounds WHERE ${validationGuard} = 1)`;
22
- let sql = `WITH ${[...ctes, resultCte].join(',\n')} SELECT ${outputNames.map(quoteSQLIdentifier).join(', ')} FROM _hq_result`;
24
+ let sql = `WITH ${[...ctes, resultCte].join(',\n')} SELECT ${outputNames.map(name => quote(name)).join(', ')} FROM _hq_result`;
23
25
  const order = query.orderBy?.length ? query.orderBy : [{ field: 'period', direction: 'asc' }];
24
- sql += ` ORDER BY ${order.map(item => `${quoteSQLIdentifier(item.field)} ${semanticOrderDirection(item.direction)}`).join(', ')}`;
26
+ sql += ` ORDER BY ${order.map(item => dialect.orderTerm(quote(item.field), semanticOrderDirection(item.direction))).join(', ')}`;
25
27
  const limit = options.executionLimit ?? query.limit;
26
- if (limit !== undefined)
27
- sql += ` LIMIT ${limit}`;
28
- if (query.offset !== undefined)
29
- sql += ` OFFSET ${query.offset}`;
28
+ sql += dialect.paginate(limit, query.offset);
30
29
  return sql;
31
30
  }
@@ -1,5 +1,7 @@
1
1
  import type { AnyDatasetInstance, DatasetQuery, MeasureDefinition, MetricFilter } from '../types.js';
2
2
  import type { DatasetQueryExecutionOptions } from '../dataset-query.js';
3
+ import type { StatementParameters } from './statement-parameters.js';
4
+ import type { DatasetSqlDialectRules } from '../dataset-sql-dialect.js';
3
5
  export interface TimeMeasureSqlDimension {
4
6
  name: string;
5
7
  alias: string;
@@ -12,11 +14,12 @@ export interface TimeMeasureSqlBase {
12
14
  }
13
15
  export interface TimeMeasureSqlSource {
14
16
  ctes: string[];
15
- parameters: unknown[];
16
17
  dimensions: TimeMeasureSqlDimension[];
17
18
  bases: TimeMeasureSqlBase[];
18
19
  rowAlias: string;
19
20
  }
21
+ /** The query timezone carried by `_hq_source` time, read from a zero-row scalar without scanning. */
22
+ export declare function sourceTimezoneSql(dialect: DatasetSqlDialectRules): string;
20
23
  /** Isolate authored expressions, joins, tenancy and filters from internal SQL aliases. */
21
- export declare function buildTimeMeasureSourceSql(ds: AnyDatasetInstance, query: DatasetQuery, baseNames: Iterable<string>, filters: readonly MetricFilter[], options: DatasetQueryExecutionOptions): TimeMeasureSqlSource;
24
+ export declare function buildTimeMeasureSourceSql(ds: AnyDatasetInstance, query: DatasetQuery, baseNames: Iterable<string>, filters: readonly MetricFilter[], options: DatasetQueryExecutionOptions, statement: StatementParameters): TimeMeasureSqlSource;
22
25
  //# sourceMappingURL=time-measure-source-sql.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"time-measure-source-sql.d.ts","sourceRoot":"","sources":["../../src/utils/time-measure-source-sql.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAUxE,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,iBAAiB,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,OAAO,EAAE,CAAC;IACtB,UAAU,EAAE,uBAAuB,EAAE,CAAC;IACtC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,0FAA0F;AAC1F,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC3B,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,OAAO,EAAE,4BAA4B,GACpC,oBAAoB,CA6DtB"}
1
+ {"version":3,"file":"time-measure-source-sql.d.ts","sourceRoot":"","sources":["../../src/utils/time-measure-source-sql.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAQxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAExE,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,iBAAiB,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,uBAAuB,EAAE,CAAC;IACtC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qGAAqG;AACrG,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAEzE;AAED,0FAA0F;AAC1F,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC3B,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,OAAO,EAAE,4BAA4B,EACrC,SAAS,EAAE,mBAAmB,GAC7B,oBAAoB,CAoEtB"}
@@ -1,21 +1,28 @@
1
+ import { scopedDatasetSource } from './scoped-dataset-source.js';
1
2
  import { resolveRelationshipMeasure } from './relationship-measures.js';
2
3
  import { relationshipMeasureExpressions } from './relationship-measure-sql.js';
3
- import { queryTimeSql } from './query-timezone.js';
4
- import { resolveDimensionExpression, resolveFilterField, resolveTenantFilterColumn } from '../query-planner.js';
5
- import { applyRelationshipJoins, buildRelationshipBuilderContext, qualifyBaseColumn } from './relationship-builder-plan.js';
6
- import { getRuntimeTenantPredicate } from './tenant-runtime.js';
4
+ import { queryTimeFilter, queryTimeSql } from './query-timezone.js';
5
+ import { resolveDimensionExpression, resolveFilterField } from '../query-planner.js';
6
+ import { buildRelationshipBuilderContext } from './relationship-builder-plan.js';
7
7
  import { segmentFilters } from './segments.js';
8
8
  import { getBaseMeasure } from './dataset-measures.js';
9
9
  import { measureToAggregationSpec } from './dataset-normalization.js';
10
10
  import { applyFilteredAggregationExpression } from './filtered-aggregation-sql.js';
11
11
  import { assertNoRawSqlUnderJoins } from './sql-under-joins.js';
12
+ /** The query timezone carried by `_hq_source` time, read from a zero-row scalar without scanning. */
13
+ export function sourceTimezoneSql(dialect) {
14
+ return dialect.timezoneOf(dialect.assumeNotNull('(SELECT _hq_time FROM _hq_source LIMIT 0)'));
15
+ }
12
16
  /** Isolate authored expressions, joins, tenancy and filters from internal SQL aliases. */
13
- export function buildTimeMeasureSourceSql(ds, query, baseNames, filters, options) {
17
+ export function buildTimeMeasureSourceSql(ds, query, baseNames, filters, options, statement) {
18
+ const { dialect } = statement;
14
19
  const bases = [];
15
- const joinCtx = buildRelationshipBuilderContext(ds, query, options.context);
20
+ const joinCtx = buildRelationshipBuilderContext(ds, query, options.context, dialect);
16
21
  // Keep source expressions in their own SELECT scope: internal aliases cannot
17
22
  // capture authored SQL identifiers, even if a physical column shares a name.
18
- let raw = applyRelationshipJoins(options.builderFactory.table(ds.source), joinCtx);
23
+ let raw = scopedDatasetSource({
24
+ builderFactory: options.builderFactory, ds, context: options.context, joinCtx, dialect, timezone: query.timezone,
25
+ });
19
26
  const dims = (query.dimensions ?? []).map((name, i) => ({ name, alias: `_hq_d${i}` }));
20
27
  const sourceParts = [resolveDimensionExpression(ds, ds.timeKey, joinCtx)];
21
28
  for (const dimension of dims)
@@ -31,9 +38,9 @@ export function buildTimeMeasureSourceSql(ds, query, baseNames, filters, options
31
38
  const value = `_hq_v${bases.length}`;
32
39
  const arg = `_hq_a${bases.length}`;
33
40
  bases.push({ name, definition, value, arg });
34
- const expressions = related ? relationshipMeasureExpressions(ds, name, joinCtx) : undefined;
41
+ const expressions = related ? relationshipMeasureExpressions(ds, name, joinCtx, dialect) : undefined;
35
42
  const expression = expressions?.field ?? spec.sql ?? resolveDimensionExpression(ds, spec.field, joinCtx);
36
- sourceParts.push(expressions ? expression : applyFilteredAggregationExpression(ds, spec, expression, joinCtx));
43
+ sourceParts.push(expressions ? expression : applyFilteredAggregationExpression(ds, spec, expression, joinCtx, dialect));
37
44
  sourceParts.push(expressions?.arg ?? (spec.argField ? resolveDimensionExpression(ds, spec.argField, joinCtx) : 'NULL'));
38
45
  }
39
46
  // A positional tuple isolates internal names from the source table's names.
@@ -47,31 +54,34 @@ export function buildTimeMeasureSourceSql(ds, query, baseNames, filters, options
47
54
  let rowAlias = '_hq_row';
48
55
  while (sourceIdentifiers.some(text => text.includes(rowAlias)))
49
56
  rowAlias += '_';
50
- raw = raw.select([`tuple(${sourceParts.join(', ')}) AS ${rowAlias}`]);
51
- const tenant = getRuntimeTenantPredicate(options.context);
52
- const tenantColumn = resolveTenantFilterColumn(ds, options.context);
53
- if (tenant && tenantColumn)
54
- raw = raw.where(qualifyBaseColumn(joinCtx, tenantColumn), tenant.operator, tenant.value);
57
+ raw = raw.select([`${dialect.packRow(sourceParts)} AS ${rowAlias}`]);
58
+ // The time axis already consumed every time-key bound, so these are the
59
+ // remaining caller filters.
55
60
  for (const filter of filters) {
56
- raw = raw.where(resolveFilterField(ds, filter.field, joinCtx), filter.operator, filter.value);
61
+ const predicates = queryTimeFilter(dialect, ds, filter, resolveFilterField(ds, filter.field, joinCtx), query.timezone);
62
+ for (const predicate of predicates) {
63
+ raw = raw.where(predicate.expression, predicate.operator, predicate.value);
64
+ }
57
65
  }
58
66
  for (const filter of segmentFilters(ds, query.segments)) {
59
- raw = raw.where(resolveDimensionExpression(ds, filter.field, joinCtx), filter.operator, filter.value);
67
+ const predicates = queryTimeFilter(dialect, ds, filter, resolveDimensionExpression(ds, filter.field, joinCtx), query.timezone, { field: 'dimension' });
68
+ for (const predicate of predicates) {
69
+ raw = raw.where(predicate.expression, predicate.operator, predicate.value);
70
+ }
60
71
  }
61
- const { sql: rawSql, parameters } = raw.toSQLWithParams();
62
- const sourceColumns = [`${queryTimeSql(`assumeNotNull(tupleElement(${rowAlias}, 1))`, query.timezone)} AS _hq_time`];
63
- dims.forEach((dimension, i) => sourceColumns.push(`tupleElement(${rowAlias}, ${i + 2}) AS ${dimension.alias}`));
72
+ const rawSql = statement.embedBuilder(raw);
73
+ const sourceColumns = [`${queryTimeSql(dialect, dialect.assumeNotNull(dialect.rowElement(rowAlias, 1)), query.timezone)} AS _hq_time`];
74
+ dims.forEach((dimension, i) => sourceColumns.push(`${dialect.rowElement(rowAlias, i + 2)} AS ${dimension.alias}`));
64
75
  bases.forEach((base, i) => {
65
76
  const valuePosition = dims.length + 2 + i * 2;
66
- sourceColumns.push(`tupleElement(${rowAlias}, ${valuePosition}) AS ${base.value}`);
67
- sourceColumns.push(`tupleElement(${rowAlias}, ${valuePosition + 1}) AS ${base.arg}`);
77
+ sourceColumns.push(`${dialect.rowElement(rowAlias, valuePosition)} AS ${base.value}`);
78
+ sourceColumns.push(`${dialect.rowElement(rowAlias, valuePosition + 1)} AS ${base.arg}`);
68
79
  });
69
80
  return {
70
81
  ctes: [
71
82
  `_hq_raw AS (${rawSql})`,
72
- `_hq_source AS (SELECT ${sourceColumns.join(', ')} FROM _hq_raw WHERE isNotNull(tupleElement(${rowAlias}, 1)))`,
83
+ `_hq_source AS (SELECT ${sourceColumns.join(', ')} FROM _hq_raw WHERE ${dialect.isNotNull(dialect.rowElement(rowAlias, 1))})`,
73
84
  ],
74
- parameters,
75
85
  dimensions: dims,
76
86
  bases,
77
87
  rowAlias,
@@ -1,3 +1,4 @@
1
+ import type { DatasetSqlDialectRules } from '../dataset-sql-dialect.js';
1
2
  import type { TimeGrain, WindowMeasureDefinition } from '../types.js';
2
3
  import type { TimeMeasureAxis } from './time-measure-axis.js';
3
4
  import type { TimeMeasureSqlBase, TimeMeasureSqlDimension } from './time-measure-source-sql.js';
@@ -12,9 +13,9 @@ export interface TimeMeasureSqlInput {
12
13
  /** Shift populations already map exclusively to the requested output series. */
13
14
  restrictToAxis?: boolean;
14
15
  }
15
- export declare function windowScanStartSql(window: WindowMeasureDefinition, grain: TimeGrain): string;
16
+ export declare function windowScanStartSql(dialect: DatasetSqlDialectRules, window: WindowMeasureDefinition, grain: TimeGrain): string;
16
17
  /** Base measures respect partial endpoints; windows use entire contributing buckets. */
17
- export declare function windowMeasureRowsSql(window: WindowMeasureDefinition | undefined, axis: TimeMeasureAxis): string;
18
+ export declare function windowMeasureRowsSql(dialect: DatasetSqlDialectRules, window: WindowMeasureDefinition | undefined, axis: TimeMeasureAxis): string;
18
19
  /** Fill dimension combinations, aggregate populations, and join measure values onto the series. */
19
- export declare function buildTimeMeasureValuesSql(dims: readonly TimeMeasureSqlDimension[], inputs: readonly TimeMeasureSqlInput[], axis: TimeMeasureAxis): string[];
20
+ export declare function buildTimeMeasureValuesSql(dialect: DatasetSqlDialectRules, dims: readonly TimeMeasureSqlDimension[], inputs: readonly TimeMeasureSqlInput[], axis: TimeMeasureAxis): string[];
20
21
  //# sourceMappingURL=time-measure-values-sql.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"time-measure-values-sql.d.ts","sourceRoot":"","sources":["../../src/utils/time-measure-values-sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAGtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAKhG,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,gFAAgF;IAChF,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAwBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,uBAAuB,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAI5F;AAED,wFAAwF;AACxF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,uBAAuB,GAAG,SAAS,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,CAG/G;AAED,mGAAmG;AACnG,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,SAAS,uBAAuB,EAAE,EACxC,MAAM,EAAE,SAAS,mBAAmB,EAAE,EACtC,IAAI,EAAE,eAAe,GACpB,MAAM,EAAE,CA0CV"}
1
+ {"version":3,"file":"time-measure-values-sql.d.ts","sourceRoot":"","sources":["../../src/utils/time-measure-values-sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAIhG,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,gFAAgF;IAChF,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAwBD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,uBAAuB,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAI7H;AAED,wFAAwF;AACxF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,uBAAuB,GAAG,SAAS,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,CAGhJ;AAED,mGAAmG;AACnG,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,sBAAsB,EAC/B,IAAI,EAAE,SAAS,uBAAuB,EAAE,EACxC,MAAM,EAAE,SAAS,mBAAmB,EAAE,EACtC,IAAI,EAAE,eAAe,GACpB,MAAM,EAAE,CA0CV"}