@hypequery/datasets 0.23.1 → 0.24.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 +14 -0
- package/dist/aggregations.d.ts +3 -0
- package/dist/aggregations.d.ts.map +1 -1
- package/dist/aggregations.js +6 -0
- package/dist/cache/definition-identity.js +2 -2
- package/dist/cache/query-signature.d.ts.map +1 -1
- package/dist/cache/query-signature.js +3 -0
- package/dist/catalog.d.ts +3 -0
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +3 -2
- package/dist/client-contract/query-schema.d.ts +19 -0
- package/dist/client-contract/query-schema.d.ts.map +1 -0
- package/dist/client-contract/query-schema.js +85 -0
- package/dist/constants.d.ts +5 -4
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +7 -6
- package/dist/contract.d.ts +2 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +4 -3
- package/dist/dataset-sql-dialect.d.ts +117 -0
- package/dist/dataset-sql-dialect.d.ts.map +1 -1
- package/dist/dataset.d.ts +1 -1
- package/dist/dataset.d.ts.map +1 -1
- package/dist/dataset.js +2 -1
- package/dist/in-memory-backend.d.ts.map +1 -1
- package/dist/in-memory-backend.js +2 -0
- package/dist/index.d.ts +48 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -6
- package/dist/internal.d.ts +5 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +5 -1
- package/dist/measure.d.ts +9 -1
- package/dist/measure.d.ts.map +1 -1
- package/dist/measure.js +9 -1
- package/dist/metric-query-engine.d.ts.map +1 -1
- package/dist/metric-query-engine.js +4 -3
- package/dist/protocol-adapter.d.ts.map +1 -1
- package/dist/protocol-adapter.js +5 -3
- package/dist/protocol-deployment-adapter.d.ts.map +1 -1
- package/dist/protocol-deployment-adapter.js +7 -1
- package/dist/protocol-schema-adapter.d.ts +7 -7
- package/dist/protocol-schema-adapter.d.ts.map +1 -1
- package/dist/protocol-schema-adapter.js +12 -245
- package/dist/query-builder-protocol.d.ts +32 -1
- package/dist/query-builder-protocol.d.ts.map +1 -1
- package/dist/query-planner.d.ts +14 -5
- package/dist/query-planner.d.ts.map +1 -1
- package/dist/query-planner.js +53 -34
- package/dist/relationship-check.d.ts.map +1 -1
- package/dist/relationship-check.js +5 -3
- package/dist/schemas.d.ts +17 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +16 -0
- package/dist/semantic-planner.d.ts.map +1 -1
- package/dist/semantic-planner.js +16 -0
- package/dist/semantic-query-schema.d.ts +2 -1
- package/dist/semantic-query-schema.d.ts.map +1 -1
- package/dist/semantic-query-schema.js +12 -12
- package/dist/types.d.ts +22 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/aggregate-state-functions.d.ts +24 -0
- package/dist/utils/aggregate-state-functions.d.ts.map +1 -0
- package/dist/utils/aggregate-state-functions.js +60 -0
- package/dist/utils/approximate-measures.d.ts +3 -1
- package/dist/utils/approximate-measures.d.ts.map +1 -1
- package/dist/utils/approximate-measures.js +8 -2
- package/dist/utils/base-measure-definition.d.ts +16 -0
- package/dist/utils/base-measure-definition.d.ts.map +1 -1
- package/dist/utils/base-measure-definition.js +31 -0
- package/dist/utils/build-dataset-query-builder.d.ts.map +1 -1
- package/dist/utils/build-dataset-query-builder.js +16 -8
- package/dist/utils/by-name.d.ts +8 -0
- package/dist/utils/by-name.d.ts.map +1 -0
- package/dist/utils/by-name.js +44 -0
- package/dist/utils/calendar-shift-sql.d.ts +5 -4
- package/dist/utils/calendar-shift-sql.d.ts.map +1 -1
- package/dist/utils/calendar-shift-sql.js +8 -8
- package/dist/utils/clickhouse-dataset-sql-dialect.d.ts +2 -2
- package/dist/utils/clickhouse-dataset-sql-dialect.d.ts.map +1 -1
- package/dist/utils/clickhouse-dataset-sql-dialect.js +140 -1
- package/dist/utils/compile-dataset-query.d.ts.map +1 -1
- package/dist/utils/compile-dataset-query.js +9 -6
- package/dist/utils/composite-time-measure-sql.d.ts +3 -5
- package/dist/utils/composite-time-measure-sql.d.ts.map +1 -1
- package/dist/utils/composite-time-measure-sql.js +15 -16
- package/dist/utils/count-aggregations.d.ts +4 -0
- package/dist/utils/count-aggregations.d.ts.map +1 -0
- package/dist/utils/count-aggregations.js +6 -0
- package/dist/utils/dataset-definition-validation.d.ts.map +1 -1
- package/dist/utils/dataset-definition-validation.js +36 -26
- package/dist/utils/dataset-derived-query.d.ts +2 -4
- package/dist/utils/dataset-derived-query.d.ts.map +1 -1
- package/dist/utils/dataset-derived-query.js +11 -14
- package/dist/utils/dataset-having.d.ts +5 -7
- package/dist/utils/dataset-having.d.ts.map +1 -1
- package/dist/utils/dataset-having.js +9 -12
- package/dist/utils/dataset-normalization.d.ts.map +1 -1
- package/dist/utils/dataset-normalization.js +1 -0
- package/dist/utils/dataset-query-validation.d.ts.map +1 -1
- package/dist/utils/dataset-query-validation.js +7 -0
- package/dist/utils/dataset-source.d.ts +9 -0
- package/dist/utils/dataset-source.d.ts.map +1 -0
- package/dist/utils/dataset-source.js +16 -0
- package/dist/utils/dataset-sql-dialect.d.ts +13 -2
- package/dist/utils/dataset-sql-dialect.d.ts.map +1 -1
- package/dist/utils/dataset-sql-dialect.js +74 -1
- package/dist/utils/dataset-validation.d.ts.map +1 -1
- package/dist/utils/dataset-validation.js +7 -0
- package/dist/utils/deployable-formulas.d.ts +33 -0
- package/dist/utils/deployable-formulas.d.ts.map +1 -0
- package/dist/utils/deployable-formulas.js +102 -0
- package/dist/utils/derived-cte-validation.d.ts +5 -0
- package/dist/utils/derived-cte-validation.d.ts.map +1 -1
- package/dist/utils/derived-cte-validation.js +77 -8
- package/dist/utils/derived-measure-sql.d.ts +10 -2
- package/dist/utils/derived-measure-sql.d.ts.map +1 -1
- package/dist/utils/derived-measure-sql.js +23 -43
- package/dist/utils/filter-field-type.d.ts +14 -0
- package/dist/utils/filter-field-type.d.ts.map +1 -0
- package/dist/utils/filter-field-type.js +21 -0
- package/dist/utils/filtered-aggregation-sql.d.ts +2 -1
- package/dist/utils/filtered-aggregation-sql.d.ts.map +1 -1
- package/dist/utils/filtered-aggregation-sql.js +18 -35
- package/dist/utils/groupable.d.ts +7 -0
- package/dist/utils/groupable.d.ts.map +1 -0
- package/dist/utils/groupable.js +8 -0
- package/dist/utils/metric-derived-query.d.ts +2 -4
- package/dist/utils/metric-derived-query.d.ts.map +1 -1
- package/dist/utils/metric-derived-query.js +54 -41
- package/dist/utils/metric-query-builder.d.ts.map +1 -1
- package/dist/utils/metric-query-builder.js +17 -9
- package/dist/utils/metric-query-validation.d.ts.map +1 -1
- package/dist/utils/metric-query-validation.js +7 -0
- package/dist/utils/portable-aggregations.d.ts +1 -0
- package/dist/utils/portable-aggregations.d.ts.map +1 -1
- package/dist/utils/portable-aggregations.js +5 -0
- package/dist/utils/protocol-schema-conversion.d.ts +12 -0
- package/dist/utils/protocol-schema-conversion.d.ts.map +1 -0
- package/dist/utils/protocol-schema-conversion.js +61 -0
- package/dist/utils/query-field-references.d.ts +10 -0
- package/dist/utils/query-field-references.d.ts.map +1 -0
- package/dist/utils/query-field-references.js +38 -0
- package/dist/utils/query-timezone.d.ts +41 -3
- package/dist/utils/query-timezone.d.ts.map +1 -1
- package/dist/utils/query-timezone.js +75 -8
- package/dist/utils/raw-sql-dialect-check.d.ts +12 -0
- package/dist/utils/raw-sql-dialect-check.d.ts.map +1 -0
- package/dist/utils/raw-sql-dialect-check.js +37 -0
- package/dist/utils/relationship-builder-plan.d.ts +25 -8
- package/dist/utils/relationship-builder-plan.d.ts.map +1 -1
- package/dist/utils/relationship-builder-plan.js +23 -9
- package/dist/utils/relationship-measure-sql.d.ts +14 -4
- package/dist/utils/relationship-measure-sql.d.ts.map +1 -1
- package/dist/utils/relationship-measure-sql.js +33 -10
- package/dist/utils/relationship-measures.d.ts.map +1 -1
- package/dist/utils/relationship-measures.js +3 -0
- package/dist/utils/semantic-tool.d.ts +2 -2
- package/dist/utils/semantic-tool.d.ts.map +1 -1
- package/dist/utils/semantic-tool.js +1 -1
- package/dist/utils/shift-measure-sql.d.ts +5 -4
- package/dist/utils/shift-measure-sql.d.ts.map +1 -1
- package/dist/utils/shift-measure-sql.js +25 -26
- package/dist/utils/shift-wall-time-sql.d.ts +2 -1
- package/dist/utils/shift-wall-time-sql.d.ts.map +1 -1
- package/dist/utils/shift-wall-time-sql.js +7 -7
- package/dist/utils/statement-parameters.d.ts +58 -0
- package/dist/utils/statement-parameters.d.ts.map +1 -0
- package/dist/utils/statement-parameters.js +101 -0
- package/dist/utils/time-axis-calendar-guard.d.ts +2 -1
- package/dist/utils/time-axis-calendar-guard.d.ts.map +1 -1
- package/dist/utils/time-axis-calendar-guard.js +5 -7
- package/dist/utils/time-measure-axis-sql.d.ts +2 -1
- package/dist/utils/time-measure-axis-sql.d.ts.map +1 -1
- package/dist/utils/time-measure-axis-sql.js +19 -22
- package/dist/utils/time-measure-context-sql.d.ts +3 -2
- package/dist/utils/time-measure-context-sql.d.ts.map +1 -1
- package/dist/utils/time-measure-context-sql.js +11 -11
- package/dist/utils/time-measure-dataset-sql.d.ts +7 -5
- package/dist/utils/time-measure-dataset-sql.d.ts.map +1 -1
- package/dist/utils/time-measure-dataset-sql.js +17 -12
- package/dist/utils/time-measure-leaf-sql.d.ts +2 -1
- package/dist/utils/time-measure-leaf-sql.d.ts.map +1 -1
- package/dist/utils/time-measure-leaf-sql.js +17 -18
- package/dist/utils/time-measure-result-sql.d.ts.map +1 -1
- package/dist/utils/time-measure-result-sql.js +10 -11
- package/dist/utils/time-measure-source-sql.d.ts +2 -2
- package/dist/utils/time-measure-source-sql.d.ts.map +1 -1
- package/dist/utils/time-measure-source-sql.js +25 -16
- package/dist/utils/time-measure-values-sql.d.ts +4 -3
- package/dist/utils/time-measure-values-sql.d.ts.map +1 -1
- package/dist/utils/time-measure-values-sql.js +26 -29
- package/dist/utils/timestamp-instants.d.ts +17 -0
- package/dist/utils/timestamp-instants.d.ts.map +1 -0
- package/dist/utils/timestamp-instants.js +34 -0
- package/dist/utils/timestamp-text.d.ts +12 -0
- package/dist/utils/timestamp-text.d.ts.map +1 -0
- package/dist/utils/timestamp-text.js +18 -0
- package/dist/utils/zod-json-schema.d.ts +8 -0
- package/dist/utils/zod-json-schema.d.ts.map +1 -0
- package/dist/utils/zod-json-schema.js +18 -0
- package/dist/utils/zod-schema-version.d.ts +19 -0
- package/dist/utils/zod-schema-version.d.ts.map +1 -0
- package/dist/utils/zod-schema-version.js +6 -0
- package/dist/utils/zod-v3-protocol-schema.d.ts +10 -0
- package/dist/utils/zod-v3-protocol-schema.d.ts.map +1 -0
- package/dist/utils/zod-v3-protocol-schema.js +164 -0
- package/dist/utils/zod-v4-protocol-schema.d.ts +12 -0
- package/dist/utils/zod-v4-protocol-schema.d.ts.map +1 -0
- package/dist/utils/zod-v4-protocol-schema.js +171 -0
- package/dist/validation.d.ts +7 -0
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +42 -8
- package/package.json +21 -12
- package/dist/api.type-test.d.ts +0 -2
- package/dist/api.type-test.d.ts.map +0 -1
- package/dist/api.type-test.js +0 -251
- package/dist/utils/time-arithmetic-sql.d.ts +0 -4
- package/dist/utils/time-arithmetic-sql.d.ts.map +0 -1
- package/dist/utils/time-arithmetic-sql.js +0 -9
- package/dist/utils/window-aggregation-sql.d.ts +0 -5
- package/dist/utils/window-aggregation-sql.d.ts.map +0 -1
- package/dist/utils/window-aggregation-sql.js +0 -17
package/README.md
CHANGED
|
@@ -72,6 +72,9 @@ The same definition can become:
|
|
|
72
72
|
- an OpenAI, AI SDK, or MCP tool schema;
|
|
73
73
|
- a stable semantic contract for CI and deployment.
|
|
74
74
|
|
|
75
|
+
Schema builders and agent tools are imported from `@hypequery/datasets/schemas`.
|
|
76
|
+
(Their root-entry re-exports are deprecated and removed in 1.0.)
|
|
77
|
+
|
|
75
78
|
`buildCanonicalSemanticQuerySchemas()` compiles the same catalog into strict
|
|
76
79
|
dataset and metric Zod validators, JSON Schemas, and a deterministic manifest
|
|
77
80
|
hash. It accepts either live local Dataset definitions or an already-normalized
|
|
@@ -111,3 +114,14 @@ for module boundaries and verification requirements, and the
|
|
|
111
114
|
## License
|
|
112
115
|
|
|
113
116
|
Apache-2.0.
|
|
117
|
+
|
|
118
|
+
## Public client descriptor schemas
|
|
119
|
+
|
|
120
|
+
`buildClientContractQuerySchemas(contract)` validates an RFC 0018 signed client
|
|
121
|
+
contract and returns per-endpoint HTTP schemas plus the canonical dataset/metric
|
|
122
|
+
MCP schemas, JSON schemas and manifest hash. It accepts public descriptors without
|
|
123
|
+
constructing Dataset instances or loading project code. Filter values have their
|
|
124
|
+
advertised scalar/range/list types. Runtime validation additionally checks selected
|
|
125
|
+
fields, uniqueness, timezone membership and combined predicate limits; preserve it
|
|
126
|
+
when using the structural JSON schemas. Empty MCP target sets remain uncallable.
|
|
127
|
+
Existing catalog-based schema APIs keep their defaults.
|
package/dist/aggregations.d.ts
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* ```
|
|
16
16
|
*/
|
|
17
17
|
import type { AggregationSpec } from './types.js';
|
|
18
|
+
import { type AggregateStateFunction } from './utils/aggregate-state-functions.js';
|
|
18
19
|
export declare function sum(field: string): AggregationSpec;
|
|
19
20
|
export declare function count(field: string): AggregationSpec;
|
|
20
21
|
export declare function countDistinct(field: string): AggregationSpec;
|
|
@@ -23,6 +24,8 @@ export declare function approxCountDistinct(field: string): AggregationSpec;
|
|
|
23
24
|
export declare function avg(field: string): AggregationSpec;
|
|
24
25
|
export declare function min(field: string): AggregationSpec;
|
|
25
26
|
export declare function max(field: string): AggregationSpec;
|
|
27
|
+
/** Finalize the aggregate states stored in `field` with `stateFunction`'s `-Merge` combinator. */
|
|
28
|
+
export declare function merge(stateFunction: AggregateStateFunction, field: string): AggregationSpec;
|
|
26
29
|
/** Approximate percentile of a numeric field at `level` in [0, 1]. */
|
|
27
30
|
export declare function percentile(field: string, level: number): AggregationSpec;
|
|
28
31
|
/** Median — sugar for `percentile(field, 0.5)`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregations.d.ts","sourceRoot":"","sources":["../src/aggregations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"aggregations.d.ts","sourceRoot":"","sources":["../src/aggregations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAEnE,OAAO,EAAgC,KAAK,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAUjH,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAElD;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAEpD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAE5D;AAED,oDAAoD;AACpD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAElE;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAElD;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAElD;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAElD;AAED,kGAAkG;AAClG,wBAAgB,KAAK,CAAC,aAAa,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,CAG3F;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,CAGxE;AAED,mDAAmD;AACnD,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAErD;AAED,0DAA0D;AAC1D,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,CAKjE;AAED,0DAA0D;AAC1D,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,CAKjE;AAED,iCAAiC;AACjC,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAErD;AAED,uBAAuB;AACvB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAEvD"}
|
package/dist/aggregations.js
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* ```
|
|
16
16
|
*/
|
|
17
17
|
import { validatePercentileLevel } from './measure.js';
|
|
18
|
+
import { assertAggregateStateFunction } from './utils/aggregate-state-functions.js';
|
|
18
19
|
function createAggregation(aggregation, field) {
|
|
19
20
|
return {
|
|
20
21
|
__type: 'aggregation_spec',
|
|
@@ -44,6 +45,11 @@ export function min(field) {
|
|
|
44
45
|
export function max(field) {
|
|
45
46
|
return createAggregation('max', field);
|
|
46
47
|
}
|
|
48
|
+
/** Finalize the aggregate states stored in `field` with `stateFunction`'s `-Merge` combinator. */
|
|
49
|
+
export function merge(stateFunction, field) {
|
|
50
|
+
assertAggregateStateFunction(stateFunction, `merge(…, "${field}")`);
|
|
51
|
+
return { ...createAggregation('merge', field), stateFunction };
|
|
52
|
+
}
|
|
47
53
|
/** Approximate percentile of a numeric field at `level` in [0, 1]. */
|
|
48
54
|
export function percentile(field, level) {
|
|
49
55
|
validatePercentileLevel(level);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { sha256 } from '@noble/hashes/sha2';
|
|
2
|
-
import { bytesToHex } from '@noble/hashes/utils';
|
|
1
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
2
|
+
import { bytesToHex } from '@noble/hashes/utils.js';
|
|
3
3
|
import { stableStringify } from '../utils/canonical-json.js';
|
|
4
4
|
const LOCAL_DEFINITION_DOMAIN = 'hypequery.ts.local-definitions.v2\0';
|
|
5
5
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-signature.d.ts","sourceRoot":"","sources":["../../src/cache/query-signature.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAElB,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAGhB,WAAW,EACX,SAAS,EACV,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,CAAC;AA8F3B;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACzB,MAAM,
|
|
1
|
+
{"version":3,"file":"query-signature.d.ts","sourceRoot":"","sources":["../../src/cache/query-signature.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAElB,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAGhB,WAAW,EACX,SAAS,EACV,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,CAAC;AA8F3B;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACzB,MAAM,CAwBR;AAED,oDAAoD;AACpD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,GAAG,gBAAgB,EACpC,KAAK,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE,gBAAgB,GACzB,MAAM,CAqBR"}
|
|
@@ -90,6 +90,8 @@ export function buildDatasetQuerySignature(ds, query, context) {
|
|
|
90
90
|
kind: 'dataset',
|
|
91
91
|
target: ds.name,
|
|
92
92
|
source: ds.source,
|
|
93
|
+
// Omitted when false so existing datasets keep their cache keys.
|
|
94
|
+
...(ds.final ? { final: true } : {}),
|
|
93
95
|
dimensions: query.dimensions ?? null,
|
|
94
96
|
// `null` distinguishes the "all measures" default from an explicit [].
|
|
95
97
|
measures: query.measures ?? null,
|
|
@@ -116,6 +118,7 @@ export function buildMetricQuerySignature(metric, query, context) {
|
|
|
116
118
|
kind: 'metric',
|
|
117
119
|
target: `${ref.dataset.name}.${ref.name}`,
|
|
118
120
|
source: ref.dataset.source,
|
|
121
|
+
...(ref.dataset.final ? { final: true } : {}),
|
|
119
122
|
metricKind: ref.spec.__type,
|
|
120
123
|
dimensions: query.dimensions ?? null,
|
|
121
124
|
filters: filterSignature(query.filters),
|
package/dist/catalog.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ProtocolExpression } from '@hypequery/protocol';
|
|
|
2
2
|
import type { RelationshipKey } from './types.js';
|
|
3
3
|
import { type WindowCatalogMetadata } from './utils/window-catalog-metadata.js';
|
|
4
4
|
import type { AnyDatasetInstance, DimensionDefinition, MeasureDefinition, MetricHandle, RelationshipDefinition, SemanticFilterDefinition, DatasetLimits, DatasetDefaults, DatasetFreshness, SemanticMetadata, TimeGrain } from './types.js';
|
|
5
|
+
import type { AggregateStateFunction } from './utils/aggregate-state-functions.js';
|
|
5
6
|
export interface DimensionCatalogEntry extends SemanticMetadata {
|
|
6
7
|
type: DimensionDefinition['fieldType'];
|
|
7
8
|
column?: string;
|
|
@@ -18,6 +19,8 @@ export interface MeasureCatalogEntry extends SemanticMetadata, WindowCatalogMeta
|
|
|
18
19
|
argField?: string;
|
|
19
20
|
/** Percentile level in [0, 1]. */
|
|
20
21
|
level?: number;
|
|
22
|
+
/** State function a `merge` measure finalizes (`uniq` for `uniqMerge`). */
|
|
23
|
+
stateFunction?: AggregateStateFunction;
|
|
21
24
|
sql?: string;
|
|
22
25
|
label?: string;
|
|
23
26
|
description?: string;
|
package/dist/catalog.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,EAAyB,KAAK,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAEvG,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,sBAAsB,EACtB,wBAAwB,EACxB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACV,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
|
package/dist/catalog.js
CHANGED
|
@@ -5,7 +5,7 @@ import { windowCatalogMetadata } from './utils/window-catalog-metadata.js';
|
|
|
5
5
|
import { splitDatasetMeasures } from './utils/dataset-measures.js';
|
|
6
6
|
import { SEMANTIC_FILTER_OPERATORS } from './constants.js';
|
|
7
7
|
import { datasetTimeGrains } from './utils/dataset-time-grains.js';
|
|
8
|
-
import {
|
|
8
|
+
import { isApproximateBaseMeasure, isApproximateDerivedMeasure, isApproximateMeasure } from './utils/approximate-measures.js';
|
|
9
9
|
import { usesTimeMeasure } from './utils/time-query-measures.js';
|
|
10
10
|
import { measureSupportedGrains } from './utils/measure-time-grains.js';
|
|
11
11
|
import { listGroupableRelationshipFields, listQueryableRelationshipFields, } from './utils/relationship-fields.js';
|
|
@@ -28,12 +28,13 @@ function measureToCatalog(measure) {
|
|
|
28
28
|
field: measure.field,
|
|
29
29
|
argField: measure.argField,
|
|
30
30
|
level: measure.level,
|
|
31
|
+
...(measure.stateFunction !== undefined ? { stateFunction: measure.stateFunction } : {}),
|
|
31
32
|
sql: measure.sql,
|
|
32
33
|
label: measure.label,
|
|
33
34
|
description: measure.description,
|
|
34
35
|
...snapshotSemanticMetadata(measure),
|
|
35
36
|
filterCount: measure.filters?.length ?? 0,
|
|
36
|
-
...(
|
|
37
|
+
...(isApproximateBaseMeasure(measure) ? { approximate: true } : {}),
|
|
37
38
|
};
|
|
38
39
|
}
|
|
39
40
|
function filterToCatalog(filter, dimensions) {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type ProtocolClientContract, type ProtocolClientEndpoint } from '@hypequery/protocol';
|
|
2
|
+
import { type ZodTypeAny } from 'zod';
|
|
3
|
+
import { type CanonicalSemanticQuerySchemas } from '../semantic-query-schema.js';
|
|
4
|
+
import type { JsonSchema } from '../tools.js';
|
|
5
|
+
export interface ClientEndpointQuerySchema {
|
|
6
|
+
readonly endpoint: ProtocolClientEndpoint;
|
|
7
|
+
readonly http: ZodTypeAny;
|
|
8
|
+
readonly httpJsonSchema: JsonSchema;
|
|
9
|
+
}
|
|
10
|
+
export interface ClientContractQuerySchemas extends CanonicalSemanticQuerySchemas {
|
|
11
|
+
readonly contract: ProtocolClientContract;
|
|
12
|
+
readonly endpoints: ReadonlyMap<string, ClientEndpointQuerySchema>;
|
|
13
|
+
}
|
|
14
|
+
/** Compile typed endpoint and MCP schemas from the same validated client descriptor.
|
|
15
|
+
* JSON Schema describes structural constraints; execution must retain the runtime
|
|
16
|
+
* validator for selected-field dependencies, uniqueness, and combined budgets.
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildClientContractQuerySchemas(input: unknown): ClientContractQuerySchemas;
|
|
19
|
+
//# sourceMappingURL=query-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-schema.d.ts","sourceRoot":"","sources":["../../src/client-contract/query-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,sBAAsB,EAAE,KAAK,sBAAsB,EACzD,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAK,KAAK,UAAU,EAAE,MAAM,KAAK,CAAC;AACzC,OAAO,EAAwB,KAAK,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACvG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,UAAU,CAAC;CACrC;AACD,MAAM,WAAW,0BAA2B,SAAQ,6BAA6B;IAC/E,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;CACpE;AA4DD;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,0BAA0B,CAe1F"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { validateProtocolClientContract, validateProtocolClientQuery, } from '@hypequery/protocol';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { toSemanticJsonSchema } from '../semantic-query-schema.js';
|
|
4
|
+
function union(schemas) {
|
|
5
|
+
return schemas.length === 0 ? z.never() : schemas.length === 1 ? schemas[0]
|
|
6
|
+
: z.union(schemas);
|
|
7
|
+
}
|
|
8
|
+
function enumeration(values) {
|
|
9
|
+
return values.length ? z.enum(values) : z.never();
|
|
10
|
+
}
|
|
11
|
+
function predicates(endpoint, having) {
|
|
12
|
+
const definitions = having ? Object.entries(endpoint.measures).filter(([, m]) => m.having)
|
|
13
|
+
.map(([key]) => [key, { type: 'number', operators: ['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'in', 'notIn', 'between'] }])
|
|
14
|
+
: Object.entries(endpoint.filters);
|
|
15
|
+
return union(definitions.flatMap(([key, field]) => field.operators.map(operator => {
|
|
16
|
+
const scalar = field.type === 'number' ? z.number().finite()
|
|
17
|
+
: field.type === 'boolean' ? z.boolean() : z.string();
|
|
18
|
+
const value = operator === 'between' ? z.tuple([scalar, scalar])
|
|
19
|
+
: operator === 'in' || operator === 'notIn' ? z.array(scalar).min(1).max(endpoint.limits.maxFilterValues)
|
|
20
|
+
: scalar;
|
|
21
|
+
return z.object({ [having ? 'measure' : 'field']: z.literal(key), operator: z.literal(operator), value }).strict();
|
|
22
|
+
})));
|
|
23
|
+
}
|
|
24
|
+
function endpointSchema(contract, endpoint, transport) {
|
|
25
|
+
const caps = endpoint.limits;
|
|
26
|
+
const groupable = Object.keys(endpoint.dimensions).filter(key => endpoint.dimensions[key].groupable);
|
|
27
|
+
const orderable = [...Object.keys(endpoint.dimensions).filter(key => endpoint.dimensions[key].groupable && endpoint.dimensions[key].orderable),
|
|
28
|
+
...Object.keys(endpoint.measures), ...(endpoint.time ? ['period'] : [])];
|
|
29
|
+
const fields = {
|
|
30
|
+
dimensions: z.array(enumeration(groupable)).max(caps.maxDimensions).optional(),
|
|
31
|
+
filters: z.array(predicates(endpoint, false)).max(caps.maxPredicates).optional(),
|
|
32
|
+
orderBy: z.array(z.object({ field: enumeration(orderable), direction: z.enum(['asc', 'desc']) }).strict()).max(caps.maxOrderBy).optional(),
|
|
33
|
+
// HTTP clamps a larger limit to the endpoint's maximum. An agent should
|
|
34
|
+
// see the real ceiling, rather than learn of truncation from metadata.
|
|
35
|
+
limit: z.number().int().min(1).max(transport === 'mcp' ? caps.maxLimit : Number.MAX_SAFE_INTEGER).optional(),
|
|
36
|
+
offset: z.number().int().min(0).max(caps.maxOffset).optional(),
|
|
37
|
+
includeMeta: (endpoint.metadata ? z.boolean() : z.literal(false)).optional(),
|
|
38
|
+
};
|
|
39
|
+
if (endpoint.kind === 'dataset') {
|
|
40
|
+
fields.measures = z.array(enumeration(Object.keys(endpoint.measures))).max(caps.maxMeasures).optional();
|
|
41
|
+
fields.having = z.array(predicates(endpoint, true)).max(caps.maxPredicates).optional();
|
|
42
|
+
}
|
|
43
|
+
if (endpoint.time) {
|
|
44
|
+
fields[transport === 'http' ? 'by' : 'grain'] = enumeration(endpoint.time.grains).optional();
|
|
45
|
+
if (endpoint.time.timezone)
|
|
46
|
+
fields.timezone = z.string().optional();
|
|
47
|
+
}
|
|
48
|
+
if (transport === 'mcp') {
|
|
49
|
+
fields.dataset = z.literal(endpoint.dataset);
|
|
50
|
+
if (endpoint.kind === 'metric')
|
|
51
|
+
fields.metric = z.literal(endpoint.id);
|
|
52
|
+
}
|
|
53
|
+
// Validate before zod reads properties: the runtime validator snapshots input
|
|
54
|
+
// without invoking accessors, so a hostile getter cannot escape safeParse.
|
|
55
|
+
return z.preprocess((input, context) => {
|
|
56
|
+
try {
|
|
57
|
+
validateProtocolClientQuery(contract, endpoint.id, input, transport);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
context.addIssue({ code: z.ZodIssueCode.custom, message: 'Invalid client query.' });
|
|
61
|
+
return z.NEVER;
|
|
62
|
+
}
|
|
63
|
+
return input;
|
|
64
|
+
}, z.object(fields).strict());
|
|
65
|
+
}
|
|
66
|
+
/** Compile typed endpoint and MCP schemas from the same validated client descriptor.
|
|
67
|
+
* JSON Schema describes structural constraints; execution must retain the runtime
|
|
68
|
+
* validator for selected-field dependencies, uniqueness, and combined budgets.
|
|
69
|
+
*/
|
|
70
|
+
export function buildClientContractQuerySchemas(input) {
|
|
71
|
+
const contract = validateProtocolClientContract(input);
|
|
72
|
+
const endpoints = new Map();
|
|
73
|
+
const datasets = [], metrics = [];
|
|
74
|
+
for (const endpoint of contract.endpoints) {
|
|
75
|
+
const http = endpointSchema(contract, endpoint, 'http');
|
|
76
|
+
endpoints.set(endpoint.id, { endpoint, http, httpJsonSchema: toSemanticJsonSchema(http) });
|
|
77
|
+
(endpoint.kind === 'dataset' ? datasets : metrics).push(endpointSchema(contract, endpoint, 'mcp'));
|
|
78
|
+
}
|
|
79
|
+
// Preserve the existing fixed MCP tool names while making empty views uncallable.
|
|
80
|
+
const queryDataset = datasets.length ? union(datasets) : z.object({ dataset: z.never() }).strict();
|
|
81
|
+
const queryMetric = metrics.length ? union(metrics) : z.object({ dataset: z.never(), metric: z.never() }).strict();
|
|
82
|
+
return { contract, endpoints, queryDataset, queryMetric,
|
|
83
|
+
queryDatasetJsonSchema: toSemanticJsonSchema(queryDataset),
|
|
84
|
+
queryMetricJsonSchema: toSemanticJsonSchema(queryMetric), manifestHash: contract.contentHash };
|
|
85
|
+
}
|
package/dist/constants.d.ts
CHANGED
|
@@ -4,12 +4,13 @@
|
|
|
4
4
|
import type { MetricFilter, TimeGrain } from './types.js';
|
|
5
5
|
/**
|
|
6
6
|
* Maps time grain to ClickHouse date truncation functions.
|
|
7
|
+
*
|
|
8
|
+
* @deprecated Grain SQL is engine-specific and now rendered by the datasets
|
|
9
|
+
* SQL dialect; use {@link SUPPORTED_TIME_GRAINS} to enumerate grains. Kept
|
|
10
|
+
* for compatibility and no longer read by the planner.
|
|
7
11
|
*/
|
|
8
12
|
export declare const GRAIN_FUNCTIONS: Record<TimeGrain, string>;
|
|
9
|
-
/**
|
|
10
|
-
* The set of time grains supported by the planner. Derived from
|
|
11
|
-
* {@link GRAIN_FUNCTIONS} so the two never drift apart.
|
|
12
|
-
*/
|
|
13
|
+
/** The set of time grains supported by the planner, finest first. */
|
|
13
14
|
export declare const SUPPORTED_TIME_GRAINS: TimeGrain[];
|
|
14
15
|
/**
|
|
15
16
|
* The filter operators accepted by semantic dataset and metric inputs.
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAyB,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEjF
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAyB,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEjF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAQrD,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,qBAAqB,EAAE,SAAS,EAAkE,CAAC;AAEhH;;GAEG;AACH,eAAO,MAAM,yBAAyB,oFAWkB,CAAC;AAIzD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,IAAI,YAAY,CAAC,UAAU,CAAC,CAEhG;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,4EAUe,CAAC;AAEtD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAEvE"}
|
package/dist/constants.js
CHANGED
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
5
|
* Maps time grain to ClickHouse date truncation functions.
|
|
6
|
+
*
|
|
7
|
+
* @deprecated Grain SQL is engine-specific and now rendered by the datasets
|
|
8
|
+
* SQL dialect; use {@link SUPPORTED_TIME_GRAINS} to enumerate grains. Kept
|
|
9
|
+
* for compatibility and no longer read by the planner.
|
|
6
10
|
*/
|
|
7
11
|
export const GRAIN_FUNCTIONS = {
|
|
8
12
|
minute: 'toStartOfMinute',
|
|
@@ -13,11 +17,8 @@ export const GRAIN_FUNCTIONS = {
|
|
|
13
17
|
quarter: 'toStartOfQuarter',
|
|
14
18
|
year: 'toStartOfYear',
|
|
15
19
|
};
|
|
16
|
-
/**
|
|
17
|
-
|
|
18
|
-
* {@link GRAIN_FUNCTIONS} so the two never drift apart.
|
|
19
|
-
*/
|
|
20
|
-
export const SUPPORTED_TIME_GRAINS = Object.keys(GRAIN_FUNCTIONS);
|
|
20
|
+
/** The set of time grains supported by the planner, finest first. */
|
|
21
|
+
export const SUPPORTED_TIME_GRAINS = ['minute', 'hour', 'day', 'week', 'month', 'quarter', 'year'];
|
|
21
22
|
/**
|
|
22
23
|
* The filter operators accepted by semantic dataset and metric inputs.
|
|
23
24
|
*/
|
|
@@ -61,5 +62,5 @@ export const SEMANTIC_HAVING_OPERATORS = [
|
|
|
61
62
|
* Narrowing guard for a runtime-provided grain value.
|
|
62
63
|
*/
|
|
63
64
|
export function isSupportedTimeGrain(grain) {
|
|
64
|
-
return typeof grain === 'string' &&
|
|
65
|
+
return typeof grain === 'string' && SUPPORTED_TIME_GRAINS.includes(grain);
|
|
65
66
|
}
|
package/dist/contract.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ export interface ContractMeasure extends SemanticMetadata, WindowCatalogMetadata
|
|
|
23
23
|
argField?: string;
|
|
24
24
|
/** Percentile level in [0, 1]. */
|
|
25
25
|
level?: number;
|
|
26
|
+
/** State function a `merge` measure finalizes. */
|
|
27
|
+
stateFunction?: MeasureCatalogEntry['stateFunction'];
|
|
26
28
|
sql?: string;
|
|
27
29
|
label?: string;
|
|
28
30
|
description?: string;
|
package/dist/contract.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAyB,KAAK,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAGvG,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC9B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAIpB;;;GAGG;AACH,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACzD,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAgB,SAAQ,gBAAgB,EAAE,qBAAqB;IAC9E,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACjC,SAAS,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC1C,eAAe,CAAC,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACxC,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC/C,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACpD,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,2BAA2B,GAAG,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;AAEzE,MAAM,WAAW,gCAAgC;IAC/C;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAC9C,OAAO,GAAE,gCAAqC,GAC7C,gBAAgB,CAelB;
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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"}
|
package/dist/contract.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { windowCatalogMetadata } from './utils/window-catalog-metadata.js';
|
|
2
|
-
import { sha256 } from '@noble/hashes/sha2';
|
|
3
|
-
import { bytesToHex } from '@noble/hashes/utils';
|
|
2
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
3
|
+
import { bytesToHex } from '@noble/hashes/utils.js';
|
|
4
4
|
import { getDatasetCatalogs, } from './catalog.js';
|
|
5
5
|
import { sortedRecord, uniqueSorted } from './utils/canonical-json.js';
|
|
6
6
|
import { snapshotSemanticMetadata } from './utils/semantic-metadata.js';
|
|
@@ -103,6 +103,7 @@ function measureToContract(entry, includeSql) {
|
|
|
103
103
|
field: entry.field,
|
|
104
104
|
...(entry.argField !== undefined ? { argField: entry.argField } : {}),
|
|
105
105
|
...(entry.level !== undefined ? { level: entry.level } : {}),
|
|
106
|
+
...(entry.stateFunction !== undefined ? { stateFunction: entry.stateFunction } : {}),
|
|
106
107
|
...(includeSql && entry.sql !== undefined ? { sql: normalizeSql(entry.sql) } : {}),
|
|
107
108
|
...(entry.label !== undefined ? { label: entry.label } : {}),
|
|
108
109
|
...(entry.description !== undefined ? { description: entry.description } : {}),
|
|
@@ -159,7 +160,7 @@ export function contractToStableJson(contract) {
|
|
|
159
160
|
* `node:crypto` so the contract stays usable in browser/edge runtimes.
|
|
160
161
|
*/
|
|
161
162
|
export function hashContract(contract) {
|
|
162
|
-
return bytesToHex(sha256(contractToStableJson(contract)));
|
|
163
|
+
return bytesToHex(sha256(new TextEncoder().encode(contractToStableJson(contract))));
|
|
163
164
|
}
|
|
164
165
|
/** Normalizes SQL escape-hatch whitespace so equivalent SQL hashes identically. */
|
|
165
166
|
function normalizeSql(sql) {
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { AggregationType, DimensionType, MeasureDefinition, TimeGrain } from './types.js';
|
|
2
|
+
import type { SemanticBinaryOperator, SemanticFunctionName } from './semantic-plan.js';
|
|
1
3
|
/**
|
|
2
4
|
* SQL rendering owned by the semantic datasets layer, separate from a query
|
|
3
5
|
* builder's compiler dialect. Extend this contract as emission sites migrate.
|
|
@@ -8,4 +10,119 @@ export interface DatasetSqlDialect {
|
|
|
8
10
|
/** Quote one output identifier; dots in a qualified semantic alias are literal. */
|
|
9
11
|
quoteIdentifier(identifier: string): string;
|
|
10
12
|
}
|
|
13
|
+
/** A formula binary operator, matching `SemanticExpression` `binary` nodes. */
|
|
14
|
+
export type DatasetSqlBinaryOperator = SemanticBinaryOperator;
|
|
15
|
+
/** The logical type of a bound value, when the planner knows it. */
|
|
16
|
+
export type DatasetSqlParameterType = DimensionType | {
|
|
17
|
+
readonly array: DimensionType;
|
|
18
|
+
};
|
|
19
|
+
/** A value bound into a statement, with its logical type when known. */
|
|
20
|
+
export interface DatasetSqlBoundParameter {
|
|
21
|
+
readonly value: unknown;
|
|
22
|
+
readonly type?: DatasetSqlParameterType;
|
|
23
|
+
}
|
|
24
|
+
/** Why a raw `sql` expression is not one safe expression under a dialect's lexical rules. */
|
|
25
|
+
export type DatasetRawSqlExpressionError = 'unterminated-literal' | 'statement-break';
|
|
26
|
+
/** A wall-clock component read from a zoned timestamp. */
|
|
27
|
+
export type DatasetSqlClockPart = 'Hour' | 'Minute' | 'Second';
|
|
28
|
+
/**
|
|
29
|
+
* Every engine-specific spelling the datasets planner emits outside the query
|
|
30
|
+
* builder. Arguments are already-rendered SQL expressions; implementations
|
|
31
|
+
* only spell them, so planning decisions stay shared across engines.
|
|
32
|
+
*
|
|
33
|
+
* Internal: engines implement the full rule set. The public
|
|
34
|
+
* `DatasetSqlDialect` hook may override a subset, which
|
|
35
|
+
* `resolveDatasetSqlDialect` merges onto the ClickHouse rules.
|
|
36
|
+
*/
|
|
37
|
+
export interface DatasetSqlDialectRules extends DatasetSqlDialect {
|
|
38
|
+
/** Spell the placeholder for the value at `index` in the rendered parameter array. */
|
|
39
|
+
placeholder(index: number, parameter: DatasetSqlBoundParameter): string;
|
|
40
|
+
/** A repeated value re-uses its placeholder (`$k`) rather than binding again. */
|
|
41
|
+
readonly reusesPlaceholders: boolean;
|
|
42
|
+
/** A builder's own positional `?` statement can be embedded verbatim. */
|
|
43
|
+
readonly embedsPositionalPieces: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* One ORDER BY term. Engines whose NULL placement differs from ClickHouse
|
|
46
|
+
* (NULLs last in both directions) add explicit `NULLS` clauses here so
|
|
47
|
+
* results order identically. No direction keeps the engine default (ASC).
|
|
48
|
+
*/
|
|
49
|
+
orderTerm(expression: string, direction?: 'ASC' | 'DESC'): string;
|
|
50
|
+
/**
|
|
51
|
+
* The trailing pagination clause, including its leading space, or ''.
|
|
52
|
+
* Engines that reject OFFSET without LIMIT supply a LIMIT here.
|
|
53
|
+
*/
|
|
54
|
+
paginate(limit: number | undefined, offset: number | undefined): string;
|
|
55
|
+
/** Quote a dotted physical source path (`analytics.orders`). */
|
|
56
|
+
quoteQualifiedName(name: string): string;
|
|
57
|
+
/**
|
|
58
|
+
* A quoted table read with row-version resolution (ClickHouse `FINAL`), used
|
|
59
|
+
* for joined targets declared `final: true`. Omit it on engines without such
|
|
60
|
+
* a modifier; those datasets are then refused instead of read unresolved.
|
|
61
|
+
*/
|
|
62
|
+
finalTable?(quotedSource: string): string;
|
|
63
|
+
/**
|
|
64
|
+
* Check that author-written raw `sql` is one expression under this engine's
|
|
65
|
+
* lexical rules: no terminator or comment hidden outside a literal. Engines
|
|
66
|
+
* differ (backslash escapes, `#` comments, triple-quoted strings), so an
|
|
67
|
+
* engine that cannot check its own raw SQL must reject it here rather than
|
|
68
|
+
* inherit another engine's rules.
|
|
69
|
+
*/
|
|
70
|
+
rawSqlExpressionError(sql: string): DatasetRawSqlExpressionError | undefined;
|
|
71
|
+
stringLiteral(value: string): string;
|
|
72
|
+
/** A literal compared against a column inside a measure filter. */
|
|
73
|
+
measureFilterLiteral(value: unknown): string;
|
|
74
|
+
/** Truncate a timestamp to the start of its grain bucket. */
|
|
75
|
+
truncateTime(time: string, grain: TimeGrain): string;
|
|
76
|
+
/** Move a timestamp forward by `amount` grains; `amount` may be an expression. */
|
|
77
|
+
addTime(time: string, amount: string | number, grain: TimeGrain): string;
|
|
78
|
+
/** Move a timestamp back by a literal number of grains. */
|
|
79
|
+
subtractTime(time: string, amount: number, grain: TimeGrain): string;
|
|
80
|
+
/** Whole grain boundaries crossed from `start` to `end`. */
|
|
81
|
+
timeDiff(grain: TimeGrain, start: string, end: string): string;
|
|
82
|
+
/** Convert a source time to the query timezone, a validated canonical IANA name. */
|
|
83
|
+
toQueryTimezone(time: string, timezone: string): string;
|
|
84
|
+
/** Parse a timestamp from a string expression, such as a bound placeholder, in the zone `timezone` evaluates to. */
|
|
85
|
+
parseTimestamp(value: string, timezone: string): string;
|
|
86
|
+
/** The timezone a zoned timestamp expression carries. */
|
|
87
|
+
timezoneOf(time: string): string;
|
|
88
|
+
/** One wall-clock component of a zoned timestamp. */
|
|
89
|
+
clockPart(part: DatasetSqlClockPart, time: string): string;
|
|
90
|
+
/** True when a value's physical type is a date without a time of day. */
|
|
91
|
+
isDateOnlyType(value: string): string;
|
|
92
|
+
/** Fail the statement with `message` when `condition` holds; evaluates to 0 otherwise. */
|
|
93
|
+
guard(condition: string, message: string): string;
|
|
94
|
+
ifElse(condition: string, then: string, otherwise: string): string;
|
|
95
|
+
greatest(...values: string[]): string;
|
|
96
|
+
least(...values: string[]): string;
|
|
97
|
+
/** NULL-safe equality. */
|
|
98
|
+
isNotDistinctFrom(left: string, right: string): string;
|
|
99
|
+
isNotNull(value: string): string;
|
|
100
|
+
/** Narrow a value the planner has already proven non-NULL. */
|
|
101
|
+
assumeNotNull(value: string): string;
|
|
102
|
+
/** Widen a value to a nullable type, so unmatched joins yield NULL. */
|
|
103
|
+
toNullable(value: string): string;
|
|
104
|
+
/** Count rows matching `condition`. */
|
|
105
|
+
countIf(condition: string): string;
|
|
106
|
+
/** Expand each row into `count` rows carrying the indices 0..count-1. */
|
|
107
|
+
seriesIndex(count: string): string;
|
|
108
|
+
/** True when `predicate`, which reads `index`, holds for some index in 0..count-1. */
|
|
109
|
+
anyIndex(index: string, count: string, predicate: string): string;
|
|
110
|
+
/** Pack expressions into one positional value, isolating their names. */
|
|
111
|
+
packRow(values: readonly string[]): string;
|
|
112
|
+
/** Read the 1-based `position` from a packed row. */
|
|
113
|
+
rowElement(row: string, position: number): string;
|
|
114
|
+
/** Every column of `relation` except `columns`. */
|
|
115
|
+
selectAllExcept(relation: string, columns: readonly string[]): string;
|
|
116
|
+
/** Join keyword matching each left row to the nearest preceding right row. */
|
|
117
|
+
readonly asofLeftJoin: string;
|
|
118
|
+
/** Wrap a filtered measure's input so non-matching rows contribute `fallback`. */
|
|
119
|
+
filteredAggregateInput(condition: string, value: string, fallback: '0' | 'NULL'): string;
|
|
120
|
+
/** A time-measure aggregate: NULL over an empty population unless it counts. */
|
|
121
|
+
windowAggregate(definition: MeasureDefinition, value: string, arg: string): string;
|
|
122
|
+
/** Re-aggregate partial results; NULL over an empty population. */
|
|
123
|
+
reaggregate(aggregation: AggregationType, value: string): string;
|
|
124
|
+
formulaLiteral(value: string | number | boolean | null): string;
|
|
125
|
+
formulaBinary(operator: DatasetSqlBinaryOperator, left: string, right: string): string;
|
|
126
|
+
formulaFunction(name: SemanticFunctionName, args: readonly string[]): string;
|
|
127
|
+
}
|
|
11
128
|
//# sourceMappingURL=dataset-sql-dialect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset-sql-dialect.d.ts","sourceRoot":"","sources":["../src/dataset-sql-dialect.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7C"}
|
|
1
|
+
{"version":3,"file":"dataset-sql-dialect.d.ts","sourceRoot":"","sources":["../src/dataset-sql-dialect.ts"],"names":[],"mappings":"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"}
|
package/dist/dataset.d.ts
CHANGED
package/dist/dataset.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset.d.ts","sourceRoot":"","sources":["../src/dataset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,wBAAwB,EAExB,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EAKtB,iBAAiB,EACjB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAsBpB,wBAAgB,OAAO,CACrB,YAAY,SAAS,MAAM,EAC3B,WAAW,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACvD,YAAY,SAAS,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,GAAG,EAAE,EAClE,cAAc,SAAS,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EACrF,KAAK,CAAC,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,EAAE,EAC9D,KAAK,CAAC,QAAQ,SAAS,yBAAyB,GAAG,SAAS,GAAG,yBAAyB,GAAG,SAAS,EAEpG,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,aAAa,CAAC,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC,GACpF,eAAe,CAAC,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,wBAAwB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"dataset.d.ts","sourceRoot":"","sources":["../src/dataset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,wBAAwB,EAExB,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EAKtB,iBAAiB,EACjB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAsBpB,wBAAgB,OAAO,CACrB,YAAY,SAAS,MAAM,EAC3B,WAAW,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACvD,YAAY,SAAS,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,GAAG,EAAE,EAClE,cAAc,SAAS,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EACrF,KAAK,CAAC,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,EAAE,EAC9D,KAAK,CAAC,QAAQ,SAAS,yBAAyB,GAAG,SAAS,GAAG,yBAAyB,GAAG,SAAS,EAEpG,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,aAAa,CAAC,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC,GACpF,eAAe,CAAC,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,wBAAwB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAqFrK"}
|
package/dist/dataset.js
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* orderCount: measure.count("id"),
|
|
25
25
|
* },
|
|
26
26
|
* relationships: {
|
|
27
|
-
* customer: belongsTo(() => Customers, { from: "
|
|
27
|
+
* customer: belongsTo(() => Customers, { from: "customer_id", to: "id" }),
|
|
28
28
|
* },
|
|
29
29
|
* });
|
|
30
30
|
* ```
|
|
@@ -71,6 +71,7 @@ export function dataset(name, config) {
|
|
|
71
71
|
__type: 'dataset',
|
|
72
72
|
name,
|
|
73
73
|
source: config.source,
|
|
74
|
+
...(config.final ? { final: true } : {}),
|
|
74
75
|
description: config.description,
|
|
75
76
|
...snapshotSemanticMetadata(config),
|
|
76
77
|
freshness: config.freshness === undefined ? undefined : { ...config.freshness },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory-backend.d.ts","sourceRoot":"","sources":["../src/in-memory-backend.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAGV,eAAe,EAKhB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC3D,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"in-memory-backend.d.ts","sourceRoot":"","sources":["../src/in-memory-backend.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAGV,eAAe,EAKhB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC3D,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AA2V3D;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,eAAe,CAwE7E"}
|
|
@@ -222,6 +222,8 @@ function aggregateRows(rows, aggregation) {
|
|
|
222
222
|
}
|
|
223
223
|
return percentileOf(numericValues(), aggregation.level);
|
|
224
224
|
}
|
|
225
|
+
case 'merge':
|
|
226
|
+
throw new Error(`Aggregation "merge" for "${aggregation.name}" reads stored aggregate states, which the in-memory backend cannot evaluate.`);
|
|
225
227
|
case 'stddev':
|
|
226
228
|
return Math.sqrt(sampleVarianceOf(numericValues()));
|
|
227
229
|
case 'variance':
|