@hypequery/datasets 0.13.5 → 0.14.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 +10 -0
- package/dist/agent-catalog.d.ts +97 -0
- package/dist/agent-catalog.d.ts.map +1 -0
- package/dist/agent-catalog.js +79 -0
- package/dist/api.type-test.js +19 -1
- package/dist/catalog.d.ts +17 -6
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +18 -1
- package/dist/contract.d.ts +11 -7
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +22 -1
- package/dist/dataset-query.d.ts.map +1 -1
- package/dist/dataset-query.js +9 -3
- package/dist/dataset.d.ts.map +1 -1
- package/dist/dataset.js +19 -2
- package/dist/executor.d.ts +6 -0
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +83 -24
- package/dist/field.d.ts.map +1 -1
- package/dist/field.js +2 -0
- package/dist/in-memory-backend.d.ts.map +1 -1
- package/dist/in-memory-backend.js +2 -17
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/measure.d.ts.map +1 -1
- package/dist/measure.js +4 -0
- package/dist/protocol-adapter.d.ts.map +1 -1
- package/dist/protocol-adapter.js +21 -0
- package/dist/protocol-rehydrate.d.ts +46 -0
- package/dist/protocol-rehydrate.d.ts.map +1 -0
- package/dist/protocol-rehydrate.js +218 -0
- package/dist/publishing/features/dataset-publication.d.ts +10 -0
- package/dist/publishing/features/dataset-publication.d.ts.map +1 -0
- package/dist/publishing/features/dataset-publication.js +34 -0
- package/dist/publishing/node.d.ts +16 -0
- package/dist/publishing/node.d.ts.map +1 -0
- package/dist/publishing/node.js +35 -0
- package/dist/publishing/publisher.d.ts +17 -0
- package/dist/publishing/publisher.d.ts.map +1 -0
- package/dist/publishing/publisher.js +32 -0
- package/dist/publishing/types.d.ts +31 -0
- package/dist/publishing/types.d.ts.map +1 -0
- package/dist/publishing/types.js +1 -0
- package/dist/query-builder-protocol.d.ts +6 -2
- package/dist/query-builder-protocol.d.ts.map +1 -1
- package/dist/semantic-plan.d.ts +3 -1
- package/dist/semantic-plan.d.ts.map +1 -1
- package/dist/semantic-planner.d.ts.map +1 -1
- package/dist/semantic-planner.js +4 -0
- package/dist/semantic-query-schema.d.ts +48 -0
- package/dist/semantic-query-schema.d.ts.map +1 -0
- package/dist/semantic-query-schema.js +218 -0
- package/dist/sql-utils.d.ts +36 -0
- package/dist/sql-utils.d.ts.map +1 -1
- package/dist/sql-utils.js +76 -0
- package/dist/tools.d.ts +5 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +25 -267
- package/dist/types.d.ts +102 -12
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/agent-catalog-projection.d.ts +78 -0
- package/dist/utils/agent-catalog-projection.d.ts.map +1 -0
- package/dist/utils/agent-catalog-projection.js +179 -0
- package/dist/utils/dataset-cache-policy.d.ts +34 -0
- package/dist/utils/dataset-cache-policy.d.ts.map +1 -0
- package/dist/utils/dataset-cache-policy.js +50 -0
- package/dist/utils/dataset-contract.d.ts +2 -2
- package/dist/utils/dataset-contract.d.ts.map +1 -1
- package/dist/utils/dataset-contract.js +3 -1
- package/dist/utils/dataset-definition-validation.d.ts +35 -0
- package/dist/utils/dataset-definition-validation.d.ts.map +1 -0
- package/dist/utils/dataset-definition-validation.js +215 -0
- package/dist/utils/dataset-metric-ref.d.ts +2 -2
- package/dist/utils/dataset-metric-ref.d.ts.map +1 -1
- package/dist/utils/dataset-metric-ref.js +5 -3
- package/dist/utils/metric-alias.d.ts +4 -0
- package/dist/utils/metric-alias.d.ts.map +1 -0
- package/dist/utils/metric-alias.js +28 -0
- package/dist/utils/protocol-metric-capabilities.d.ts +7 -0
- package/dist/utils/protocol-metric-capabilities.d.ts.map +1 -0
- package/dist/utils/protocol-metric-capabilities.js +57 -0
- package/dist/utils/protocol-rehydrate-filters.d.ts +10 -0
- package/dist/utils/protocol-rehydrate-filters.d.ts.map +1 -0
- package/dist/utils/protocol-rehydrate-filters.js +36 -0
- package/dist/utils/protocol-semantic-metadata.d.ts +5 -0
- package/dist/utils/protocol-semantic-metadata.d.ts.map +1 -0
- package/dist/utils/protocol-semantic-metadata.js +5 -0
- package/dist/utils/published-name.d.ts +3 -0
- package/dist/utils/published-name.d.ts.map +1 -0
- package/dist/utils/published-name.js +7 -0
- package/dist/utils/published-relationships.d.ts +34 -0
- package/dist/utils/published-relationships.d.ts.map +1 -0
- package/dist/utils/published-relationships.js +35 -0
- package/dist/utils/relationship-fields.d.ts +7 -0
- package/dist/utils/relationship-fields.d.ts.map +1 -1
- package/dist/utils/relationship-fields.js +13 -1
- package/dist/utils/result-limits.d.ts +34 -0
- package/dist/utils/result-limits.d.ts.map +1 -0
- package/dist/utils/result-limits.js +40 -0
- package/dist/utils/semantic-metadata-validation.d.ts +4 -0
- package/dist/utils/semantic-metadata-validation.d.ts.map +1 -0
- package/dist/utils/semantic-metadata-validation.js +103 -0
- package/dist/utils/semantic-metadata.d.ts +4 -0
- package/dist/utils/semantic-metadata.d.ts.map +1 -0
- package/dist/utils/semantic-metadata.js +13 -0
- package/dist/utils/semantic-result-serialization.d.ts +9 -0
- package/dist/utils/semantic-result-serialization.d.ts.map +1 -0
- package/dist/utils/semantic-result-serialization.js +26 -0
- package/dist/utils/semantic-tool.d.ts +5 -0
- package/dist/utils/semantic-tool.d.ts.map +1 -0
- package/dist/utils/semantic-tool.js +29 -0
- package/package.json +5 -4
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rebuilds executable datasets from a portable deployment contract.
|
|
3
|
+
*
|
|
4
|
+
* The inverse of `protocol-adapter.ts`. Decision 0005 chose portable native
|
|
5
|
+
* execution, which means a runtime resolves a dataset from the validated active
|
|
6
|
+
* contract and plans the query with the existing semantic planner — no customer
|
|
7
|
+
* module is loaded. This is the function that makes the contract executable.
|
|
8
|
+
*
|
|
9
|
+
* Rehydration deliberately routes through the public `dataset()` factory rather
|
|
10
|
+
* than assembling an instance by hand, so a rebuilt dataset is constructed by
|
|
11
|
+
* exactly the same code path as an authored one. That is what makes the
|
|
12
|
+
* byte-identical SQL claim mitigated by construction rather than by review.
|
|
13
|
+
*/
|
|
14
|
+
import { dataset } from './dataset.js';
|
|
15
|
+
import { snapshotSemanticMetadata } from './utils/semantic-metadata.js';
|
|
16
|
+
import { withContractCapabilities } from './utils/protocol-metric-capabilities.js';
|
|
17
|
+
import { rehydrateMeasureFilter } from './utils/protocol-rehydrate-filters.js';
|
|
18
|
+
/**
|
|
19
|
+
* Thrown when a contract describes something portable execution cannot rebuild.
|
|
20
|
+
*
|
|
21
|
+
* Callers map this onto the `unsupported-capability` invocation failure rather
|
|
22
|
+
* than executing an approximation, as decision 0005 requires.
|
|
23
|
+
*/
|
|
24
|
+
export class UnsupportedContractFeatureError extends Error {
|
|
25
|
+
dataset;
|
|
26
|
+
feature;
|
|
27
|
+
constructor(datasetName, feature, detail) {
|
|
28
|
+
super(`Cannot rebuild ${feature} on dataset "${datasetName}": ${detail}`);
|
|
29
|
+
this.name = 'UnsupportedContractFeatureError';
|
|
30
|
+
this.dataset = datasetName;
|
|
31
|
+
this.feature = feature;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function rehydrateDimensions(contract) {
|
|
35
|
+
const dimensions = {};
|
|
36
|
+
for (const dimension of contract.dimensions) {
|
|
37
|
+
const name = String(dimension.name);
|
|
38
|
+
const source = dimension.source;
|
|
39
|
+
dimensions[name] = {
|
|
40
|
+
__type: 'field_definition',
|
|
41
|
+
...snapshotSemanticMetadata(dimension),
|
|
42
|
+
fieldType: dimension.type,
|
|
43
|
+
label: dimension.label,
|
|
44
|
+
description: dimension.description,
|
|
45
|
+
// A column source always carries its column, including when it matches
|
|
46
|
+
// the dimension name — the forward adapter defaults it, so dropping it
|
|
47
|
+
// here would still round-trip but would lose an authored mapping.
|
|
48
|
+
column: source.kind === 'column' ? source.column : undefined,
|
|
49
|
+
sql: source.kind === 'column' ? undefined : source.sql,
|
|
50
|
+
dependencies: source.kind === 'column' ? undefined : [...source.dependencies],
|
|
51
|
+
filterable: dimension.filterable,
|
|
52
|
+
groupable: dimension.groupable,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return dimensions;
|
|
56
|
+
}
|
|
57
|
+
function rehydrateMeasure(datasetName, measure) {
|
|
58
|
+
const filters = measure.filters.map((expression, index) => rehydrateMeasureFilter(expression, () => new UnsupportedContractFeatureError(datasetName, `measure "${String(measure.name)}"`, `fixed filter ${index} is not a field/operator/value comparison`)));
|
|
59
|
+
return {
|
|
60
|
+
__type: 'measure_definition',
|
|
61
|
+
...snapshotSemanticMetadata(measure),
|
|
62
|
+
aggregation: measure.aggregation,
|
|
63
|
+
field: String(measure.field),
|
|
64
|
+
...(measure.argField !== undefined ? { argField: String(measure.argField) } : {}),
|
|
65
|
+
...(measure.level !== undefined ? { level: measure.level } : {}),
|
|
66
|
+
...(measure.sql !== undefined
|
|
67
|
+
? { sql: measure.sql.sql, dependencies: [...measure.sql.dependencies] }
|
|
68
|
+
: {}),
|
|
69
|
+
...(measure.label !== undefined ? { label: measure.label } : {}),
|
|
70
|
+
...(measure.description !== undefined ? { description: measure.description } : {}),
|
|
71
|
+
...(filters.length > 0 ? { filters: filters } : {}),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function rehydrateFilters(contract) {
|
|
75
|
+
const filters = {};
|
|
76
|
+
for (const filter of contract.filters) {
|
|
77
|
+
filters[String(filter.name)] = {
|
|
78
|
+
__type: 'filter_definition',
|
|
79
|
+
...snapshotSemanticMetadata(filter),
|
|
80
|
+
field: String(filter.field),
|
|
81
|
+
operators: [...filter.operators],
|
|
82
|
+
...(filter.label !== undefined ? { label: filter.label } : {}),
|
|
83
|
+
...(filter.description !== undefined ? { description: filter.description } : {}),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return filters;
|
|
87
|
+
}
|
|
88
|
+
function rehydrateRelationships(contract, resolve) {
|
|
89
|
+
const relationships = {};
|
|
90
|
+
for (const relationship of contract.relationships) {
|
|
91
|
+
const target = String(relationship.target);
|
|
92
|
+
relationships[String(relationship.name)] = {
|
|
93
|
+
__type: 'relationship',
|
|
94
|
+
kind: relationship.kind,
|
|
95
|
+
// Resolved on call: datasets in one contract may reference each other, so
|
|
96
|
+
// the target may not be built yet when this relationship is created.
|
|
97
|
+
target: () => resolve(target),
|
|
98
|
+
from: String(relationship.from),
|
|
99
|
+
to: String(relationship.to),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return relationships;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Identity of an aggregation, used to bind a metric back to the measure it was
|
|
106
|
+
* built from.
|
|
107
|
+
*
|
|
108
|
+
* Aggregation and field alone are not enough: two measures may share both and
|
|
109
|
+
* differ only by their fixed filters — `sum(amount)` and `sum(amount) where
|
|
110
|
+
* status = 'paid'`. Matching on the looser key binds the metric to whichever
|
|
111
|
+
* measure happens to sort first and silently changes the SQL it emits.
|
|
112
|
+
*/
|
|
113
|
+
function aggregationKey(value) {
|
|
114
|
+
return JSON.stringify([
|
|
115
|
+
value.aggregation,
|
|
116
|
+
String(value.field),
|
|
117
|
+
value.argField === undefined ? null : String(value.argField),
|
|
118
|
+
value.level ?? null,
|
|
119
|
+
value.filters ?? [],
|
|
120
|
+
]);
|
|
121
|
+
}
|
|
122
|
+
function rehydrateMetric(instance, contract, metric) {
|
|
123
|
+
const name = String(metric.name);
|
|
124
|
+
if (metric.kind === 'derived-metric') {
|
|
125
|
+
// The symbolic expression a derived metric needs is not carried by contract
|
|
126
|
+
// v1; CORE-17 adds it. Until then this fails closed rather than guessing.
|
|
127
|
+
throw new UnsupportedContractFeatureError(instance.name, `metric "${name}"`, 'a derived metric requires its symbolic expression, which deployment contract v1 does not carry');
|
|
128
|
+
}
|
|
129
|
+
const expression = metric.expression;
|
|
130
|
+
if (expression.kind !== 'aggregate') {
|
|
131
|
+
throw new UnsupportedContractFeatureError(instance.name, `metric "${name}"`, `expected an aggregate expression, received "${expression.kind}"`);
|
|
132
|
+
}
|
|
133
|
+
const field = String(expression.field);
|
|
134
|
+
const candidates = contract.measures.filter(measure => (aggregationKey(measure) === aggregationKey(expression)));
|
|
135
|
+
if (candidates.length === 0) {
|
|
136
|
+
throw new UnsupportedContractFeatureError(instance.name, `metric "${name}"`, `no declared measure matches ${expression.aggregation}(${field})`);
|
|
137
|
+
}
|
|
138
|
+
// A metric expression carries no raw SQL, so two measures that share an
|
|
139
|
+
// aggregation identity but override SQL differently are indistinguishable in
|
|
140
|
+
// contract v1. Binding to either would be a guess at which SQL to emit.
|
|
141
|
+
const distinctSql = new Set(candidates.map(measure => measure.sql?.sql ?? null));
|
|
142
|
+
if (distinctSql.size > 1) {
|
|
143
|
+
throw new UnsupportedContractFeatureError(instance.name, `metric "${name}"`, `${candidates.map(measure => `"${String(measure.name)}"`).join(' and ')} share `
|
|
144
|
+
+ `${expression.aggregation}(${field}) but emit different SQL, so the contract cannot `
|
|
145
|
+
+ 'say which one this metric was built from');
|
|
146
|
+
}
|
|
147
|
+
const measureName = candidates[0].name;
|
|
148
|
+
const base = instance.metric(name, {
|
|
149
|
+
measure: measureName,
|
|
150
|
+
...snapshotSemanticMetadata(metric),
|
|
151
|
+
...(metric.label !== undefined ? { label: metric.label } : {}),
|
|
152
|
+
...(metric.description !== undefined ? { description: metric.description } : {}),
|
|
153
|
+
});
|
|
154
|
+
const handle = metric.grain === undefined
|
|
155
|
+
? base
|
|
156
|
+
: base.by(metric.grain);
|
|
157
|
+
return withContractCapabilities(handle, metric);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Rebuild every dataset in a validated deployment contract.
|
|
161
|
+
*
|
|
162
|
+
* Datasets are returned keyed by contract name with their named metrics
|
|
163
|
+
* attached, which is the registry shape `getDatasetCatalog`,
|
|
164
|
+
* `projectAgentSafeCatalog`, and `DatasetClient` already accept.
|
|
165
|
+
*/
|
|
166
|
+
export function rehydrateProtocolDatasets(contracts, options = {}) {
|
|
167
|
+
const instances = new Map();
|
|
168
|
+
const registry = {};
|
|
169
|
+
// Relationship targets resolve to the published entry, not the bare instance
|
|
170
|
+
// built below, so a caller that follows a relationship lands on the same
|
|
171
|
+
// object the registry exposes. Safe because `target()` is only called after
|
|
172
|
+
// the registry is complete.
|
|
173
|
+
const resolve = (target) => {
|
|
174
|
+
const instance = registry[target] ?? instances.get(target);
|
|
175
|
+
if (!instance) {
|
|
176
|
+
// The deployment validator already rejects a dangling relationship, so
|
|
177
|
+
// reaching this means the caller passed a partial contract.
|
|
178
|
+
throw new UnsupportedContractFeatureError(target, 'relationship target', `dataset "${target}" is not part of the supplied contract`);
|
|
179
|
+
}
|
|
180
|
+
return instance;
|
|
181
|
+
};
|
|
182
|
+
for (const contract of contracts) {
|
|
183
|
+
const name = String(contract.name);
|
|
184
|
+
const instance = dataset(name, {
|
|
185
|
+
source: contract.source,
|
|
186
|
+
...snapshotSemanticMetadata(contract),
|
|
187
|
+
...(contract.description !== undefined ? { description: contract.description } : {}),
|
|
188
|
+
...(contract.owner !== undefined ? { owner: contract.owner } : {}),
|
|
189
|
+
...(contract.freshness !== undefined ? { freshness: { ...contract.freshness } } : {}),
|
|
190
|
+
...(contract.defaults !== undefined ? { defaults: {
|
|
191
|
+
...contract.defaults,
|
|
192
|
+
...(contract.defaults.dimensions !== undefined ? { dimensions: [...contract.defaults.dimensions] } : {}),
|
|
193
|
+
} } : {}),
|
|
194
|
+
...(contract.tenant.kind === 'required' ? { tenantKey: contract.tenant.field } : {}),
|
|
195
|
+
...(contract.timeField !== undefined ? { timeKey: String(contract.timeField) } : {}),
|
|
196
|
+
dimensions: rehydrateDimensions(contract),
|
|
197
|
+
measures: Object.fromEntries(contract.measures.map(measure => [
|
|
198
|
+
String(measure.name),
|
|
199
|
+
rehydrateMeasure(name, measure),
|
|
200
|
+
])),
|
|
201
|
+
filters: rehydrateFilters(contract),
|
|
202
|
+
relationships: rehydrateRelationships(contract, resolve),
|
|
203
|
+
...(contract.limits !== undefined ? { limits: { ...contract.limits } } : {}),
|
|
204
|
+
...(options.cache !== undefined ? { cache: options.cache } : {}),
|
|
205
|
+
});
|
|
206
|
+
instances.set(name, instance);
|
|
207
|
+
}
|
|
208
|
+
for (const contract of contracts) {
|
|
209
|
+
const name = String(contract.name);
|
|
210
|
+
const instance = instances.get(name);
|
|
211
|
+
const metrics = {};
|
|
212
|
+
for (const metric of contract.metrics) {
|
|
213
|
+
metrics[String(metric.name)] = rehydrateMetric(instance, contract, metric);
|
|
214
|
+
}
|
|
215
|
+
registry[name] = Object.assign(Object.create(Object.getPrototypeOf(instance)), instance, { metrics });
|
|
216
|
+
}
|
|
217
|
+
return registry;
|
|
218
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AnyDatasetInstance, MetricHandle } from '../../types.js';
|
|
2
|
+
import type { DatasetPublisherNode } from '../node.js';
|
|
3
|
+
export declare class DatasetPublicationFeature {
|
|
4
|
+
private readonly publisher;
|
|
5
|
+
constructor(publisher: {
|
|
6
|
+
getPublicationNode(): DatasetPublisherNode;
|
|
7
|
+
});
|
|
8
|
+
add(dataset: AnyDatasetInstance, alias: string, metrics: Readonly<Record<string, MetricHandle>>): DatasetPublisherNode;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=dataset-publication.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataset-publication.d.ts","sourceRoot":"","sources":["../../../src/publishing/features/dataset-publication.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGvE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,qBAAa,yBAAyB;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE;QACtC,kBAAkB,IAAI,oBAAoB,CAAC;KAC5C;IAED,GAAG,CACD,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,GAC9C,oBAAoB;CA8BxB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { aliasMetricHandle } from '../../utils/metric-alias.js';
|
|
2
|
+
import { assertPublishedName } from '../../utils/published-name.js';
|
|
3
|
+
export class DatasetPublicationFeature {
|
|
4
|
+
publisher;
|
|
5
|
+
constructor(publisher) {
|
|
6
|
+
this.publisher = publisher;
|
|
7
|
+
}
|
|
8
|
+
add(dataset, alias, metrics) {
|
|
9
|
+
const node = this.publisher.getPublicationNode();
|
|
10
|
+
assertPublishedName(alias, 'dataset');
|
|
11
|
+
if (node.entries.some(entry => entry.alias === alias)) {
|
|
12
|
+
throw new Error(`Dataset alias "${alias}" is already published.`);
|
|
13
|
+
}
|
|
14
|
+
if (node.entries.some(entry => entry.dataset.name === dataset.name)) {
|
|
15
|
+
throw new Error(`Dataset "${dataset.name}" is already published.`);
|
|
16
|
+
}
|
|
17
|
+
const publishedMetrics = {};
|
|
18
|
+
for (const [metricAlias, metric] of Object.entries(metrics)) {
|
|
19
|
+
assertPublishedName(metricAlias, 'metric');
|
|
20
|
+
const ref = metric.__type === 'grained_metric_ref' ? metric.metric : metric;
|
|
21
|
+
if (ref.datasetName !== dataset.name) {
|
|
22
|
+
throw new Error(`Metric "${metricAlias}" belongs to dataset "${ref.datasetName}", expected "${dataset.name}".`);
|
|
23
|
+
}
|
|
24
|
+
publishedMetrics[metricAlias] = aliasMetricHandle(metric, metricAlias, alias);
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
kind: 'dataset-publisher',
|
|
28
|
+
entries: [
|
|
29
|
+
...node.entries,
|
|
30
|
+
{ alias, dataset, metrics: publishedMetrics },
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AnyDatasetInstance, MetricHandle } from '../types.js';
|
|
2
|
+
export interface DatasetPublicationEntry {
|
|
3
|
+
readonly alias: string;
|
|
4
|
+
readonly dataset: AnyDatasetInstance;
|
|
5
|
+
readonly metrics: Readonly<Record<string, MetricHandle>>;
|
|
6
|
+
}
|
|
7
|
+
export interface DatasetPublisherNode {
|
|
8
|
+
readonly kind: 'dataset-publisher';
|
|
9
|
+
readonly entries: readonly DatasetPublicationEntry[];
|
|
10
|
+
}
|
|
11
|
+
export declare function createDatasetPublisherNode(entries?: readonly DatasetPublicationEntry[]): DatasetPublisherNode;
|
|
12
|
+
export declare function cloneDatasetPublisherNode(node: DatasetPublisherNode): DatasetPublisherNode;
|
|
13
|
+
export declare function materializeDatasetPublisherNode(node: DatasetPublisherNode): Readonly<Record<string, AnyDatasetInstance & {
|
|
14
|
+
readonly metrics: Readonly<Record<string, MetricHandle>>;
|
|
15
|
+
}>>;
|
|
16
|
+
//# sourceMappingURL=node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/publishing/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMpE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,CAAC;CACtD;AAED,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,SAAS,uBAAuB,EAAO,GAC/C,oBAAoB,CAStB;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,oBAAoB,GAAG,oBAAoB,CAE1F;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,oBAAoB,GACzB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG;IAC9C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;CAC1D,CAAC,CAAC,CAyBF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { publishedAliasesByName, rewirePublishedRelationships, } from '../utils/published-relationships.js';
|
|
2
|
+
export function createDatasetPublisherNode(entries = []) {
|
|
3
|
+
return {
|
|
4
|
+
kind: 'dataset-publisher',
|
|
5
|
+
entries: entries.map(entry => ({
|
|
6
|
+
alias: entry.alias,
|
|
7
|
+
dataset: entry.dataset,
|
|
8
|
+
metrics: { ...entry.metrics },
|
|
9
|
+
})),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function cloneDatasetPublisherNode(node) {
|
|
13
|
+
return createDatasetPublisherNode(node.entries);
|
|
14
|
+
}
|
|
15
|
+
export function materializeDatasetPublisherNode(node) {
|
|
16
|
+
const aliasesByName = publishedAliasesByName(node.entries);
|
|
17
|
+
const registry = new Map();
|
|
18
|
+
// Relationships resolve their target through this map rather than capturing
|
|
19
|
+
// an instance, so datasets that reference each other are rewired without an
|
|
20
|
+
// ordering constraint.
|
|
21
|
+
const lookup = (alias) => registry.get(alias);
|
|
22
|
+
const entries = [...node.entries]
|
|
23
|
+
.sort((left, right) => left.alias < right.alias ? -1 : left.alias > right.alias ? 1 : 0)
|
|
24
|
+
.map(entry => {
|
|
25
|
+
const published = Object.freeze({
|
|
26
|
+
...entry.dataset,
|
|
27
|
+
name: entry.alias,
|
|
28
|
+
relationships: rewirePublishedRelationships(entry.dataset.relationships, aliasesByName, lookup),
|
|
29
|
+
metrics: Object.freeze({ ...entry.metrics }),
|
|
30
|
+
});
|
|
31
|
+
registry.set(entry.alias, published);
|
|
32
|
+
return [entry.alias, published];
|
|
33
|
+
});
|
|
34
|
+
return Object.freeze(Object.fromEntries(entries));
|
|
35
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AnyDatasetInstance } from '../types.js';
|
|
2
|
+
import { type DatasetPublisherNode } from './node.js';
|
|
3
|
+
import type { AddPublishedDataset, AnyDatasetPublisherState, DatasetPublisherState, PublishedAlias, PublishedMetricMap, PublishDatasetOptions } from './types.js';
|
|
4
|
+
/** Immutable builder for publishing datasets and named metrics to consumers. */
|
|
5
|
+
export declare class DatasetPublisher<TState extends AnyDatasetPublisherState = DatasetPublisherState> {
|
|
6
|
+
private readonly state;
|
|
7
|
+
private readonly node;
|
|
8
|
+
private readonly publication;
|
|
9
|
+
constructor(state: TState, node?: DatasetPublisherNode);
|
|
10
|
+
getPublicationNode(): DatasetPublisherNode;
|
|
11
|
+
private transition;
|
|
12
|
+
publish<TDataset extends AnyDatasetInstance, const TAlias extends string | undefined = undefined, const TMetrics extends PublishedMetricMap<TDataset> = Record<string, never>>(dataset: TDataset, options?: PublishDatasetOptions<TDataset, TAlias, TMetrics>): DatasetPublisher<AddPublishedDataset<TState, TDataset, PublishedAlias<TDataset, TAlias>, TMetrics>>;
|
|
13
|
+
/** Materialize the plain registry shape accepted by existing Serve/MCP APIs. */
|
|
14
|
+
build(): TState['registry'];
|
|
15
|
+
}
|
|
16
|
+
export declare function publishDatasets(): DatasetPublisher<DatasetPublisherState>;
|
|
17
|
+
//# sourceMappingURL=publisher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../src/publishing/publisher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB,gFAAgF;AAChF,qBAAa,gBAAgB,CAC3B,MAAM,SAAS,wBAAwB,GAAG,qBAAqB;IAK7D,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;gBAGrC,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,oBAAmD;IAK5E,kBAAkB,IAAI,oBAAoB;IAI1C,OAAO,CAAC,UAAU;IAOlB,OAAO,CACL,QAAQ,SAAS,kBAAkB,EACnC,KAAK,CAAC,MAAM,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,EACnD,KAAK,CAAC,QAAQ,SAAS,kBAAkB,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAE3E,OAAO,EAAE,QAAQ,EACjB,OAAO,GAAE,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAM,GAC9D,gBAAgB,CAAC,mBAAmB,CACrC,MAAM,EACN,QAAQ,EACR,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAChC,QAAQ,CACT,CAAC;IAaF,gFAAgF;IAChF,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC;CAG5B;AAED,wBAAgB,eAAe,IAAI,gBAAgB,CAAC,qBAAqB,CAAC,CAEzE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { DatasetPublicationFeature } from './features/dataset-publication.js';
|
|
2
|
+
import { cloneDatasetPublisherNode, createDatasetPublisherNode, materializeDatasetPublisherNode, } from './node.js';
|
|
3
|
+
/** Immutable builder for publishing datasets and named metrics to consumers. */
|
|
4
|
+
export class DatasetPublisher {
|
|
5
|
+
state;
|
|
6
|
+
node;
|
|
7
|
+
publication;
|
|
8
|
+
constructor(state, node = createDatasetPublisherNode()) {
|
|
9
|
+
this.state = state;
|
|
10
|
+
this.node = node;
|
|
11
|
+
this.publication = new DatasetPublicationFeature(this);
|
|
12
|
+
}
|
|
13
|
+
getPublicationNode() {
|
|
14
|
+
return cloneDatasetPublisherNode(this.node);
|
|
15
|
+
}
|
|
16
|
+
transition(state, node) {
|
|
17
|
+
return new DatasetPublisher(state, node);
|
|
18
|
+
}
|
|
19
|
+
publish(dataset, options = {}) {
|
|
20
|
+
const alias = options.alias ?? dataset.name;
|
|
21
|
+
const node = this.publication.add(dataset, alias, options.metrics ?? {});
|
|
22
|
+
const state = { registry: materializeDatasetPublisherNode(node) };
|
|
23
|
+
return this.transition(state, node);
|
|
24
|
+
}
|
|
25
|
+
/** Materialize the plain registry shape accepted by existing Serve/MCP APIs. */
|
|
26
|
+
build() {
|
|
27
|
+
return this.state.registry;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function publishDatasets() {
|
|
31
|
+
return new DatasetPublisher({ registry: {} });
|
|
32
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { AggregationSpec, AnyDatasetInstance, DerivedMetricSpec, GrainedMetricRef, MetricHandle, MetricRef, TimeGrain } from '../types.js';
|
|
2
|
+
export type PublishableMetric<TDataset extends AnyDatasetInstance> = MetricHandle<TDataset['name'], string, AggregationSpec | DerivedMetricSpec<TDataset['name']>, TDataset>;
|
|
3
|
+
export type PublishedMetricMap<TDataset extends AnyDatasetInstance> = Readonly<Record<string, PublishableMetric<TDataset>>>;
|
|
4
|
+
export type PublishedMetricHandle<TMetric extends MetricHandle, TAlias extends string, TDatasetAlias extends string> = TMetric extends MetricRef ? Omit<TMetric, 'datasetName' | 'name' | 'by'> & {
|
|
5
|
+
readonly datasetName: TDatasetAlias;
|
|
6
|
+
readonly name: TAlias;
|
|
7
|
+
by(grain: TimeGrain): PublishedMetricHandle<ReturnType<TMetric['by']>, TAlias, TDatasetAlias>;
|
|
8
|
+
} : TMetric extends GrainedMetricRef ? Omit<TMetric, 'metric'> & {
|
|
9
|
+
readonly metric: PublishedMetricHandle<TMetric['metric'], TAlias, TDatasetAlias>;
|
|
10
|
+
} : never;
|
|
11
|
+
export type PublishedMetrics<TMetrics extends Readonly<Record<string, MetricHandle>>, TDatasetAlias extends string> = {
|
|
12
|
+
readonly [TAlias in keyof TMetrics]: TAlias extends string ? PublishedMetricHandle<TMetrics[TAlias], TAlias, TDatasetAlias> : never;
|
|
13
|
+
};
|
|
14
|
+
export type PublishedDataset<TDataset extends AnyDatasetInstance = AnyDatasetInstance, TAlias extends string = TDataset['name'], TMetrics extends PublishedMetricMap<TDataset> = PublishedMetricMap<TDataset>> = Omit<TDataset, 'name'> & {
|
|
15
|
+
readonly name: TAlias;
|
|
16
|
+
readonly metrics: PublishedMetrics<TMetrics, TAlias>;
|
|
17
|
+
};
|
|
18
|
+
export type PublishedDatasetRegistry = Readonly<Record<string, PublishedDataset<AnyDatasetInstance, string>>>;
|
|
19
|
+
export interface PublishDatasetOptions<TDataset extends AnyDatasetInstance, TAlias extends string | undefined = undefined, TMetrics extends PublishedMetricMap<TDataset> = Record<string, never>> {
|
|
20
|
+
/** Public registry name. Defaults to `dataset.name`. */
|
|
21
|
+
readonly alias?: TAlias;
|
|
22
|
+
/** Public metric names mapped to handles owned by this dataset. */
|
|
23
|
+
readonly metrics?: TMetrics;
|
|
24
|
+
}
|
|
25
|
+
export interface DatasetPublisherState<TRegistry extends PublishedDatasetRegistry = {}> {
|
|
26
|
+
readonly registry: TRegistry;
|
|
27
|
+
}
|
|
28
|
+
export type AnyDatasetPublisherState = DatasetPublisherState<PublishedDatasetRegistry>;
|
|
29
|
+
export type PublishedAlias<TDataset extends AnyDatasetInstance, TAlias extends string | undefined> = TAlias extends string ? TAlias : TDataset['name'];
|
|
30
|
+
export type AddPublishedDataset<TState extends AnyDatasetPublisherState, TDataset extends AnyDatasetInstance, TAlias extends string, TMetrics extends PublishedMetricMap<TDataset>> = DatasetPublisherState<TState['registry'] & Record<TAlias, PublishedDataset<TDataset, TAlias, TMetrics>>>;
|
|
31
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/publishing/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -43,7 +43,9 @@ export interface QueryBuilderLike {
|
|
|
43
43
|
sql: string;
|
|
44
44
|
parameters: unknown[];
|
|
45
45
|
};
|
|
46
|
-
execute<T = Record<string, unknown>>(
|
|
46
|
+
execute<T = Record<string, unknown>>(options?: {
|
|
47
|
+
abortSignal?: AbortSignal;
|
|
48
|
+
}): Promise<T[]>;
|
|
47
49
|
}
|
|
48
50
|
export interface QueryBuilderJoinCondition {
|
|
49
51
|
column: string;
|
|
@@ -53,7 +55,9 @@ export interface QueryBuilderJoinCondition {
|
|
|
53
55
|
/** A query builder factory (what `createQueryBuilder(config)` returns). */
|
|
54
56
|
export interface QueryBuilderFactoryLike {
|
|
55
57
|
table(name: string): QueryBuilderLike;
|
|
56
|
-
rawQuery<T = Record<string, unknown>>(sql: string, params?: unknown[]
|
|
58
|
+
rawQuery<T = Record<string, unknown>>(sql: string, params?: unknown[], options?: {
|
|
59
|
+
abortSignal?: AbortSignal;
|
|
60
|
+
}): Promise<T[]>;
|
|
57
61
|
}
|
|
58
62
|
/**
|
|
59
63
|
* Acceptance shape for query builder factories at public entry points.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-builder-protocol.d.ts","sourceRoot":"","sources":["../src/query-builder-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,wEAAwE;AACxE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,gBAAgB,CAAC;IAGrD,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACtD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACxD,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAChE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACtD,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACtD,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAGtD,kEAAkE;IAClE,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC7E,kEAAkE;IAClE,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC7E,+DAA+D;IAC/D,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC3E,6CAA6C;IAC7C,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC1D,mCAAmC;IACnC,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAG5D,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAAC;IAG1E,QAAQ,CACN,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,EACd,EAAE,CAAC,EAAE,yBAAyB,GAAG,yBAAyB,EAAE,GAC3D,gBAAgB,CAAC;IAEpB;;;;OAIG;IACH,WAAW,CAAC,CACV,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,EACd,EAAE,CAAC,EAAE,yBAAyB,GAAG,yBAAyB,EAAE,GAC3D,gBAAgB,CAAC;IAGpB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,gBAAgB,CAAC;IAGtD,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,gBAAgB,CAAC;IACtE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACvC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAGxC,eAAe,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IAC1D,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"query-builder-protocol.d.ts","sourceRoot":"","sources":["../src/query-builder-protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/semantic-plan.d.ts
CHANGED
|
@@ -119,7 +119,9 @@ export interface SemanticBackendResult<T = Record<string, unknown>> {
|
|
|
119
119
|
* implementing a backend.
|
|
120
120
|
*/
|
|
121
121
|
export interface SemanticBackend {
|
|
122
|
-
execute<T = Record<string, unknown>>(plan: PlanNode
|
|
122
|
+
execute<T = Record<string, unknown>>(plan: PlanNode, options?: {
|
|
123
|
+
abortSignal?: AbortSignal;
|
|
124
|
+
}): Promise<SemanticBackendResult<T>>;
|
|
123
125
|
explain?(plan: PlanNode): Promise<{
|
|
124
126
|
sql?: string;
|
|
125
127
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-plan.d.ts","sourceRoot":"","sources":["../src/semantic-plan.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"semantic-plan.d.ts","sourceRoot":"","sources":["../src/semantic-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-planner.d.ts","sourceRoot":"","sources":["../src/semantic-planner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"semantic-planner.d.ts","sourceRoot":"","sources":["../src/semantic-planner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAGhB,WAAW,EACX,SAAS,EACT,gBAAgB,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACV,QAAQ,EAIT,MAAM,oBAAoB,CAAC;AAyL5B,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,kBAAkB,EACtB,KAAK,GAAE,YAAiB,EACxB,OAAO,CAAC,EAAE,gBAAgB,GACzB,QAAQ,CAaV;AA2FD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,GAAG,gBAAgB,EACpC,KAAK,GAAE,WAAgB,EACvB,OAAO,CAAC,EAAE,gBAAgB,GACzB,QAAQ,CAYV"}
|
package/dist/semantic-planner.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { protocolMetricCapabilityErrors } from './utils/protocol-metric-capabilities.js';
|
|
1
2
|
import { getMetricGrain, getMetricRef, } from './utils/metric-handle.js';
|
|
2
3
|
import { validateDatasetQuery } from './dataset-query.js';
|
|
3
4
|
import { isSupportedTimeGrain } from './constants.js';
|
|
@@ -213,6 +214,9 @@ function buildDerivedMetricPlan(metric, query, context) {
|
|
|
213
214
|
};
|
|
214
215
|
}
|
|
215
216
|
export function buildMetricPlan(metric, query = {}, context) {
|
|
217
|
+
const errors = protocolMetricCapabilityErrors(metric, query);
|
|
218
|
+
if (errors.length)
|
|
219
|
+
throw new Error(`Invalid metric query: ${errors.join('; ')}`);
|
|
216
220
|
const ref = getMetricRef(metric);
|
|
217
221
|
const grain = getMetricGrain(metric, query);
|
|
218
222
|
const plannedQuery = { ...query, by: grain };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type ZodTypeAny } from 'zod';
|
|
2
|
+
import { type DatasetCatalog, type DatasetCatalogSource, type MetricCatalogEntry } from './catalog.js';
|
|
3
|
+
import type { JsonSchema } from './tools.js';
|
|
4
|
+
export interface SemanticQuerySchemaLimits {
|
|
5
|
+
defaultResultSize?: number;
|
|
6
|
+
maxResultSize?: number;
|
|
7
|
+
maxOffset?: number;
|
|
8
|
+
maxDimensions?: number;
|
|
9
|
+
maxMeasures?: number;
|
|
10
|
+
maxFilters?: number;
|
|
11
|
+
maxOrderBy?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface SemanticQuerySchemaOptions extends SemanticQuerySchemaLimits {
|
|
14
|
+
/** Input field used for time grain. Serve uses `by`; agent tools use `grain`. */
|
|
15
|
+
grainField?: 'by' | 'grain';
|
|
16
|
+
/** Include Serve's opt-in result metadata flag. */
|
|
17
|
+
includeMeta?: boolean;
|
|
18
|
+
/** Require at least one dimension or measure for dataset queries. */
|
|
19
|
+
requireSelection?: boolean;
|
|
20
|
+
/** Validate result limits in the schema. Disable when a consumer clamps them. */
|
|
21
|
+
enforceResultLimit?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/** Metric-specific query capabilities used when they are not embedded in the Dataset source. */
|
|
24
|
+
export type SemanticMetricQueryContract = Pick<MetricCatalogEntry, 'dimensions' | 'filters' | 'grains' | 'grain'>;
|
|
25
|
+
export declare const DEFAULT_SEMANTIC_QUERY_SCHEMA_LIMITS: Readonly<{
|
|
26
|
+
maxResultSize: 10000;
|
|
27
|
+
maxOffset: 10000;
|
|
28
|
+
maxDimensions: 50;
|
|
29
|
+
maxMeasures: 50;
|
|
30
|
+
maxFilters: 100;
|
|
31
|
+
maxOrderBy: 50;
|
|
32
|
+
}>;
|
|
33
|
+
export interface CanonicalSemanticQuerySchemas {
|
|
34
|
+
readonly queryDataset: ZodTypeAny;
|
|
35
|
+
readonly queryMetric: ZodTypeAny;
|
|
36
|
+
readonly queryDatasetJsonSchema: JsonSchema;
|
|
37
|
+
readonly queryMetricJsonSchema: JsonSchema;
|
|
38
|
+
readonly manifestHash: string;
|
|
39
|
+
}
|
|
40
|
+
/** A live local Dataset or an already-normalized catalog from a hosted contract. */
|
|
41
|
+
export type SemanticQuerySchemaSource = DatasetCatalogSource | DatasetCatalog;
|
|
42
|
+
export declare function buildDatasetInputSchema(dataset: SemanticQuerySchemaSource, options?: SemanticQuerySchemaOptions): ZodTypeAny;
|
|
43
|
+
export declare function buildMetricInputSchema(dataset: SemanticQuerySchemaSource, metricName: string, options?: SemanticQuerySchemaOptions, metricContract?: SemanticMetricQueryContract): ZodTypeAny;
|
|
44
|
+
export declare function toSemanticJsonSchema(schema: ZodTypeAny, options?: {
|
|
45
|
+
requireSelection?: boolean;
|
|
46
|
+
}): JsonSchema;
|
|
47
|
+
export declare function buildCanonicalSemanticQuerySchemas(datasets: Record<string, SemanticQuerySchemaSource>, options?: SemanticQuerySchemaOptions): CanonicalSemanticQuerySchemas;
|
|
48
|
+
//# sourceMappingURL=semantic-query-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-query-schema.d.ts","sourceRoot":"","sources":["../src/semantic-query-schema.ts"],"names":[],"mappings":"AAEA,OAAO,EAAK,KAAK,UAAU,EAAE,MAAM,KAAK,CAAC;AAEzC,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,WAAW,yBAAyB;IACxC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,0BAA2B,SAAQ,yBAAyB;IAC3E,iFAAiF;IACjF,UAAU,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC;IAC5B,mDAAmD;IACnD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,gGAAgG;AAChG,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAC5C,kBAAkB,EAClB,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAC9C,CAAC;AAEF,eAAO,MAAM,oCAAoC;;;;;;;EAO/C,CAAC;AAEH,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,sBAAsB,EAAE,UAAU,CAAC;IAC5C,QAAQ,CAAC,qBAAqB,EAAE,UAAU,CAAC;IAC3C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,oFAAoF;AACpF,MAAM,MAAM,yBAAyB,GAAG,oBAAoB,GAAG,cAAc,CAAC;AA6I9E,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,yBAAyB,EAClC,OAAO,GAAE,0BAA+B,GACvC,UAAU,CAOZ;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,yBAAyB,EAClC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,0BAA+B,EACxC,cAAc,CAAC,EAAE,2BAA2B,GAC3C,UAAU,CAaZ;AAsBD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C,UAAU,CAMZ;AAyBD,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,EACnD,OAAO,GAAE,0BAA+B,GACvC,6BAA6B,CA0C/B"}
|