@hypequery/datasets 0.21.0 → 0.22.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 (127) hide show
  1. package/README.md +6 -0
  2. package/dist/api.type-test.js +7 -0
  3. package/dist/catalog.d.ts +4 -0
  4. package/dist/catalog.d.ts.map +1 -1
  5. package/dist/catalog.js +10 -1
  6. package/dist/dataset-compilation.d.ts +45 -0
  7. package/dist/dataset-compilation.d.ts.map +1 -0
  8. package/dist/dataset-compilation.js +1 -0
  9. package/dist/dataset-query.d.ts +3 -3
  10. package/dist/dataset-query.d.ts.map +1 -1
  11. package/dist/dataset-query.js +7 -71
  12. package/dist/dataset-sql-dialect.d.ts +11 -0
  13. package/dist/dataset-sql-dialect.d.ts.map +1 -0
  14. package/dist/dataset-sql-dialect.js +1 -0
  15. package/dist/dataset.d.ts +3 -2
  16. package/dist/dataset.d.ts.map +1 -1
  17. package/dist/execution-capabilities.d.ts +28 -0
  18. package/dist/execution-capabilities.d.ts.map +1 -0
  19. package/dist/execution-capabilities.js +17 -0
  20. package/dist/execution-capabilities.json +13 -0
  21. package/dist/executor.d.ts +17 -38
  22. package/dist/executor.d.ts.map +1 -1
  23. package/dist/executor.js +37 -400
  24. package/dist/index.d.ts +9 -4
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +3 -2
  27. package/dist/internal.d.ts +3 -0
  28. package/dist/internal.d.ts.map +1 -1
  29. package/dist/internal.js +2 -0
  30. package/dist/measure.d.ts +54 -17
  31. package/dist/measure.d.ts.map +1 -1
  32. package/dist/measure.js +3 -63
  33. package/dist/metric-query-engine.d.ts +29 -0
  34. package/dist/metric-query-engine.d.ts.map +1 -0
  35. package/dist/metric-query-engine.js +106 -0
  36. package/dist/portable-executor.d.ts +20 -6
  37. package/dist/portable-executor.d.ts.map +1 -1
  38. package/dist/portable-executor.js +29 -9
  39. package/dist/query-builder-protocol.d.ts +4 -0
  40. package/dist/query-builder-protocol.d.ts.map +1 -1
  41. package/dist/query-helpers.d.ts +10 -10
  42. package/dist/query-helpers.d.ts.map +1 -1
  43. package/dist/query-helpers.js +1 -3
  44. package/dist/query-planner.d.ts +7 -3
  45. package/dist/query-planner.d.ts.map +1 -1
  46. package/dist/query-planner.js +10 -12
  47. package/dist/semantic-planner.d.ts.map +1 -1
  48. package/dist/semantic-planner.js +2 -0
  49. package/dist/semantic-query-schema.d.ts.map +1 -1
  50. package/dist/semantic-query-schema.js +3 -3
  51. package/dist/types.d.ts +18 -11
  52. package/dist/types.d.ts.map +1 -1
  53. package/dist/utils/agent-catalog-projection.d.ts +1 -0
  54. package/dist/utils/agent-catalog-projection.d.ts.map +1 -1
  55. package/dist/utils/agent-catalog-projection.js +2 -1
  56. package/dist/utils/base-measure-definition.d.ts +23 -0
  57. package/dist/utils/base-measure-definition.d.ts.map +1 -0
  58. package/dist/utils/base-measure-definition.js +65 -0
  59. package/dist/utils/build-dataset-query-builder.d.ts +5 -0
  60. package/dist/utils/build-dataset-query-builder.d.ts.map +1 -0
  61. package/dist/utils/build-dataset-query-builder.js +62 -0
  62. package/dist/utils/clickhouse-dataset-sql-dialect.d.ts +4 -0
  63. package/dist/utils/clickhouse-dataset-sql-dialect.d.ts.map +1 -0
  64. package/dist/utils/clickhouse-dataset-sql-dialect.js +6 -0
  65. package/dist/utils/compile-dataset-query.d.ts +10 -0
  66. package/dist/utils/compile-dataset-query.d.ts.map +1 -0
  67. package/dist/utils/compile-dataset-query.js +71 -0
  68. package/dist/utils/composite-time-measure-sql.d.ts.map +1 -1
  69. package/dist/utils/composite-time-measure-sql.js +2 -1
  70. package/dist/utils/dataset-derived-query.d.ts +1 -2
  71. package/dist/utils/dataset-derived-query.d.ts.map +1 -1
  72. package/dist/utils/dataset-derived-query.js +12 -26
  73. package/dist/utils/dataset-filter-types.d.ts +28 -0
  74. package/dist/utils/dataset-filter-types.d.ts.map +1 -0
  75. package/dist/utils/dataset-filter-types.js +1 -0
  76. package/dist/utils/dataset-query-validation.d.ts.map +1 -1
  77. package/dist/utils/dataset-query-validation.js +15 -3
  78. package/dist/utils/dataset-sql-dialect.d.ts +5 -0
  79. package/dist/utils/dataset-sql-dialect.d.ts.map +1 -0
  80. package/dist/utils/dataset-sql-dialect.js +5 -0
  81. package/dist/utils/dataset-target.d.ts +3 -0
  82. package/dist/utils/dataset-target.d.ts.map +1 -0
  83. package/dist/utils/dataset-target.js +3 -0
  84. package/dist/utils/filter-definition.d.ts +3 -0
  85. package/dist/utils/filter-definition.d.ts.map +1 -0
  86. package/dist/utils/filter-definition.js +3 -0
  87. package/dist/utils/metric-derived-query.d.ts +8 -0
  88. package/dist/utils/metric-derived-query.d.ts.map +1 -0
  89. package/dist/utils/metric-derived-query.js +106 -0
  90. package/dist/utils/metric-query-builder.d.ts +5 -0
  91. package/dist/utils/metric-query-builder.d.ts.map +1 -0
  92. package/dist/utils/metric-query-builder.js +50 -0
  93. package/dist/utils/metric-query-result.d.ts +10 -0
  94. package/dist/utils/metric-query-result.d.ts.map +1 -0
  95. package/dist/utils/metric-query-result.js +18 -0
  96. package/dist/utils/metric-query-validation.d.ts +6 -0
  97. package/dist/utils/metric-query-validation.d.ts.map +1 -0
  98. package/dist/utils/metric-query-validation.js +116 -0
  99. package/dist/utils/relationship-builder-plan.d.ts +4 -2
  100. package/dist/utils/relationship-builder-plan.d.ts.map +1 -1
  101. package/dist/utils/relationship-builder-plan.js +10 -13
  102. package/dist/utils/relationship-measure-sql.d.ts +14 -0
  103. package/dist/utils/relationship-measure-sql.d.ts.map +1 -0
  104. package/dist/utils/relationship-measure-sql.js +44 -0
  105. package/dist/utils/relationship-measure-types.d.ts +36 -0
  106. package/dist/utils/relationship-measure-types.d.ts.map +1 -0
  107. package/dist/utils/relationship-measure-types.js +1 -0
  108. package/dist/utils/relationship-measures.d.ts +23 -0
  109. package/dist/utils/relationship-measures.d.ts.map +1 -0
  110. package/dist/utils/relationship-measures.js +62 -0
  111. package/dist/utils/relationship-validation.d.ts +1 -1
  112. package/dist/utils/relationship-validation.d.ts.map +1 -1
  113. package/dist/utils/relationship-validation.js +3 -5
  114. package/dist/utils/semantic-query-syntax.d.ts +6 -0
  115. package/dist/utils/semantic-query-syntax.d.ts.map +1 -0
  116. package/dist/utils/semantic-query-syntax.js +25 -0
  117. package/dist/utils/snapshot-execution-context.d.ts +4 -0
  118. package/dist/utils/snapshot-execution-context.d.ts.map +1 -0
  119. package/dist/utils/snapshot-execution-context.js +16 -0
  120. package/dist/utils/time-measure-dataset-sql.d.ts.map +1 -1
  121. package/dist/utils/time-measure-dataset-sql.js +3 -2
  122. package/dist/utils/time-measure-result-sql.d.ts.map +1 -1
  123. package/dist/utils/time-measure-result-sql.js +2 -1
  124. package/dist/utils/time-measure-source-sql.d.ts.map +1 -1
  125. package/dist/utils/time-measure-source-sql.js +8 -4
  126. package/dist/validation.js +1 -1
  127. package/package.json +2 -1
package/dist/executor.js CHANGED
@@ -1,386 +1,23 @@
1
- import { queryTimezoneErrors, queryTimeFilterSql } from './utils/query-timezone.js';
2
- import { selectedTimeMeasures, rejectTimeMeasuresOnBackend } from './utils/time-query-measures.js';
3
- import { buildTimeMeasureDatasetSql } from './utils/time-measure-dataset-sql.js';
4
- import { baseMeasureNames } from './utils/dataset-measures.js';
5
- import { protocolMetricCapabilityErrors } from './utils/protocol-metric-capabilities.js';
6
1
  import { toQueryBuilderFactory } from './query-builder-protocol.js';
7
- import { quoteSQLIdentifier, validateSQLIdentifier } from './sql-utils.js';
8
- import { unsupportedTimeGrainError } from './utils/dataset-time-grains.js';
9
- import { validateFilterValue } from './validation.js';
10
- import { applyAggregationSpec, appendOrderLimitOffset, buildDimensionSelectionPlan, resolveDimensionExpression, resolveFilterField, resolveTenantFilterColumn, } from './query-planner.js';
11
- import { assertMetricHandle, getMetricGrain, getMetricRef, isTenantScopedFilter, } from './utils/metric-handle.js';
12
- import { validateDerivedCteGrouping } from './utils/derived-cte-validation.js';
13
- import { buildDatasetQueryBuilder, runDatasetQuery, validateDatasetQuery, } from './dataset-query.js';
14
- import { buildDerivedDatasetSql, hasSelectedDerivedMeasure, } from './utils/dataset-derived-query.js';
15
- import { buildDatasetPlan, buildMetricPlan, } from './semantic-planner.js';
16
- import { getRuntimeTenantId, getRuntimeTenantPredicate, validateTenantRuntime, } from './utils/tenant-runtime.js';
17
- import { applyPagination, overfetchLimit } from './utils/pagination.js';
2
+ import { MetricQueryEngine } from './metric-query-engine.js';
3
+ import { runDatasetQuery, validateDatasetQuery } from './dataset-query.js';
4
+ import { buildDatasetPlan, buildMetricPlan } from './semantic-planner.js';
5
+ import { assertMetricHandle, getMetricRef } from './utils/metric-handle.js';
6
+ import { validateMetricQueryInput } from './utils/metric-query-validation.js';
7
+ import { prepareDatasetQuery } from './utils/compile-dataset-query.js';
8
+ import { snapshotExecutionContext } from './utils/snapshot-execution-context.js';
9
+ import { isDatasetInstance } from './utils/dataset-target.js';
10
+ import { queryTimezoneErrors } from './utils/query-timezone.js';
11
+ import { rejectTimeMeasuresOnBackend } from './utils/time-query-measures.js';
12
+ import { baseMeasureNames } from './utils/dataset-measures.js';
13
+ import { hasSelectedDerivedMeasure } from './utils/dataset-derived-query.js';
18
14
  import { serializeSemanticMeasureValues } from './utils/semantic-result-serialization.js';
15
+ import { resolveResultLimit, withResultLimit } from './utils/result-limits.js';
16
+ import { resolveDatasetCacheRuntime } from './utils/dataset-cache-policy.js';
19
17
  import { SemanticQueryCache, } from './cache/semantic-query-cache.js';
20
18
  import { datasetCacheKey, metricCacheKey, resolveProtocolCacheKeySettings, } from './cache/protocol-cache-keys.js';
21
- import { resolveResultLimit, withResultLimit } from './utils/result-limits.js';
22
- import { resolveDatasetCacheRuntime, } from './utils/dataset-cache-policy.js';
23
- import { isQualifiedField, resolveQualifiedField } from './utils/relationship-fields.js';
24
- import { validateQualifiedFilter, validateRelationshipTenantRuntime, } from './utils/relationship-validation.js';
25
- import { applyRelationshipJoins, buildRelationshipBuilderContext, qualifyBaseColumn, } from './utils/relationship-builder-plan.js';
26
- import { segmentFilters, segmentSelectionErrors } from './utils/segments.js';
27
- function validateQuery(metric, query, context) {
28
- const errors = [...protocolMetricCapabilityErrors(metric, query), ...queryTimezoneErrors(query.timezone)];
29
- const ref = getMetricRef(metric);
30
- const ds = ref.dataset;
31
- const dimensionNames = Object.keys(ds.dimensions);
32
- const filterNames = Object.keys(ds.filters);
33
- const grain = getMetricGrain(metric, query);
34
- const orderableFields = new Set([
35
- ...(query.dimensions ?? []),
36
- ref.name,
37
- ...(grain ? ['period'] : []),
38
- ]);
39
- const tenantRuntimeError = validateTenantRuntime(ds, context);
40
- if (tenantRuntimeError) {
41
- errors.push(tenantRuntimeError);
42
- }
43
- const relationshipTenantError = validateRelationshipTenantRuntime(ds, query, context);
44
- if (relationshipTenantError) {
45
- errors.push(relationshipTenantError);
46
- }
47
- if (metric.__type === 'grained_metric_ref' && query.by && query.by !== metric.grain) {
48
- errors.push(`Metric "${ref.name}" is already grained by "${metric.grain}" and cannot be queried with by="${query.by}".`);
49
- }
50
- // Validate dimensions
51
- for (const dim of query.dimensions ?? []) {
52
- if (isQualifiedField(dim)) {
53
- const resolution = resolveQualifiedField(ds, dim);
54
- if (resolution?.error) {
55
- errors.push(resolution.error);
56
- }
57
- continue;
58
- }
59
- if (!dimensionNames.includes(dim)) {
60
- errors.push(`Unknown dimension "${dim}". Available: ${dimensionNames.join(', ')}`);
61
- }
62
- }
63
- // Validate filters
64
- for (const filter of query.filters ?? []) {
65
- if (isQualifiedField(filter.field)) {
66
- const filterError = validateQualifiedFilter(ds, filter, context);
67
- if (filterError) {
68
- errors.push(filterError);
69
- }
70
- continue;
71
- }
72
- if (!filterNames.includes(filter.field)) {
73
- errors.push(`Unknown filter field "${filter.field}". Available: ${filterNames.join(', ')}`);
74
- continue;
75
- }
76
- const filterDefinition = ds.filters[filter.field];
77
- if (filterDefinition?.operators && !filterDefinition.operators.includes(filter.operator)) {
78
- errors.push(`Filter "${filter.field}" does not allow operator "${filter.operator}". Allowed: ${filterDefinition.operators.join(', ')}`);
79
- continue;
80
- }
81
- const resolvedField = ds.filters[filter.field]?.field ?? filter.field;
82
- if (isTenantScopedFilter(ds, filter, context)) {
83
- errors.push(`Cannot filter on tenant field "${filter.field}" when runtime tenancy enforcement is active.`);
84
- continue;
85
- }
86
- const fieldType = ds.dimensions[resolvedField]?.fieldType;
87
- if (fieldType) {
88
- const filterError = validateFilterValue(filter, fieldType);
89
- if (filterError) {
90
- errors.push(filterError);
91
- }
92
- }
93
- }
94
- // Validate order by fields against the metric output shape
95
- for (const order of query.orderBy ?? []) {
96
- if (!orderableFields.has(order.field)) {
97
- errors.push(`Unknown orderBy field "${order.field}". Available: ${Array.from(orderableFields).join(', ')}`);
98
- }
99
- }
100
- // Validate grain requires timeKey
101
- if (query.by && !ds.timeKey) {
102
- errors.push(`Cannot use "by" grain — dataset "${ds.name}" has no timeKey.`);
103
- }
104
- // Validate grain is one the planner can bucket on
105
- errors.push(...segmentSelectionErrors(ds, query.segments));
106
- const grainError = query.by && ds.timeKey ? unsupportedTimeGrainError(ds, query.by) : undefined;
107
- if (grainError) {
108
- errors.push(grainError);
109
- }
110
- if (query.limit != null && (!Number.isInteger(query.limit) || query.limit < 0)) {
111
- errors.push(`Invalid limit: expected a non-negative integer.`);
112
- }
113
- if (query.offset != null && (!Number.isInteger(query.offset) || query.offset < 0)) {
114
- errors.push(`Invalid offset: expected a non-negative integer.`);
115
- }
116
- // Validate limits
117
- if (ds.limits) {
118
- if (ds.limits.maxDimensions && (query.dimensions?.length ?? 0) > ds.limits.maxDimensions) {
119
- errors.push(`Too many dimensions (${query.dimensions?.length}). Max: ${ds.limits.maxDimensions}`);
120
- }
121
- if (ds.limits.maxMeasures && 1 > ds.limits.maxMeasures) {
122
- errors.push(`Too many measures (1). Max: ${ds.limits.maxMeasures}`);
123
- }
124
- if (ds.limits.maxFilters && (query.filters?.length ?? 0) > ds.limits.maxFilters) {
125
- errors.push(`Too many filters (${query.filters?.length}). Max: ${ds.limits.maxFilters}`);
126
- }
127
- if (ds.limits.maxResultSize && query.limit != null && query.limit > ds.limits.maxResultSize) {
128
- errors.push(`Too many results requested (${query.limit}). Max: ${ds.limits.maxResultSize}`);
129
- }
130
- }
131
- return { valid: errors.length === 0, errors };
132
- }
133
- function isDatasetInstance(target) {
134
- return !!target && typeof target === 'object' && '__type' in target && target.__type === 'dataset';
135
- }
136
- /** Resolves the per-call builder override, adapted to the call contract. */
137
- function resolveBuilderFactory(context, fallback) {
138
- const override = context?.runtime?.builderFactory;
139
- return override ? toQueryBuilderFactory(override) : fallback;
140
- }
141
- export class MetricQueryEngine {
142
- builderFactory;
143
- constructor(options) {
144
- this.builderFactory = toQueryBuilderFactory(options.builderFactory);
145
- }
146
- getBuilderFactory() {
147
- return this.builderFactory;
148
- }
149
- /**
150
- * Execute a metric query. Generates SQL, applies tenant/filter context, executes.
151
- */
152
- async run(metric, query = {}, context) {
153
- assertMetricHandle(metric);
154
- const validation = this.validate(metric, query, context);
155
- if (!validation.valid) {
156
- throw new Error(`Invalid metric query: ${validation.errors.join('; ')}`);
157
- }
158
- const start = Date.now();
159
- return this.runViaBuilder(metric, query, context, start);
160
- }
161
- /**
162
- * Generate SQL without executing.
163
- */
164
- toSQL(metric, query = {}, context) {
165
- assertMetricHandle(metric);
166
- const validation = this.validate(metric, query, context);
167
- if (!validation.valid) {
168
- throw new Error(`Invalid metric query: ${validation.errors.join('; ')}`);
169
- }
170
- const ref = getMetricRef(metric);
171
- const grain = getMetricGrain(metric, query);
172
- const spec = ref.spec;
173
- if (spec.__type === 'derived_metric_spec') {
174
- return this.buildDerivedSQLViaBuilder(ref, spec, query, grain, context).sql;
175
- }
176
- const builder = this.buildBaseQuery(ref, spec, ref.dataset, query, grain, context);
177
- return builder.toSQLWithParams().sql;
178
- }
179
- /**
180
- * Validate a metric query against the metric's contract.
181
- */
182
- validate(metric, query, context) {
183
- assertMetricHandle(metric);
184
- const queryValidation = validateQuery(metric, query, context);
185
- if (!queryValidation.valid) {
186
- return queryValidation;
187
- }
188
- const ref = getMetricRef(metric);
189
- const grain = getMetricGrain(metric, query);
190
- try {
191
- if (ref.spec.__type === 'derived_metric_spec') {
192
- this.buildDerivedSQLViaBuilder(ref, ref.spec, query, grain, context);
193
- }
194
- else {
195
- this.buildBaseQuery(ref, ref.spec, ref.dataset, query, grain, context).toSQLWithParams();
196
- }
197
- }
198
- catch (error) {
199
- return {
200
- valid: false,
201
- errors: [error instanceof Error ? error.message : String(error)],
202
- };
203
- }
204
- return queryValidation;
205
- }
206
- // ---------------------------------------------------------------------------
207
- // Query builder path
208
- // ---------------------------------------------------------------------------
209
- async runViaBuilder(metric, query, context, start) {
210
- const ref = getMetricRef(metric);
211
- const grain = getMetricGrain(metric, query);
212
- const spec = ref.spec;
213
- const activeBuilderFactory = resolveBuilderFactory(context, this.builderFactory);
214
- // Over-fetch one row so we can report `hasMore` without a count query.
215
- const buildQuery = { ...query, limit: overfetchLimit(query.limit) };
216
- if (spec.__type === 'derived_metric_spec') {
217
- // Derived metrics: build CTE via builder, outer query via string, execute via rawQuery
218
- const { sql, params } = this.buildDerivedSQLViaBuilder(ref, spec, buildQuery, grain, context);
219
- const rows = await activeBuilderFactory.rawQuery(sql, params, {
220
- abortSignal: context?.abortSignal,
221
- });
222
- const timingMs = Date.now() - start;
223
- const { data, pagination } = applyPagination(rows, query.limit, query.offset);
224
- const serializedData = serializeSemanticMeasureValues(data, [ref.name]);
225
- return {
226
- data: serializedData,
227
- meta: {
228
- sql,
229
- timingMs,
230
- tenant: getRuntimeTenantId(context),
231
- rowCount: serializedData.length,
232
- pagination,
233
- },
234
- };
235
- }
236
- // Base metrics: fully use the builder's execute()
237
- const builder = this.buildBaseQuery(ref, spec, ref.dataset, buildQuery, grain, context);
238
- const { sql } = builder.toSQLWithParams();
239
- const rows = await builder.execute({ abortSignal: context?.abortSignal });
240
- const timingMs = Date.now() - start;
241
- const { data, pagination } = applyPagination(rows, query.limit, query.offset);
242
- const serializedData = serializeSemanticMeasureValues(data, [ref.name]);
243
- return {
244
- data: serializedData,
245
- meta: {
246
- sql,
247
- timingMs,
248
- tenant: getRuntimeTenantId(context),
249
- rowCount: serializedData.length,
250
- pagination,
251
- },
252
- };
253
- }
254
- buildBaseQuery(ref, spec, ds, query, grain, context) {
255
- const activeBuilderFactory = resolveBuilderFactory(context, this.builderFactory);
256
- const joinCtx = buildRelationshipBuilderContext(ds, query, context);
257
- let qb = activeBuilderFactory.table(ds.source);
258
- qb = applyRelationshipJoins(qb, joinCtx);
259
- const { selectParts, groupByParts } = buildDimensionSelectionPlan(ds, query.dimensions ?? [], grain, joinCtx, query.timezone);
260
- if (selectParts.length > 0) {
261
- qb = qb.select(selectParts);
262
- }
263
- // Aggregation (appends to select, auto-sets groupBy on non-agg columns)
264
- qb = applyAggregationSpec(qb, ds, spec, ref.name, joinCtx);
265
- // Explicit groupBy (ensures period + dims are grouped even if aggregation auto-groupBy misses them)
266
- if (groupByParts.length > 0) {
267
- qb = qb.groupBy(groupByParts);
268
- }
269
- // Tenant auto-injection
270
- const tenantColumn = resolveTenantFilterColumn(ds, context);
271
- const tenantPredicate = getRuntimeTenantPredicate(context);
272
- if (tenantPredicate && tenantColumn) {
273
- qb = qb.where(qualifyBaseColumn(joinCtx, tenantColumn), tenantPredicate.operator, tenantPredicate.value);
274
- }
275
- // User filters
276
- for (const filter of query.filters ?? []) {
277
- if (isTenantScopedFilter(ds, filter, context)) {
278
- throw new Error(`Cannot filter on tenant field "${filter.field}" when runtime tenancy enforcement is active.`);
279
- }
280
- const resolvedField = resolveFilterField(ds, filter.field, joinCtx);
281
- qb = qb.where(queryTimeFilterSql(ds, filter.field, resolvedField, query.timezone), filter.operator, filter.value);
282
- }
283
- // Segments: author-defined, so they resolve dimensions directly rather
284
- // than through the caller-facing filter allow-list.
285
- for (const filter of segmentFilters(ds, query.segments)) {
286
- qb = qb.where(resolveDimensionExpression(ds, filter.field, joinCtx), filter.operator, filter.value);
287
- }
288
- // Order, limit, offset
289
- qb = appendOrderLimitOffset(qb, query.orderBy, grain, query.limit, query.offset, joinCtx);
290
- return qb;
291
- }
292
- buildDerivedSQLViaBuilder(ref, spec, query, grain, context) {
293
- const activeBuilderFactory = resolveBuilderFactory(context, this.builderFactory);
294
- const ds = ref.dataset;
295
- const joinCtx = buildRelationshipBuilderContext(ds, query, context);
296
- // Build the CTE inner query using the builder
297
- let cteBuilder = activeBuilderFactory.table(ds.source);
298
- cteBuilder = applyRelationshipJoins(cteBuilder, joinCtx);
299
- const { selectParts, groupByParts } = buildDimensionSelectionPlan(ds, query.dimensions ?? [], grain, joinCtx, query.timezone);
300
- if (selectParts.length > 0) {
301
- cteBuilder = cteBuilder.select(selectParts);
302
- }
303
- // Base aggregations
304
- const refAliases = {};
305
- const aggregateAliases = [];
306
- for (const [alias, baseMetric] of Object.entries(spec.uses)) {
307
- const baseSpec = baseMetric.spec;
308
- if (baseSpec.__type !== 'aggregation_spec') {
309
- throw new Error(`Derived metric "${ref.name}" references non-base metric "${alias}".`);
310
- }
311
- cteBuilder = applyAggregationSpec(cteBuilder, ds, baseSpec, alias, joinCtx);
312
- refAliases[alias] = alias;
313
- aggregateAliases.push(alias);
314
- }
315
- if (groupByParts.length > 0) {
316
- cteBuilder = cteBuilder.groupBy(groupByParts);
317
- }
318
- // Filters on CTE
319
- const tenantColumn = resolveTenantFilterColumn(ds, context);
320
- const tenantPredicate = getRuntimeTenantPredicate(context);
321
- if (tenantPredicate && tenantColumn) {
322
- cteBuilder = cteBuilder.where(qualifyBaseColumn(joinCtx, tenantColumn), tenantPredicate.operator, tenantPredicate.value);
323
- }
324
- for (const filter of query.filters ?? []) {
325
- if (isTenantScopedFilter(ds, filter, context)) {
326
- throw new Error(`Cannot filter on tenant field "${filter.field}" when runtime tenancy enforcement is active.`);
327
- }
328
- const resolvedField = resolveFilterField(ds, filter.field, joinCtx);
329
- cteBuilder = cteBuilder.where(queryTimeFilterSql(ds, filter.field, resolvedField, query.timezone), filter.operator, filter.value);
330
- }
331
- for (const filter of segmentFilters(ds, query.segments)) {
332
- cteBuilder = cteBuilder.where(resolveDimensionExpression(ds, filter.field, joinCtx), filter.operator, filter.value);
333
- }
334
- const { sql: cteSql, parameters: cteParams } = cteBuilder.toSQLWithParams();
335
- const groupingErrors = validateDerivedCteGrouping(cteSql, aggregateAliases, groupByParts);
336
- if (groupingErrors.length > 0) {
337
- throw new Error(groupingErrors.join('; '));
338
- }
339
- // Outer query: trivial SELECT from the CTE — stays as string concat
340
- // because table('base') would fail schema typing
341
- const outerSelectParts = [];
342
- if (grain)
343
- outerSelectParts.push('period');
344
- for (const dim of query.dimensions ?? []) {
345
- // Joined dimensions surface from the CTE under their quoted qualified alias.
346
- if (joinCtx && isQualifiedField(dim)) {
347
- outerSelectParts.push(quoteSQLIdentifier(dim));
348
- continue;
349
- }
350
- validateSQLIdentifier(dim, 'dimension name');
351
- outerSelectParts.push(dim);
352
- }
353
- const formulaExpr = spec.formula(refAliases);
354
- validateSQLIdentifier(ref.name, 'metric name');
355
- outerSelectParts.push(`${formulaExpr.toSQL()} AS ${ref.name}`);
356
- let sql = `WITH base AS (${cteSql}) SELECT ${outerSelectParts.join(', ')} FROM base`;
357
- // ORDER BY
358
- if (query.orderBy && query.orderBy.length > 0) {
359
- const orderParts = query.orderBy.map(o => {
360
- if (joinCtx && isQualifiedField(o.field)) {
361
- return `${quoteSQLIdentifier(o.field)} ${o.direction.toUpperCase()}`;
362
- }
363
- validateSQLIdentifier(o.field, 'order by field');
364
- return `${o.field} ${o.direction.toUpperCase()}`;
365
- });
366
- sql += ` ORDER BY ${orderParts.join(', ')}`;
367
- }
368
- else if (grain) {
369
- sql += ' ORDER BY period';
370
- }
371
- if (query.limit != null) {
372
- // Ensure limit is a safe integer
373
- const limit = Math.floor(Math.abs(query.limit));
374
- sql += ` LIMIT ${limit}`;
375
- }
376
- if (query.offset != null) {
377
- // Ensure offset is a safe integer
378
- const offset = Math.floor(Math.abs(query.offset));
379
- sql += ` OFFSET ${offset}`;
380
- }
381
- return { sql, params: cteParams };
382
- }
383
- }
19
+ // Preserve the existing module surface for internal consumers.
20
+ export { MetricQueryEngine } from './metric-query-engine.js';
384
21
  export class DatasetClientImpl extends MetricQueryEngine {
385
22
  backend;
386
23
  defaultTimezone;
@@ -460,11 +97,6 @@ export class DatasetClientImpl extends MetricQueryEngine {
460
97
  }
461
98
  return this.cacheEnabledByDefault;
462
99
  }
463
- /**
464
- * Context used for cache-key building: fills in the client-level default
465
- * `cache.scope` unless the call sets its own, so clients sharing a custom
466
- * store can be namespaced apart.
467
- */
468
100
  /** The call's cache partition: its own `cache.scope`, else the client default. */
469
101
  cacheScope(context) {
470
102
  if (context?.cache === false)
@@ -474,7 +106,7 @@ export class DatasetClientImpl extends MetricQueryEngine {
474
106
  planMetric(metric, query = {}, context) {
475
107
  query = this.withTimezone(query);
476
108
  assertMetricHandle(metric);
477
- const validation = validateQuery(metric, query, context);
109
+ const validation = validateMetricQueryInput(metric, query, context);
478
110
  if (!validation.valid) {
479
111
  throw new Error(`Invalid metric query: ${validation.errors.join('; ')}`);
480
112
  }
@@ -484,7 +116,10 @@ export class DatasetClientImpl extends MetricQueryEngine {
484
116
  return buildDatasetPlan(ds, this.withTimezone(query), context);
485
117
  }
486
118
  execute(target, query = {}, context) {
487
- query = this.withTimezone(query);
119
+ // An async cache read must not let caller mutations change the query or
120
+ // tenant after its key has been derived.
121
+ query = this.withTimezone(structuredClone(query));
122
+ context = snapshotExecutionContext(context);
488
123
  if (this.backend && query.timezone !== undefined) {
489
124
  throw new Error('Execution timezone requires the queryBuilder execution path.');
490
125
  }
@@ -493,6 +128,16 @@ export class DatasetClientImpl extends MetricQueryEngine {
493
128
  }
494
129
  return this.executeMetric(target, query, context);
495
130
  }
131
+ compileDataset(target, query = {}, context) {
132
+ if (this.backend)
133
+ throw new Error('Dataset compilation requires the queryBuilder execution path.');
134
+ if (!isDatasetInstance(target))
135
+ throw new Error('Dataset compilation requires a dataset target.');
136
+ return prepareDatasetQuery(target, this.withTimezone(query), {
137
+ builderFactory: this.resolveBuilderFactory(context),
138
+ context,
139
+ }).compilation;
140
+ }
496
141
  toSQL(target, query = {}, context) {
497
142
  query = this.withTimezone(query);
498
143
  if (this.backend && query.timezone !== undefined) {
@@ -522,7 +167,7 @@ export class DatasetClientImpl extends MetricQueryEngine {
522
167
  const cacheRuntime = this.datasetCacheContext(ds, context);
523
168
  const run = () => {
524
169
  if (this.backend) {
525
- const validation = validateQuery(metric, boundedQuery, context);
170
+ const validation = validateMetricQueryInput(metric, boundedQuery, context);
526
171
  if (!validation.valid) {
527
172
  throw new Error(`Invalid metric query: ${validation.errors.join('; ')}`);
528
173
  }
@@ -540,7 +185,7 @@ export class DatasetClientImpl extends MetricQueryEngine {
540
185
  // missing tenant runtime cannot be served from cache. Avoid this.validate()
541
186
  // here because it dry-builds SQL, which is unnecessary on cache hits and
542
187
  // invalid for backend-only clients.
543
- const validation = validateQuery(metric, boundedQuery, context);
188
+ const validation = validateMetricQueryInput(metric, boundedQuery, context);
544
189
  if (!validation.valid) {
545
190
  throw new Error(`Invalid metric query: ${validation.errors.join('; ')}`);
546
191
  }
@@ -575,7 +220,7 @@ export class DatasetClientImpl extends MetricQueryEngine {
575
220
  }));
576
221
  }
577
222
  return runDatasetQuery(ds, boundedQuery, {
578
- builderFactory: resolveBuilderFactory(context, this.getBuilderFactory()),
223
+ builderFactory: this.resolveBuilderFactory(context),
579
224
  context,
580
225
  });
581
226
  };
@@ -603,18 +248,10 @@ export class DatasetClientImpl extends MetricQueryEngine {
603
248
  return { ...context, cache };
604
249
  }
605
250
  toDatasetSQL(ds, query, context) {
606
- const builderFactory = resolveBuilderFactory(context, this.getBuilderFactory());
607
- if (selectedTimeMeasures(ds, query).size) {
608
- return buildTimeMeasureDatasetSql(ds, query, { builderFactory, context }).sql;
609
- }
610
- if (hasSelectedDerivedMeasure(ds, query)) {
611
- return buildDerivedDatasetSql(ds, query, { builderFactory, context }, buildDatasetQueryBuilder).sql;
612
- }
613
- const builder = buildDatasetQueryBuilder(ds, query, {
614
- builderFactory,
251
+ return prepareDatasetQuery(ds, query, {
252
+ builderFactory: this.resolveBuilderFactory(context),
615
253
  context,
616
- });
617
- return builder.toSQLWithParams().sql;
254
+ }, 'logical').compilation.sql;
618
255
  }
619
256
  }
620
257
  export function createDatasetClient(options) {
package/dist/index.d.ts CHANGED
@@ -11,7 +11,7 @@ export { createDatasetRegistry } from './registry.js';
11
11
  export { publishDatasets } from './publishing/publisher.js';
12
12
  export type { DatasetPublisher } from './publishing/publisher.js';
13
13
  export type { PublishableMetric, PublishedMetricHandle, PublishedMetricMap, PublishedMetrics, PublishedDataset, PublishedDatasetRegistry, PublishDatasetOptions, } from './publishing/types.js';
14
- export { getDatasetCatalog, getDatasetCatalogs, getQueryableRelationshipFields } from './catalog.js';
14
+ export { getDatasetCatalog, getDatasetCatalogs, getQueryableRelationshipFields, getQueryableRelationshipMeasures } from './catalog.js';
15
15
  export { listQueryableRelationshipFields } from './utils/relationship-fields.js';
16
16
  export type { DatasetCatalog, DatasetCatalogMap, DatasetCatalogSource, DimensionCatalogEntry, MeasureCatalogEntry, SegmentCatalogEntry, MetricCatalogEntry, FilterCatalogEntry, RelationshipCatalogEntry, } from './catalog.js';
17
17
  export { DEFAULT_AGENT_CATALOG_MAX_BYTES, assertAgentSafeCatalogBudget, projectAgentSafeCatalog, projectTrustedDebugCatalog, } from './agent-catalog.js';
@@ -26,8 +26,8 @@ export { rehydrateProtocolDeploymentContract } from './protocol-rehydrate.js';
26
26
  export type { BuildProtocolDatasetContractOptions } from './protocol-adapter.js';
27
27
  export { publishToCloud } from './cloud-publishing.js';
28
28
  export type { CloudPublishingOptions } from './cloud-publishing.js';
29
- export { createPortableSemanticExecutor, PortableExecutionBudgetError, PortableExecutionTenantError, PortableExecutionUnsupportedError, } from './portable-executor.js';
30
- export type { PortableSemanticBudget, PortableSemanticExecutionInput, PortableSemanticExecutorOptions, } from './portable-executor.js';
29
+ export { createPortableSemanticExecutor, createPortableSemanticRuntime, PortableExecutionBudgetError, PortableExecutionTenantError, PortableExecutionUnsupportedError, } from './portable-executor.js';
30
+ export type { PortableSemanticBudget, PortableSemanticRuntime, PortableDatasetCompilation, PortableSemanticExecutionInput, PortableSemanticExecutorOptions, } from './portable-executor.js';
31
31
  export { compilePortableSqlExpression, DEFAULT_SQL_PORTABILITY_LIMITS, } from './sql-portability.js';
32
32
  export type { SqlPortabilityIssue, SqlPortabilityIssueCode, SqlPortabilityLimits, SqlPortabilityOptions, SqlPortabilityResult, } from './sql-portability.js';
33
33
  export type { SemanticContract, SerializeSemanticContractOptions, ContractDataset, ContractDimension, ContractMeasure, ContractMetric, ContractFilter, ContractRelationship, } from './contract.js';
@@ -36,6 +36,7 @@ export { buildDatasetInputSchema, buildMetricInputSchema, buildCanonicalSemantic
36
36
  export type { CanonicalSemanticQuerySchemas, SemanticMetricQueryContract, SemanticQuerySchemaLimits, SemanticQuerySchemaOptions, SemanticQuerySchemaSource, } from './semantic-query-schema.js';
37
37
  export type { AISDKToolDefinition, DatasetToolAnalytics, DatasetToolMode, GenerateDatasetToolsOptions, JsonSchema, McpToolDefinition, OpenAIToolDefinition, SemanticToolDefinition, } from './tools.js';
38
38
  export { createDatasetClient } from './executor.js';
39
+ export type { DatasetSqlDialect } from './dataset-sql-dialect.js';
39
40
  export type { DatasetClient, CreateDatasetClientOptions } from './executor.js';
40
41
  export { createMemoryCacheStore } from './cache/semantic-query-cache.js';
41
42
  export type { SemanticCacheEntry, SemanticCacheMetaInfo, SemanticCacheOptions, SemanticCacheRuntime, SemanticCacheStats, SemanticCacheStore, } from './cache/semantic-query-cache.js';
@@ -49,6 +50,10 @@ export type { QueryBuilderLike, QueryBuilderFactoryLike, QueryBuilderFactoryComp
49
50
  export { toQueryBuilderFactory } from './query-builder-protocol.js';
50
51
  export { validateSQLIdentifier, isSafeSQLIdentifier, quoteSQLIdentifier } from './sql-utils.js';
51
52
  export { GRAIN_FUNCTIONS, SEMANTIC_FILTER_OPERATORS, SUPPORTED_TIME_GRAINS } from './constants.js';
52
- export type { FieldType, DimensionType, DimensionOptions, DimensionDefinition, MeasureOptions, MeasureDefinition, MeasureTimeInterval, WindowMeasureDefinition, ShiftMeasureDefinition, DatasetMeasureDefinition, DerivedMeasureDefinition, DerivedMeasureOptions, DerivedMeasureUses, InferDimensionType, RelationshipKind, RelationshipDefinition, AggregationType, MeasureAggregation, AggregationSpec, FormulaExpr, DerivedMetricSpec, TimeGrain, MetricRef, BaseMetricRef, DerivedMetricRef, GrainedMetricRef, MetricContract, MetricFilter, MetricOrderBy, MetricQuery, DatasetQuery, MetricResultMeta, MetricResult, DatasetQueryResult, MetricHandle, ExecutionContext, SemanticExecutionRuntime, SemanticTenantRuntime, SemanticFilterDefinition, SegmentDefinition, SemanticFiltersDefinition, DatasetConfig, DatasetDefaults, DatasetFreshness, DatasetLimits, DatasetCachePolicy, SemanticMetadata, SemanticSensitivity, DatasetInstance, AnyDatasetInstance, BaseMetricConfig, DerivedMetricConfig, DatasetRegistryInstance, DatasetFieldNames, DatasetDimensionNames, DatasetQueryableDimensions, DatasetMeasureNames, DatasetSegmentNames, DatasetOrderableNames, DatasetQueryFor, DatasetRow, DatasetRowFor, DatasetQueryResultFor, MetricQueryFor, MetricRow, MetricRowFor, MetricResultFor, KnownStringKeys, } from './types.js';
53
+ export type { FieldType, DimensionType, DimensionOptions, DimensionDefinition, MeasureOptions, MeasureDefinition, MeasureTimeInterval, WindowMeasureDefinition, ShiftMeasureDefinition, DatasetMeasureDefinition, DerivedMeasureDefinition, DerivedMeasureOptions, DerivedMeasureUses, InferDimensionType, RelationshipKind, RelationshipDefinition, AggregationType, MeasureAggregation, AggregationSpec, FormulaExpr, DerivedMetricSpec, TimeGrain, MetricRef, BaseMetricRef, DerivedMetricRef, GrainedMetricRef, MetricContract, MetricFilter, MetricFilterOperator, MetricOrderBy, MetricQuery, DatasetQuery, MetricResultMeta, MetricResult, DatasetQueryResult, MetricHandle, ExecutionContext, SemanticExecutionRuntime, SemanticTenantRuntime, SemanticFilterDefinition, SegmentDefinition, SemanticFiltersDefinition, DatasetConfig, DatasetDefaults, DatasetFreshness, DatasetLimits, DatasetCachePolicy, SemanticMetadata, SemanticSensitivity, DatasetInstance, AnyDatasetInstance, BaseMetricConfig, DerivedMetricConfig, DatasetRegistryInstance, DatasetFieldNames, DatasetDimensionNames, DatasetQueryableDimensions, DatasetQueryableMeasures, DatasetMeasureNames, DatasetSegmentNames, DatasetOrderableNames, DatasetQueryFor, DatasetRow, DatasetRowFor, DatasetQueryResultFor, MetricQueryFor, MetricRow, MetricRowFor, MetricResultFor, KnownStringKeys, } from './types.js';
53
54
  export { ProtocolSchemaAdapterError, zodToProtocolSchema } from './protocol-schema-adapter.js';
55
+ export type { DatasetCompilation, DatasetCompiledStatement, DatasetCompilationDescription, } from './dataset-compilation.js';
56
+ export { DATASET_EXECUTION_CAPABILITIES } from './execution-capabilities.js';
57
+ export type { DatasetFeature, DatasetFeatureSupport, DatasetExecutionCapabilities } from './execution-capabilities.js';
58
+ export type { DatasetFilterNames, DatasetFilterFor } from './utils/dataset-filter-types.js';
54
59
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ export { createDatasetRegistry } from './registry.js';
18
18
  // First-class publication builder for Serve, MCP, and agent consumers.
19
19
  export { publishDatasets } from './publishing/publisher.js';
20
20
  // Catalog
21
- export { getDatasetCatalog, getDatasetCatalogs, getQueryableRelationshipFields } from './catalog.js';
21
+ export { getDatasetCatalog, getDatasetCatalogs, getQueryableRelationshipFields, getQueryableRelationshipMeasures } from './catalog.js';
22
22
  export { listQueryableRelationshipFields } from './utils/relationship-fields.js';
23
23
  // Agent-safe and separately authorized trusted-debug catalog projections.
24
24
  export { DEFAULT_AGENT_CATALOG_MAX_BYTES, assertAgentSafeCatalogBudget, projectAgentSafeCatalog, projectTrustedDebugCatalog, } from './agent-catalog.js';
@@ -31,7 +31,7 @@ export { buildProtocolDeploymentContract } from './protocol-deployment-adapter.j
31
31
  export { rehydrateProtocolDeploymentContract } from './protocol-rehydrate.js';
32
32
  export { publishToCloud } from './cloud-publishing.js';
33
33
  // Portable native execution of a semantic invocation (decision 0005).
34
- export { createPortableSemanticExecutor, PortableExecutionBudgetError, PortableExecutionTenantError, PortableExecutionUnsupportedError, } from './portable-executor.js';
34
+ export { createPortableSemanticExecutor, createPortableSemanticRuntime, PortableExecutionBudgetError, PortableExecutionTenantError, PortableExecutionUnsupportedError, } from './portable-executor.js';
35
35
  // SQL portability compiler (R1A-07)
36
36
  export { compilePortableSqlExpression, DEFAULT_SQL_PORTABILITY_LIMITS, } from './sql-portability.js';
37
37
  // Agent/tool metadata
@@ -54,3 +54,4 @@ export { validateSQLIdentifier, isSafeSQLIdentifier, quoteSQLIdentifier } from '
54
54
  // Constants
55
55
  export { GRAIN_FUNCTIONS, SEMANTIC_FILTER_OPERATORS, SUPPORTED_TIME_GRAINS } from './constants.js';
56
56
  export { ProtocolSchemaAdapterError, zodToProtocolSchema } from './protocol-schema-adapter.js';
57
+ export { DATASET_EXECUTION_CAPABILITIES } from './execution-capabilities.js';
@@ -12,6 +12,9 @@ export type { DatasetClient, CreateDatasetClientOptions, MetricQueryEngineOption
12
12
  export { createInMemoryBackend } from './in-memory-backend.js';
13
13
  export type { InMemoryTable, InMemoryTables } from './in-memory-backend.js';
14
14
  export type { PlanNode, SemanticBackend, SemanticBackendResult, SemanticExpression, SemanticAggregationPlan, SemanticDimensionPlan, SemanticGrainPlan, } from './semantic-plan.js';
15
+ export type { DatasetSqlDialect } from './dataset-sql-dialect.js';
16
+ export { clickhouseDatasetSqlDialect } from './utils/clickhouse-dataset-sql-dialect.js';
17
+ export { resolveDatasetSqlDialect } from './utils/dataset-sql-dialect.js';
15
18
  export type { QueryBuilderLike, QueryBuilderFactoryLike } from './query-builder-protocol.js';
16
19
  export type { ValidationResult } from './validation.js';
17
20
  export { validateFilterValue, matchesFieldType } from './validation.js';
@@ -1 +1 @@
1
- {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC1F,YAAY,EAAE,aAAa,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC5E,YAAY,EACV,QAAQ,EACR,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EACV,gBAAgB,EAChB,uBAAuB,EACxB,MAAM,6BAA6B,CAAC;AAGrC,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxE,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAGvE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC1F,YAAY,EAAE,aAAa,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC5E,YAAY,EACV,QAAQ,EACR,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC;AACxF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,YAAY,EACV,gBAAgB,EAChB,uBAAuB,EACxB,MAAM,6BAA6B,CAAC;AAGrC,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxE,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAGvE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
package/dist/internal.js CHANGED
@@ -10,6 +10,8 @@
10
10
  // Dataset client internals - used by serve to create metric/dataset endpoints
11
11
  export { createDatasetClient, DatasetClientImpl, MetricQueryEngine } from './executor.js';
12
12
  export { createInMemoryBackend } from './in-memory-backend.js';
13
+ export { clickhouseDatasetSqlDialect } from './utils/clickhouse-dataset-sql-dialect.js';
14
+ export { resolveDatasetSqlDialect } from './utils/dataset-sql-dialect.js';
13
15
  export { validateFilterValue, matchesFieldType } from './validation.js';
14
16
  // SQL utilities - used by serve for SQL generation
15
17
  export { validateSQLIdentifier, isSafeSQLIdentifier, quoteSQLIdentifier } from './sql-utils.js';