@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.
- package/README.md +6 -0
- package/dist/api.type-test.js +7 -0
- package/dist/catalog.d.ts +4 -0
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +10 -1
- package/dist/dataset-compilation.d.ts +45 -0
- package/dist/dataset-compilation.d.ts.map +1 -0
- package/dist/dataset-compilation.js +1 -0
- package/dist/dataset-query.d.ts +3 -3
- package/dist/dataset-query.d.ts.map +1 -1
- package/dist/dataset-query.js +7 -71
- package/dist/dataset-sql-dialect.d.ts +11 -0
- package/dist/dataset-sql-dialect.d.ts.map +1 -0
- package/dist/dataset-sql-dialect.js +1 -0
- package/dist/dataset.d.ts +3 -2
- package/dist/dataset.d.ts.map +1 -1
- package/dist/execution-capabilities.d.ts +28 -0
- package/dist/execution-capabilities.d.ts.map +1 -0
- package/dist/execution-capabilities.js +17 -0
- package/dist/execution-capabilities.json +13 -0
- package/dist/executor.d.ts +17 -38
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +37 -400
- package/dist/index.d.ts +9 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/internal.d.ts +3 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +2 -0
- package/dist/measure.d.ts +54 -17
- package/dist/measure.d.ts.map +1 -1
- package/dist/measure.js +3 -63
- package/dist/metric-query-engine.d.ts +29 -0
- package/dist/metric-query-engine.d.ts.map +1 -0
- package/dist/metric-query-engine.js +106 -0
- package/dist/portable-executor.d.ts +20 -6
- package/dist/portable-executor.d.ts.map +1 -1
- package/dist/portable-executor.js +29 -9
- package/dist/query-builder-protocol.d.ts +4 -0
- package/dist/query-builder-protocol.d.ts.map +1 -1
- package/dist/query-helpers.d.ts +10 -10
- package/dist/query-helpers.d.ts.map +1 -1
- package/dist/query-helpers.js +1 -3
- package/dist/query-planner.d.ts +7 -3
- package/dist/query-planner.d.ts.map +1 -1
- package/dist/query-planner.js +10 -12
- package/dist/semantic-planner.d.ts.map +1 -1
- package/dist/semantic-planner.js +2 -0
- package/dist/semantic-query-schema.d.ts.map +1 -1
- package/dist/semantic-query-schema.js +3 -3
- package/dist/types.d.ts +18 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/agent-catalog-projection.d.ts +1 -0
- package/dist/utils/agent-catalog-projection.d.ts.map +1 -1
- package/dist/utils/agent-catalog-projection.js +2 -1
- package/dist/utils/base-measure-definition.d.ts +23 -0
- package/dist/utils/base-measure-definition.d.ts.map +1 -0
- package/dist/utils/base-measure-definition.js +65 -0
- package/dist/utils/build-dataset-query-builder.d.ts +5 -0
- package/dist/utils/build-dataset-query-builder.d.ts.map +1 -0
- package/dist/utils/build-dataset-query-builder.js +62 -0
- package/dist/utils/clickhouse-dataset-sql-dialect.d.ts +4 -0
- package/dist/utils/clickhouse-dataset-sql-dialect.d.ts.map +1 -0
- package/dist/utils/clickhouse-dataset-sql-dialect.js +6 -0
- package/dist/utils/compile-dataset-query.d.ts +10 -0
- package/dist/utils/compile-dataset-query.d.ts.map +1 -0
- package/dist/utils/compile-dataset-query.js +71 -0
- package/dist/utils/composite-time-measure-sql.d.ts.map +1 -1
- package/dist/utils/composite-time-measure-sql.js +2 -1
- package/dist/utils/dataset-derived-query.d.ts +1 -2
- package/dist/utils/dataset-derived-query.d.ts.map +1 -1
- package/dist/utils/dataset-derived-query.js +12 -26
- package/dist/utils/dataset-filter-types.d.ts +28 -0
- package/dist/utils/dataset-filter-types.d.ts.map +1 -0
- package/dist/utils/dataset-filter-types.js +1 -0
- package/dist/utils/dataset-query-validation.d.ts.map +1 -1
- package/dist/utils/dataset-query-validation.js +15 -3
- package/dist/utils/dataset-sql-dialect.d.ts +5 -0
- package/dist/utils/dataset-sql-dialect.d.ts.map +1 -0
- package/dist/utils/dataset-sql-dialect.js +5 -0
- package/dist/utils/dataset-target.d.ts +3 -0
- package/dist/utils/dataset-target.d.ts.map +1 -0
- package/dist/utils/dataset-target.js +3 -0
- package/dist/utils/filter-definition.d.ts +3 -0
- package/dist/utils/filter-definition.d.ts.map +1 -0
- package/dist/utils/filter-definition.js +3 -0
- package/dist/utils/metric-derived-query.d.ts +8 -0
- package/dist/utils/metric-derived-query.d.ts.map +1 -0
- package/dist/utils/metric-derived-query.js +106 -0
- package/dist/utils/metric-query-builder.d.ts +5 -0
- package/dist/utils/metric-query-builder.d.ts.map +1 -0
- package/dist/utils/metric-query-builder.js +50 -0
- package/dist/utils/metric-query-result.d.ts +10 -0
- package/dist/utils/metric-query-result.d.ts.map +1 -0
- package/dist/utils/metric-query-result.js +18 -0
- package/dist/utils/metric-query-validation.d.ts +6 -0
- package/dist/utils/metric-query-validation.d.ts.map +1 -0
- package/dist/utils/metric-query-validation.js +116 -0
- package/dist/utils/relationship-builder-plan.d.ts +4 -2
- package/dist/utils/relationship-builder-plan.d.ts.map +1 -1
- package/dist/utils/relationship-builder-plan.js +10 -13
- package/dist/utils/relationship-measure-sql.d.ts +14 -0
- package/dist/utils/relationship-measure-sql.d.ts.map +1 -0
- package/dist/utils/relationship-measure-sql.js +44 -0
- package/dist/utils/relationship-measure-types.d.ts +36 -0
- package/dist/utils/relationship-measure-types.d.ts.map +1 -0
- package/dist/utils/relationship-measure-types.js +1 -0
- package/dist/utils/relationship-measures.d.ts +23 -0
- package/dist/utils/relationship-measures.d.ts.map +1 -0
- package/dist/utils/relationship-measures.js +62 -0
- package/dist/utils/relationship-validation.d.ts +1 -1
- package/dist/utils/relationship-validation.d.ts.map +1 -1
- package/dist/utils/relationship-validation.js +3 -5
- package/dist/utils/semantic-query-syntax.d.ts +6 -0
- package/dist/utils/semantic-query-syntax.d.ts.map +1 -0
- package/dist/utils/semantic-query-syntax.js +25 -0
- package/dist/utils/snapshot-execution-context.d.ts +4 -0
- package/dist/utils/snapshot-execution-context.d.ts.map +1 -0
- package/dist/utils/snapshot-execution-context.js +16 -0
- package/dist/utils/time-measure-dataset-sql.d.ts.map +1 -1
- package/dist/utils/time-measure-dataset-sql.js +3 -2
- package/dist/utils/time-measure-result-sql.d.ts.map +1 -1
- package/dist/utils/time-measure-result-sql.js +2 -1
- package/dist/utils/time-measure-source-sql.d.ts.map +1 -1
- package/dist/utils/time-measure-source-sql.js +8 -4
- package/dist/validation.js +1 -1
- 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 {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
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
|
-
|
|
22
|
-
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
-
|
|
607
|
-
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC7D,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GACrD,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAC/B,UAAU,EAAE,QAAQ,EACpB,KAAK,EAAE,KAAK,EAAE,IAAI,GACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EACzB,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAChC,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,KAAK,GACd,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAGtD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;
|
|
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';
|
package/dist/internal.d.ts
CHANGED
|
@@ -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';
|
package/dist/internal.d.ts.map
CHANGED
|
@@ -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';
|