@hypequery/protocol 0.22.0 → 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 +3 -1
- package/dist/client-contract/index.d.ts +1 -1
- package/dist/client-contract/index.d.ts.map +1 -1
- package/dist/client-contract/nodes.d.ts +3 -1
- package/dist/client-contract/nodes.d.ts.map +1 -1
- package/dist/client-contract/nodes.js +32 -2
- package/dist/client-contract/primitives.d.ts +4 -0
- package/dist/client-contract/primitives.d.ts.map +1 -1
- package/dist/client-contract/primitives.js +24 -1
- package/dist/client-contract/query.d.ts.map +1 -1
- package/dist/client-contract/query.js +6 -2
- package/dist/client-contract/types.d.ts +9 -0
- package/dist/client-contract/types.d.ts.map +1 -1
- package/dist/client-contract/validate.d.ts.map +1 -1
- package/dist/client-contract/validate.js +9 -3
- package/dist/deployments/aggregate-states.d.ts +16 -0
- package/dist/deployments/aggregate-states.d.ts.map +1 -0
- package/dist/deployments/aggregate-states.js +41 -0
- package/dist/deployments/segments.d.ts +2 -1
- package/dist/deployments/segments.d.ts.map +1 -1
- package/dist/deployments/segments.js +8 -3
- package/dist/deployments/types.d.ts +8 -2
- package/dist/deployments/types.d.ts.map +1 -1
- package/dist/deployments/validate.d.ts.map +1 -1
- package/dist/deployments/validate.js +27 -4
- package/dist/expressions/index.d.ts +2 -1
- package/dist/expressions/index.d.ts.map +1 -1
- package/dist/expressions/index.js +1 -0
- package/dist/expressions/null-checks.d.ts +10 -0
- package/dist/expressions/null-checks.d.ts.map +1 -0
- package/dist/expressions/null-checks.js +13 -0
- package/dist/expressions/types.d.ts +10 -2
- package/dist/expressions/types.d.ts.map +1 -1
- package/dist/expressions/validate.d.ts.map +1 -1
- package/dist/expressions/validate.js +16 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -84,7 +84,9 @@ and HTTP-backed MCP. Use `decodeProtocolClientContract(text)` at an untrusted JS
|
|
|
84
84
|
text boundary (bounded, rejects duplicate members), or
|
|
85
85
|
`validateProtocolClientContract(value)` for an already decoded signed object.
|
|
86
86
|
`prepareProtocolClientContract(unsigned)` computes the domain-separated schema
|
|
87
|
-
and view hashes and refuses preexisting hash fields.
|
|
87
|
+
and view hashes and refuses preexisting hash fields. An endpoint's optional
|
|
88
|
+
`annotations` (group and field labels/descriptions) are presentation text:
|
|
89
|
+
they are covered by the view hash but not by the endpoint schema hash.
|
|
88
90
|
|
|
89
91
|
`validateProtocolClientQuery(contract, endpointId, input, 'http' | 'mcp')` validates
|
|
90
92
|
and normalizes the strict client profile. Its result contains the registered
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { validateProtocolClientContract, prepareProtocolClientContract } from './validate.js';
|
|
2
2
|
export { ProtocolClientContractError, CLIENT_ERROR_MESSAGES } from './errors.js';
|
|
3
3
|
export type { ProtocolClientContractErrorCode } from './errors.js';
|
|
4
|
-
export type { ClientDimension, ClientMeasure, ClientFilter, ClientTime, ClientQueryLimits, ClientDatasetEndpoint, ClientMetricEndpoint, ProtocolClientEndpoint, ProtocolClientContract, PreparedProtocolClientContract, ClientFieldType, ClientWireType, } from './types.js';
|
|
4
|
+
export type { ClientDimension, ClientMeasure, ClientFilter, ClientTime, ClientQueryLimits, ClientEndpointAnnotations, ClientFieldAnnotation, ClientDatasetEndpoint, ClientMetricEndpoint, ProtocolClientEndpoint, ProtocolClientContract, PreparedProtocolClientContract, ClientFieldType, ClientWireType, } from './types.js';
|
|
5
5
|
export { validateProtocolClientQuery } from './query.js';
|
|
6
6
|
export type { ClientQueryPlan } from './query.js';
|
|
7
7
|
export { decodeProtocolClientContract } from './decode.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client-contract/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACjF,YAAY,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAC;AACnE,YAAY,EACV,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAC3E,qBAAqB,EAAE,oBAAoB,EAAE,sBAAsB,EACnE,sBAAsB,EAAE,8BAA8B,EAAE,eAAe,EAAE,cAAc,GACxF,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AACzD,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client-contract/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACjF,YAAY,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAC;AACnE,YAAY,EACV,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAC3E,yBAAyB,EAAE,qBAAqB,EAChD,qBAAqB,EAAE,oBAAoB,EAAE,sBAAsB,EACnE,sBAAsB,EAAE,8BAA8B,EAAE,eAAe,EAAE,cAAc,GACxF,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AACzD,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import type { ClientDimension, ClientFilter, ClientMeasure, ClientQueryLimits, ClientTime } from './types.js';
|
|
1
|
+
import type { ClientDimension, ClientEndpointAnnotations, ClientFilter, ClientMeasure, ClientQueryLimits, ClientTime } from './types.js';
|
|
2
2
|
export declare function dimension(input: unknown, path: string): ClientDimension;
|
|
3
3
|
export declare function measure(input: unknown, path: string): ClientMeasure;
|
|
4
4
|
export declare function filter(input: unknown, path: string): ClientFilter;
|
|
5
5
|
export declare function fields<T>(input: unknown, path: string, validate: (v: unknown, p: string) => T): Record<string, T>;
|
|
6
6
|
export declare function time(input: unknown, path: string): ClientTime | null;
|
|
7
7
|
export declare function limits(input: unknown, path: string): ClientQueryLimits;
|
|
8
|
+
/** Presentation text; references to dimension/measure keys are checked with the endpoint's. */
|
|
9
|
+
export declare function annotations(input: unknown, path: string): ClientEndpointAnnotations;
|
|
8
10
|
//# sourceMappingURL=nodes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/client-contract/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/client-contract/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,yBAAyB,EAAyB,YAAY,EAAE,aAAa,EAC1G,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKpD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAYvE;AACD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAKnE;AACD,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAQjE;AACD,wBAAgB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CASjH;AACD,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CASpE;AACD,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAUtE;AAQD,+FAA+F;AAC/F,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,yBAAyB,CAiBnF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { clientError } from './errors.js';
|
|
2
|
-
import { bool, choice, CLIENT_FIELD_TYPES, CLIENT_GRAINS, CLIENT_OPERATORS, integer, name, names, pointer, record, shape, timezone } from './primitives.js';
|
|
2
|
+
import { bool, choice, CLIENT_FIELD_TYPES, CLIENT_GRAINS, CLIENT_OPERATORS, integer, name, names, optionalShape, pointer, record, shape, text, timezone } from './primitives.js';
|
|
3
3
|
export function dimension(input, path) {
|
|
4
4
|
const value = shape(input, ['type', 'wireType', 'nullable', 'groupable', 'orderable'], path);
|
|
5
5
|
const type = choice(value.type, CLIENT_FIELD_TYPES, pointer(path, 'type'));
|
|
@@ -24,7 +24,7 @@ export function measure(input, path) {
|
|
|
24
24
|
export function filter(input, path) {
|
|
25
25
|
const value = shape(input, ['type', 'operators'], path);
|
|
26
26
|
const type = choice(value.type, CLIENT_FIELD_TYPES, pointer(path, 'type'));
|
|
27
|
-
const allowed = type === 'boolean' ? ['eq', 'neq', 'in', 'notIn']
|
|
27
|
+
const allowed = type === 'boolean' ? ['eq', 'neq', 'in', 'notIn', 'isNull', 'isNotNull']
|
|
28
28
|
: type === 'number' ? CLIENT_OPERATORS.filter(item => item !== 'like') : CLIENT_OPERATORS;
|
|
29
29
|
const operators = names(value.operators, pointer(path, 'operators'), allowed);
|
|
30
30
|
if (operators.length === 0)
|
|
@@ -66,3 +66,33 @@ export function limits(input, path) {
|
|
|
66
66
|
}
|
|
67
67
|
return result;
|
|
68
68
|
}
|
|
69
|
+
function annotation(input, path, keys) {
|
|
70
|
+
const value = optionalShape(input, keys, path);
|
|
71
|
+
const result = Object.create(null);
|
|
72
|
+
if (Object.hasOwn(value, 'label'))
|
|
73
|
+
result.label = text(value.label, pointer(path, 'label'));
|
|
74
|
+
if (Object.hasOwn(value, 'description'))
|
|
75
|
+
result.description = text(value.description, pointer(path, 'description'));
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
/** Presentation text; references to dimension/measure keys are checked with the endpoint's. */
|
|
79
|
+
export function annotations(input, path) {
|
|
80
|
+
const result = annotation(input, path, ['label', 'description', 'fields']);
|
|
81
|
+
const value = input;
|
|
82
|
+
if (Object.hasOwn(value, 'fields')) {
|
|
83
|
+
const fieldsPath = pointer(path, 'fields');
|
|
84
|
+
const entries = record(value.fields, fieldsPath);
|
|
85
|
+
const keys = Object.keys(entries);
|
|
86
|
+
if (keys.length > 512)
|
|
87
|
+
clientError('HQ_CLIENT_LIMIT', fieldsPath);
|
|
88
|
+
if (keys.length === 0)
|
|
89
|
+
clientError('HQ_CLIENT_SHAPE', fieldsPath);
|
|
90
|
+
const described = Object.create(null);
|
|
91
|
+
for (const key of keys.sort()) {
|
|
92
|
+
name(key, fieldsPath, true);
|
|
93
|
+
described[key] = annotation(entries[key], pointer(fieldsPath, key), ['label', 'description']);
|
|
94
|
+
}
|
|
95
|
+
result.fields = described;
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
@@ -4,6 +4,8 @@ export declare const CLIENT_GRAINS: readonly ["minute", "hour", "day", "week", "
|
|
|
4
4
|
export declare const CLIENT_OPERATORS: string[];
|
|
5
5
|
export declare function pointer(path: string, key: string | number): string;
|
|
6
6
|
export declare function record(input: unknown, path: string): ClientRecord;
|
|
7
|
+
/** Closed object whose listed members are all optional; at least one is required. */
|
|
8
|
+
export declare function optionalShape(input: unknown, keys: readonly string[], path: string): ClientRecord;
|
|
7
9
|
export declare function shape(input: unknown, keys: readonly string[], path: string): ClientRecord;
|
|
8
10
|
export declare function choice<T extends string>(input: unknown, choices: readonly T[], path: string): T;
|
|
9
11
|
export declare function bool(input: unknown, path: string): boolean;
|
|
@@ -11,5 +13,7 @@ export declare function integer(input: unknown, low: number, high: number, path:
|
|
|
11
13
|
export declare function name(input: unknown, path: string, qualified?: boolean): string;
|
|
12
14
|
export declare function names(input: unknown, path: string, allowed?: readonly string[]): string[];
|
|
13
15
|
export declare function route(input: unknown, path: string): string;
|
|
16
|
+
/** Deployment label/description rules: non-blank, control-free, at most 4096 UTF-8 bytes. */
|
|
17
|
+
export declare function text(input: unknown, path: string): string;
|
|
14
18
|
export declare function timezone(input: unknown, path: string): string;
|
|
15
19
|
//# sourceMappingURL=primitives.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/client-contract/primitives.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACnD,eAAO,MAAM,kBAAkB,uDAAwD,CAAC;AACxF,eAAO,MAAM,aAAa,wEAAyE,CAAC;AACpG,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/client-contract/primitives.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACnD,eAAO,MAAM,kBAAkB,uDAAwD,CAAC;AACxF,eAAO,MAAM,aAAa,wEAAyE,CAAC;AACpG,eAAO,MAAM,gBAAgB,UAAmG,CAAC;AACjI,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAElE;AACD,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAGjE;AACD,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAKjG;AACD,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAKzF;AACD,wBAAgB,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAG/F;AACD,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAG1D;AACD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKvF;AACD,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,MAAM,CAO5E;AACD,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAOzF;AACD,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED,6FAA6F;AAC7F,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAQzD;AACD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7D"}
|
|
@@ -3,7 +3,7 @@ import { parseProtocolIdentifier } from '../identifiers/identifiers.js';
|
|
|
3
3
|
import { clientError } from './errors.js';
|
|
4
4
|
export const CLIENT_FIELD_TYPES = ['string', 'number', 'boolean', 'timestamp'];
|
|
5
5
|
export const CLIENT_GRAINS = ['minute', 'hour', 'day', 'week', 'month', 'quarter', 'year'];
|
|
6
|
-
export const CLIENT_OPERATORS = ['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'in', 'notIn', 'between', 'like'];
|
|
6
|
+
export const CLIENT_OPERATORS = ['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'in', 'notIn', 'between', 'like', 'isNull', 'isNotNull'];
|
|
7
7
|
export function pointer(path, key) {
|
|
8
8
|
return path + '/' + String(key).replaceAll('~', '~0').replaceAll('/', '~1');
|
|
9
9
|
}
|
|
@@ -12,6 +12,15 @@ export function record(input, path) {
|
|
|
12
12
|
clientError('HQ_CLIENT_SHAPE', path);
|
|
13
13
|
return input;
|
|
14
14
|
}
|
|
15
|
+
/** Closed object whose listed members are all optional; at least one is required. */
|
|
16
|
+
export function optionalShape(input, keys, path) {
|
|
17
|
+
const value = record(input, path);
|
|
18
|
+
if (Object.keys(value).some(key => !keys.includes(key)))
|
|
19
|
+
clientError('HQ_CLIENT_UNKNOWN_FIELD', path);
|
|
20
|
+
if (!keys.some(key => Object.hasOwn(value, key)))
|
|
21
|
+
clientError('HQ_CLIENT_SHAPE', path);
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
15
24
|
export function shape(input, keys, path) {
|
|
16
25
|
const value = record(input, path);
|
|
17
26
|
if (Object.keys(value).some(key => !keys.includes(key)))
|
|
@@ -67,6 +76,20 @@ export function route(input, path) {
|
|
|
67
76
|
clientError('HQ_CLIENT_PATH', path);
|
|
68
77
|
return input;
|
|
69
78
|
}
|
|
79
|
+
const textEncoder = new TextEncoder();
|
|
80
|
+
/** Deployment label/description rules: non-blank, control-free, at most 4096 UTF-8 bytes. */
|
|
81
|
+
export function text(input, path) {
|
|
82
|
+
if (typeof input !== 'string' || input.trim().length === 0 || input.length > 4096)
|
|
83
|
+
clientError('HQ_CLIENT_SHAPE', path);
|
|
84
|
+
for (let index = 0; index < input.length; index++) {
|
|
85
|
+
const code = input.charCodeAt(index);
|
|
86
|
+
if (code <= 0x1f || (code >= 0x7f && code <= 0x9f))
|
|
87
|
+
clientError('HQ_CLIENT_SHAPE', path);
|
|
88
|
+
}
|
|
89
|
+
if (textEncoder.encode(input).byteLength > 4096)
|
|
90
|
+
clientError('HQ_CLIENT_SHAPE', path);
|
|
91
|
+
return input;
|
|
92
|
+
}
|
|
70
93
|
export function timezone(input, path) {
|
|
71
94
|
if (typeof input !== 'string' || !CLIENT_TIMEZONE_NAMES.has(input))
|
|
72
95
|
clientError('HQ_CLIENT_SHAPE', path);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/client-contract/query.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/client-contract/query.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAMzD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AA6ED,gGAAgG;AAChG,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,GAAE,MAAM,GAAG,KAAc,GACxF,eAAe,CAmBjB"}
|
|
@@ -2,6 +2,7 @@ import { clientError, ProtocolClientContractError } from './errors.js';
|
|
|
2
2
|
import { validateProtocolClientContract } from './validate.js';
|
|
3
3
|
import { record, shape, integer, timezone } from './primitives.js';
|
|
4
4
|
import { freezeClientData, snapshotClientData } from './safe-data.js';
|
|
5
|
+
import { isProtocolNullCheckOperator } from '../expressions/null-checks.js';
|
|
5
6
|
function array(input, maximum) {
|
|
6
7
|
if (!Array.isArray(input) || input.length > maximum)
|
|
7
8
|
clientError('HQ_CLIENT_QUERY');
|
|
@@ -39,13 +40,16 @@ function bodyFor(endpoint, source, transport) {
|
|
|
39
40
|
clientError('HQ_CLIENT_QUERY');
|
|
40
41
|
const filters = array(source.filters === undefined ? [] : source.filters, caps.maxPredicates);
|
|
41
42
|
for (const item of filters) {
|
|
42
|
-
|
|
43
|
+
// A null check names no value (RFC 0023), so one carrying `value` fails as an unknown member.
|
|
44
|
+
const nullCheck = isProtocolNullCheckOperator(record(item, '').operator);
|
|
45
|
+
const filter = shape(item, nullCheck ? ['field', 'operator'] : ['field', 'operator', 'value'], '');
|
|
43
46
|
if (typeof filter.field !== 'string' || !Object.hasOwn(endpoint.filters, filter.field))
|
|
44
47
|
clientError('HQ_CLIENT_QUERY');
|
|
45
48
|
const definition = endpoint.filters[filter.field];
|
|
46
49
|
if (typeof filter.operator !== 'string' || !definition.operators.includes(filter.operator))
|
|
47
50
|
clientError('HQ_CLIENT_QUERY');
|
|
48
|
-
|
|
51
|
+
if (!nullCheck)
|
|
52
|
+
predicateValue(filter.value, definition.type, filter.operator, caps.maxFilterValues);
|
|
49
53
|
}
|
|
50
54
|
const having = array(source.having === undefined ? [] : source.having, caps.maxPredicates - filters.length);
|
|
51
55
|
for (const item of having) {
|
|
@@ -32,6 +32,14 @@ export interface ClientQueryLimits {
|
|
|
32
32
|
readonly maxOrderBy: number;
|
|
33
33
|
readonly maxFilterValues: number;
|
|
34
34
|
}
|
|
35
|
+
export interface ClientFieldAnnotation {
|
|
36
|
+
readonly label?: string;
|
|
37
|
+
readonly description?: string;
|
|
38
|
+
}
|
|
39
|
+
/** Presentation text only; excluded from schemaHash and never a capability. */
|
|
40
|
+
export interface ClientEndpointAnnotations extends ClientFieldAnnotation {
|
|
41
|
+
readonly fields?: Readonly<Record<string, ClientFieldAnnotation>>;
|
|
42
|
+
}
|
|
35
43
|
interface ClientEndpointBase {
|
|
36
44
|
readonly id: string;
|
|
37
45
|
readonly dataset: string;
|
|
@@ -42,6 +50,7 @@ interface ClientEndpointBase {
|
|
|
42
50
|
readonly time: ClientTime | null;
|
|
43
51
|
readonly metadata: boolean;
|
|
44
52
|
readonly limits: ClientQueryLimits;
|
|
53
|
+
readonly annotations?: ClientEndpointAnnotations;
|
|
45
54
|
readonly schemaHash: string;
|
|
46
55
|
}
|
|
47
56
|
export interface ClientDatasetEndpoint extends ClientEndpointBase {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client-contract/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AAC5E,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,kBAAkB,CAAC;AAClF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AACD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AACD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AACD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,oCAAoC,CAAC;CAC7D;AACD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AACD,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IAC/D,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACzD,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AACD,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C;AACD,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;CACzB;AACD,MAAM,MAAM,sBAAsB,GAAG,qBAAqB,GAAG,oBAAoB,CAAC;AAClF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACtD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AACD,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client-contract/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/client-contract/validate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,8BAA8B,EAAE,sBAAsB,EAA0B,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/client-contract/validate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,8BAA8B,EAAE,sBAAsB,EAA0B,MAAM,YAAY,CAAC;AA2EjH,6EAA6E;AAC7E,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAErF;AACD,8FAA8F;AAC9F,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,8BAA8B,CAE5F"}
|
|
@@ -2,15 +2,16 @@ import { boundClientDescriptors } from './bounds.js';
|
|
|
2
2
|
import { clientError } from './errors.js';
|
|
3
3
|
import { CLIENT_CONTRACT_DOMAIN, CLIENT_SCHEMA_DOMAIN, clientDigest } from './codec.js';
|
|
4
4
|
import { bool, choice, name, names, pointer, record, route, shape } from './primitives.js';
|
|
5
|
-
import { dimension, fields, filter, limits, measure, time } from './nodes.js';
|
|
5
|
+
import { annotations, dimension, fields, filter, limits, measure, time } from './nodes.js';
|
|
6
6
|
import { clientCanonical, freezeClientData, snapshotClientData } from './safe-data.js';
|
|
7
7
|
const ENDPOINT_FIELDS = ['id', 'kind', 'dataset', 'path', 'dimensions', 'measures', 'filters',
|
|
8
8
|
'time', 'metadata', 'limits'];
|
|
9
9
|
function endpoint(input, path, signed) {
|
|
10
10
|
const raw = record(input, path);
|
|
11
11
|
const kind = choice(raw.kind, ['dataset', 'metric'], pointer(path, 'kind'));
|
|
12
|
+
const annotated = Object.hasOwn(raw, 'annotations');
|
|
12
13
|
const value = shape(raw, [...ENDPOINT_FIELDS, ...(kind === 'dataset' ? ['defaultMeasures'] : []),
|
|
13
|
-
...(signed ? ['schemaHash'] : [])], path);
|
|
14
|
+
...(annotated ? ['annotations'] : []), ...(signed ? ['schemaHash'] : [])], path);
|
|
14
15
|
const id = name(value.id, pointer(path, 'id'));
|
|
15
16
|
const dataset = name(value.dataset, pointer(path, 'dataset'));
|
|
16
17
|
const result = {
|
|
@@ -24,6 +25,8 @@ function endpoint(input, path, signed) {
|
|
|
24
25
|
};
|
|
25
26
|
if (kind === 'dataset')
|
|
26
27
|
result.defaultMeasures = names(value.defaultMeasures, pointer(path, 'defaultMeasures'));
|
|
28
|
+
if (annotated)
|
|
29
|
+
result.annotations = annotations(value.annotations, pointer(path, 'annotations'));
|
|
27
30
|
if (signed)
|
|
28
31
|
result.schemaHash = value.schemaHash;
|
|
29
32
|
return result;
|
|
@@ -48,6 +51,9 @@ function references(value, path) {
|
|
|
48
51
|
|| defaults.length > item.limits.maxMeasures || item.limits.defaultLimit > item.limits.maxLimit) {
|
|
49
52
|
clientError('HQ_CLIENT_REFERENCE', path);
|
|
50
53
|
}
|
|
54
|
+
if (Object.keys(item.annotations?.fields ?? {}).some(key => !Object.hasOwn(item.dimensions, key)
|
|
55
|
+
&& !Object.hasOwn(item.measures, key)))
|
|
56
|
+
clientError('HQ_CLIENT_REFERENCE', path);
|
|
51
57
|
}
|
|
52
58
|
function contract(input, signed) {
|
|
53
59
|
const raw = record(snapshotClientData(input), '');
|
|
@@ -72,7 +78,7 @@ function contract(input, signed) {
|
|
|
72
78
|
endpoints.forEach((item, index) => references(item, '/endpoints/' + index));
|
|
73
79
|
endpoints.sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
|
|
74
80
|
for (const [index, item] of endpoints.entries()) {
|
|
75
|
-
const { schemaHash, limits: _limits, ...schema } = item;
|
|
81
|
+
const { schemaHash, limits: _limits, annotations: _annotations, ...schema } = item;
|
|
76
82
|
const hash = clientDigest(CLIENT_SCHEMA_DOMAIN, schema);
|
|
77
83
|
if (signed && schemaHash !== hash)
|
|
78
84
|
clientError('HQ_CLIENT_IDENTITY', '/endpoints/' + index + '/schemaHash');
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aggregate functions whose stored states a `merge` measure finalizes (RFC 0022).
|
|
3
|
+
*
|
|
4
|
+
* An `AggregatingMergeTree` column `AggregateFunction(<fn>, <type>)` holds
|
|
5
|
+
* partial states, read with the matching `-Merge` combinator (`uniqMerge`).
|
|
6
|
+
* Only non-parametric functions: a parametric state such as `quantile(0.9)`
|
|
7
|
+
* must be merged with its parameters, which a measure can't read back. The
|
|
8
|
+
* name is interpolated into SQL, so it must come from this list.
|
|
9
|
+
*/
|
|
10
|
+
export declare const PROTOCOL_AGGREGATE_STATE_FUNCTIONS: readonly ["uniq", "uniqExact", "uniqCombined", "uniqCombined64", "uniqHLL12", "uniqTheta", "count", "sum", "avg", "min", "max", "any", "anyLast", "groupBitmap"];
|
|
11
|
+
export type ProtocolAggregateStateFunction = (typeof PROTOCOL_AGGREGATE_STATE_FUNCTIONS)[number];
|
|
12
|
+
/** States whose merged value is an estimate: their measures are approximate. */
|
|
13
|
+
export declare const PROTOCOL_APPROXIMATE_STATE_FUNCTIONS: readonly ["uniq", "uniqCombined", "uniqCombined64", "uniqHLL12", "uniqTheta"];
|
|
14
|
+
export declare function isProtocolAggregateStateFunction(value: unknown): value is ProtocolAggregateStateFunction;
|
|
15
|
+
export declare function isApproximateStateFunction(value: string): boolean;
|
|
16
|
+
//# sourceMappingURL=aggregate-states.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate-states.d.ts","sourceRoot":"","sources":["../../src/deployments/aggregate-states.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,kCAAkC,kKAepC,CAAC;AAEZ,MAAM,MAAM,8BAA8B,GAAG,CAAC,OAAO,kCAAkC,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjG,gFAAgF;AAChF,eAAO,MAAM,oCAAoC,+EAMtC,CAAC;AAKZ,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,8BAA8B,CAExG;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEjE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aggregate functions whose stored states a `merge` measure finalizes (RFC 0022).
|
|
3
|
+
*
|
|
4
|
+
* An `AggregatingMergeTree` column `AggregateFunction(<fn>, <type>)` holds
|
|
5
|
+
* partial states, read with the matching `-Merge` combinator (`uniqMerge`).
|
|
6
|
+
* Only non-parametric functions: a parametric state such as `quantile(0.9)`
|
|
7
|
+
* must be merged with its parameters, which a measure can't read back. The
|
|
8
|
+
* name is interpolated into SQL, so it must come from this list.
|
|
9
|
+
*/
|
|
10
|
+
export const PROTOCOL_AGGREGATE_STATE_FUNCTIONS = Object.freeze([
|
|
11
|
+
'uniq',
|
|
12
|
+
'uniqExact',
|
|
13
|
+
'uniqCombined',
|
|
14
|
+
'uniqCombined64',
|
|
15
|
+
'uniqHLL12',
|
|
16
|
+
'uniqTheta',
|
|
17
|
+
'count',
|
|
18
|
+
'sum',
|
|
19
|
+
'avg',
|
|
20
|
+
'min',
|
|
21
|
+
'max',
|
|
22
|
+
'any',
|
|
23
|
+
'anyLast',
|
|
24
|
+
'groupBitmap',
|
|
25
|
+
]);
|
|
26
|
+
/** States whose merged value is an estimate: their measures are approximate. */
|
|
27
|
+
export const PROTOCOL_APPROXIMATE_STATE_FUNCTIONS = Object.freeze([
|
|
28
|
+
'uniq',
|
|
29
|
+
'uniqCombined',
|
|
30
|
+
'uniqCombined64',
|
|
31
|
+
'uniqHLL12',
|
|
32
|
+
'uniqTheta',
|
|
33
|
+
]);
|
|
34
|
+
const STATE_FUNCTIONS = new Set(PROTOCOL_AGGREGATE_STATE_FUNCTIONS);
|
|
35
|
+
const APPROXIMATE = new Set(PROTOCOL_APPROXIMATE_STATE_FUNCTIONS);
|
|
36
|
+
export function isProtocolAggregateStateFunction(value) {
|
|
37
|
+
return typeof value === 'string' && STATE_FUNCTIONS.has(value);
|
|
38
|
+
}
|
|
39
|
+
export function isApproximateStateFunction(value) {
|
|
40
|
+
return APPROXIMATE.has(value);
|
|
41
|
+
}
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
import type { ProtocolExpression } from '../expressions/index.js';
|
|
6
6
|
import type { ProtocolDatasetDimension, ProtocolDatasetTenantPolicy } from './types.js';
|
|
7
7
|
/**
|
|
8
|
-
* True for a comparison between references and literals
|
|
8
|
+
* True for a comparison between references and literals (a null check has
|
|
9
|
+
* only `left`), or a logical tree
|
|
9
10
|
* whose leaves are all such comparisons. Aggregates, arithmetic, and calls are
|
|
10
11
|
* excluded: a segment selects rows by their own dimension values.
|
|
11
12
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"segments.d.ts","sourceRoot":"","sources":["../../src/deployments/segments.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAExF
|
|
1
|
+
{"version":3,"file":"segments.d.ts","sourceRoot":"","sources":["../../src/deployments/segments.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAExF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAS1E;AAMD,gEAAgE;AAChE,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAsB7E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,SAAS,wBAAwB,EAAE,EAC/C,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAMT"}
|
|
@@ -3,13 +3,15 @@
|
|
|
3
3
|
* predicate shape, and which references a predicate may make.
|
|
4
4
|
*/
|
|
5
5
|
/**
|
|
6
|
-
* True for a comparison between references and literals
|
|
6
|
+
* True for a comparison between references and literals (a null check has
|
|
7
|
+
* only `left`), or a logical tree
|
|
7
8
|
* whose leaves are all such comparisons. Aggregates, arithmetic, and calls are
|
|
8
9
|
* excluded: a segment selects rows by their own dimension values.
|
|
9
10
|
*/
|
|
10
11
|
export function isSegmentPredicate(expression) {
|
|
11
12
|
if (expression.kind === 'comparison') {
|
|
12
|
-
return isSegmentOperand(expression.left)
|
|
13
|
+
return isSegmentOperand(expression.left)
|
|
14
|
+
&& (!('right' in expression) || isSegmentOperand(expression.right));
|
|
13
15
|
}
|
|
14
16
|
if (expression.kind !== 'logical')
|
|
15
17
|
return false;
|
|
@@ -28,8 +30,11 @@ export function expressionReferences(expression) {
|
|
|
28
30
|
case 'literal':
|
|
29
31
|
return [];
|
|
30
32
|
case 'binary':
|
|
31
|
-
case 'comparison':
|
|
32
33
|
return [...expressionReferences(expression.left), ...expressionReferences(expression.right)];
|
|
34
|
+
case 'comparison':
|
|
35
|
+
return 'right' in expression
|
|
36
|
+
? [...expressionReferences(expression.left), ...expressionReferences(expression.right)]
|
|
37
|
+
: expressionReferences(expression.left);
|
|
33
38
|
case 'call':
|
|
34
39
|
return expression.args.flatMap(expressionReferences);
|
|
35
40
|
case 'logical':
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ProtocolAggregateStateFunction } from './aggregate-states.js';
|
|
1
2
|
import type { ProtocolExpression, ProtocolQueryTimeGrain, ProtocolTimeGrain } from '../expressions/index.js';
|
|
2
3
|
import type { ProtocolIdentifier, ProtocolQualifiedIdentifier } from '../identifiers/index.js';
|
|
3
4
|
import type { ProtocolQueryImplementationError, ProtocolSqlExpression } from '../query-implementations/index.js';
|
|
@@ -62,8 +63,13 @@ export interface ProtocolDatasetDimension extends ProtocolSemanticMetadata {
|
|
|
62
63
|
}
|
|
63
64
|
export interface ProtocolDatasetMeasure extends ProtocolSemanticMetadata {
|
|
64
65
|
readonly name: ProtocolIdentifier;
|
|
65
|
-
readonly aggregation: 'sum' | 'count' | 'countDistinct' | 'avg' | 'min' | 'max' | 'argMax' | 'argMin' | 'percentile' | 'stddev' | 'variance';
|
|
66
|
+
readonly aggregation: 'sum' | 'count' | 'countDistinct' | 'avg' | 'min' | 'max' | 'argMax' | 'argMin' | 'percentile' | 'stddev' | 'variance' | 'merge';
|
|
66
67
|
readonly field: ProtocolQualifiedIdentifier;
|
|
68
|
+
/**
|
|
69
|
+
* `merge` only, and required there (RFC 0022): the function whose stored
|
|
70
|
+
* states `field` holds, finalized with `<stateFunction>Merge`.
|
|
71
|
+
*/
|
|
72
|
+
readonly stateFunction?: ProtocolAggregateStateFunction;
|
|
67
73
|
readonly argField?: ProtocolQualifiedIdentifier;
|
|
68
74
|
readonly level?: number;
|
|
69
75
|
readonly sql?: ProtocolSqlExpression;
|
|
@@ -74,7 +80,7 @@ export interface ProtocolDatasetMeasure extends ProtocolSemanticMetadata {
|
|
|
74
80
|
export interface ProtocolDatasetFilter extends ProtocolSemanticMetadata {
|
|
75
81
|
readonly name: ProtocolIdentifier;
|
|
76
82
|
readonly field: ProtocolQualifiedIdentifier;
|
|
77
|
-
readonly operators: readonly ('eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'notIn' | 'between' | 'like')[];
|
|
83
|
+
readonly operators: readonly ('eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'notIn' | 'between' | 'like' | 'isNull' | 'isNotNull')[];
|
|
78
84
|
readonly label?: string;
|
|
79
85
|
readonly description?: string;
|
|
80
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/deployments/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/deployments/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC7G,OAAO,KAAK,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAC/F,OAAO,KAAK,EACV,gCAAgC,EAChC,qBAAqB,EACtB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AACrF,MAAM,MAAM,2BAA2B,GAAG,QAAQ,GAAG,UAAU,GAAG,cAAc,GAAG,YAAY,CAAC;AAEhG,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,2BAA2B,CAAC;CACpD;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC;CACxC;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IACE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AAEN,MAAM,MAAM,4BAA4B,GACpC;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GACjC;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,QAAQ,CAAC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEN,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,4BAA4B,CAAC;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,2BAA2B,GACnC;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC;AAEtC,MAAM,MAAM,0BAA0B,GAClC;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpD,qBAAqB,CAAC;AAE1B,MAAM,WAAW,wBAAyB,SAAQ,wBAAwB;IACxE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAuB,SAAQ,wBAAwB;IACtE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,WAAW,EAChB,KAAK,GAAG,OAAO,GAAG,eAAe,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GACzD,QAAQ,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,UAAU,GAC1D,OAAO,CAAC;IACZ,QAAQ,CAAC,KAAK,EAAE,2BAA2B,CAAC;IAC5C;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,8BAA8B,CAAC;IACxD,QAAQ,CAAC,QAAQ,CAAC,EAAE,2BAA2B,CAAC;IAChD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAChD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAsB,SAAQ,wBAAwB;IACrE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,2BAA2B,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,SAAS,CACzB,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAC1C,IAAI,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GACnC,QAAQ,GAAG,WAAW,CACzB,EAAE,CAAC;IACJ,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAC3C,QAAQ,CAAC,EAAE,EAAE,2BAA2B,CAAC;IACzC,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;QAAC,QAAQ,CAAC,EAAE,EAAE,2BAA2B,CAAA;KAAE,EAAE,CAAC;IACpH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,sFAAsF;AACtF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;CACzC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;CACzC;AAED,MAAM,WAAW,qBAAsB,SAAQ,wBAAwB;IACrE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;IAC9D,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,wBAAwB,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAC5D,QAAQ,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;CAC3C;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,0EAA0E;AAC1E;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAA;CAAE,GACrG;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,sBAAsB,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAEhI,MAAM,WAAW,uBAAwB,SAAQ,wBAAwB;IACvE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,qBAAqB,CAAC;IAC/C,QAAQ,CAAC,SAAS,CAAC,EAAE,wBAAwB,CAAC;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,2BAA2B,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,2BAA2B,CAAC;IACjD,QAAQ,CAAC,UAAU,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACzD,QAAQ,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACrD,QAAQ,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACnD,QAAQ,CAAC,aAAa,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAC/D,QAAQ,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAC;CAC5C;AAED,yEAAyE;AACzE,MAAM,WAAW,6BAA8B,SAAQ,wBAAwB;IAC7E,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,SAAS;QACtB,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;QACnC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;KACtC,EAAE,CAAC;IACJ,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,gFAAgF;AAChF,MAAM,MAAM,yBAAyB,GAAG,sBAAsB,GAAG,6BAA6B,CAAC;AAE/F,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,uBAAuB,EAAE,UAAU,GAAG,SAAS,CAAC;IACtG,QAAQ,CAAC,QAAQ,EAAE,SAAS,yBAAyB,EAAE,CAAC;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC;CAC1B;AAED,iFAAiF;AACjF,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,SAAS,yBAAyB,EAAE,CAAC;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;CAC5B;AAED,oFAAoF;AACpF,MAAM,WAAW,sBAAuB,SAAQ,wBAAwB;IACtE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,0FAA0F;AAC1F,MAAM,WAAW,wBAAyB,SAAQ,IAAI,CAAC,sBAAsB,EAAE,aAAa,CAAC;IAC3F,QAAQ,CAAC,WAAW,EAAE,sBAAsB,CAAC,aAAa,CAAC,GAAG,qBAAqB,CAAC;IACpF,wEAAwE;IACxE,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC;CAC7B;AAED,6EAA6E;AAC7E,MAAM,WAAW,+BAAgC,SAAQ,6BAA6B;IACpF,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC;CAC7B;AAED,0EAA0E;AAC1E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;CACvC;AAED,UAAU,yBAA0B,SAAQ,wBAAwB;IAClE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,mFAAmF;IACnF,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC;IACjC,4EAA4E;IAC5E,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,4BAA6B,SAAQ,yBAAyB;IAC7E,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;IAC5D,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;CAC5B;AAED,sFAAsF;AACtF,MAAM,WAAW,2BAA4B,SAAQ,yBAAyB;IAC5E,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;CACzC;AAED,MAAM,MAAM,2BAA2B,GACnC,wBAAwB,GACxB,+BAA+B,GAC/B,4BAA4B,GAC5B,2BAA2B,CAAC;AAEhC;;;GAGG;AACH,MAAM,WAAW,2BACf,SAAQ,IAAI,CAAC,yBAAyB,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IAC5E,QAAQ,CAAC,QAAQ,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAC1D,QAAQ,CAAC,cAAc,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC1D,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;QACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,sBAAsB,CAAC;KAC7C,CAAC;IACF,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC;CAC1B;AAED,wCAAwC;AACxC,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,SAAS,2BAA2B,EAAE,CAAC;CAC3D;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC;;;;;OAKG;IACH,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACrD;AAED,MAAM,MAAM,2BAA2B,GACnC,oBAAoB,GACpB,6BAA6B,GAC7B,+BAA+B,GAC/B,kCAAkC,GAClC,6BAA6B,GAC7B,iCAAiC,GACjC,8BAA8B,GAC9B,yBAAyB,GACzB,6BAA6B,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,iCAAiC,GACzC,uBAAuB,GACvB,gCAAgC,CAAC;AAErC;;;;GAIG;AACH,MAAM,MAAM,6BAA6B,CAAC,CAAC,IACvC;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACxC;IACA,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,MAAM,EAAE,SAAS,iCAAiC,EAAE,CAAC;IAC9D,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/deployments/validate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/deployments/validate.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAEV,uBAAuB,EAEvB,6BAA6B,EAC7B,0BAA0B,EAC1B,4BAA4B,EAgB5B,yBAAyB,EAG1B,MAAM,YAAY,CAAC;AAy5BpB,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,yBAA8B,GACtC,uBAAuB,CAEzB;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,yBAA8B,GACtC,6BAA6B,CAAC,uBAAuB,CAAC,CAGxD;AAsTD,2FAA2F;AAC3F,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,yBAA8B,GACtC,0BAA0B,CAE5B;AAMD;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,yBAA8B,GACtC,6BAA6B,CAAC,0BAA0B,CAAC,CAG3D;AAYD;;;;;;;;GAQG;AACH,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,yBAA8B,GACtC,4BAA4B,CAE9B;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,yBAA8B,GACtC,6BAA6B,CAAC,4BAA4B,CAAC,CAG7D"}
|
|
@@ -7,15 +7,22 @@ import { attempt, collectErrors } from './collect.js';
|
|
|
7
7
|
import { deploymentError } from './errors.js';
|
|
8
8
|
import { expressionReferences, isSegmentPredicate, isSegmentReference } from './segments.js';
|
|
9
9
|
import { resolveDeploymentLimits } from './limits.js';
|
|
10
|
+
import { isApproximateStateFunction, isProtocolAggregateStateFunction } from './aggregate-states.js';
|
|
10
11
|
const textEncoder = new TextEncoder();
|
|
11
12
|
const AGGREGATIONS = new Set([
|
|
12
13
|
'sum', 'count', 'countDistinct', 'avg', 'min', 'max',
|
|
13
|
-
'argMax', 'argMin', 'percentile', 'stddev', 'variance',
|
|
14
|
+
'argMax', 'argMin', 'percentile', 'stddev', 'variance', 'merge',
|
|
14
15
|
]);
|
|
15
16
|
const AGGREGATIONS_V3 = new Set([...AGGREGATIONS, 'approxCountDistinct']);
|
|
16
17
|
const APPROXIMATE_AGGREGATIONS = new Set(['approxCountDistinct']);
|
|
18
|
+
/** A base measure whose value is an estimate: approxCountDistinct, or a merge of estimated states. */
|
|
19
|
+
function isApproximateMeasure(value) {
|
|
20
|
+
return APPROXIMATE_AGGREGATIONS.has(value.aggregation)
|
|
21
|
+
|| (value.aggregation === 'merge' && typeof value.stateFunction === 'string'
|
|
22
|
+
&& isApproximateStateFunction(value.stateFunction));
|
|
23
|
+
}
|
|
17
24
|
const OPERATORS = new Set([
|
|
18
|
-
'eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'in', 'notIn', 'between', 'like',
|
|
25
|
+
'eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'in', 'notIn', 'between', 'like', 'isNull', 'isNotNull',
|
|
19
26
|
]);
|
|
20
27
|
const GRAINS = new Set(['day', 'week', 'month', 'quarter', 'year']);
|
|
21
28
|
const GRAINS_V3 = new Set(['minute', 'hour', ...GRAINS]);
|
|
@@ -284,15 +291,29 @@ function validateDimension(input, path, limits) {
|
|
|
284
291
|
function validateMeasure(input, path, limits, version = 2) {
|
|
285
292
|
const value = requireRecord(input, path);
|
|
286
293
|
exactFields(value, ['name', 'aggregation', 'field', 'filters'], [
|
|
287
|
-
'argField', 'level', 'sql', 'label', 'description', ...SEMANTIC_METADATA_FIELDS,
|
|
294
|
+
'argField', 'level', 'sql', 'stateFunction', 'label', 'description', ...SEMANTIC_METADATA_FIELDS,
|
|
288
295
|
...(version === 3 ? ['approximate'] : []),
|
|
289
296
|
], path);
|
|
290
297
|
if (typeof value.aggregation !== 'string'
|
|
291
298
|
|| !(version === 3 ? AGGREGATIONS_V3 : AGGREGATIONS).has(value.aggregation)) {
|
|
292
299
|
deploymentError('HQ_DEPLOYMENT_INVALID_VALUE', `${path}.aggregation`);
|
|
293
300
|
}
|
|
301
|
+
// A merge measure reads one stored state column, named with its function (RFC 0022).
|
|
302
|
+
const merge = value.aggregation === 'merge';
|
|
303
|
+
if (merge !== (value.stateFunction !== undefined)) {
|
|
304
|
+
deploymentError('HQ_DEPLOYMENT_INVALID_VALUE', `${path}.stateFunction`);
|
|
305
|
+
}
|
|
306
|
+
if (merge && !isProtocolAggregateStateFunction(value.stateFunction)) {
|
|
307
|
+
deploymentError('HQ_DEPLOYMENT_INVALID_VALUE', `${path}.stateFunction`);
|
|
308
|
+
}
|
|
309
|
+
if (merge && value.sql !== undefined)
|
|
310
|
+
deploymentError('HQ_DEPLOYMENT_INVALID_VALUE', `${path}.sql`);
|
|
311
|
+
if (merge && Array.isArray(value.filters) && value.filters.length > 0) {
|
|
312
|
+
deploymentError('HQ_DEPLOYMENT_INVALID_VALUE', `${path}.filters`);
|
|
313
|
+
}
|
|
294
314
|
// The marker is not free: present, as `true`, exactly for an approximate aggregation.
|
|
295
|
-
|
|
315
|
+
// Contract 2 has no marker; consumers derive it from the state function.
|
|
316
|
+
const approximate = version === 3 && isApproximateMeasure(value);
|
|
296
317
|
if (value.approximate !== undefined && value.approximate !== true) {
|
|
297
318
|
deploymentError('HQ_DEPLOYMENT_TYPE', `${path}.approximate`);
|
|
298
319
|
}
|
|
@@ -318,6 +339,8 @@ function validateMeasure(input, path, limits, version = 2) {
|
|
|
318
339
|
filters: Object.freeze(requireArray(value.filters, `${path}.filters`, limits.maxDatasetItems)
|
|
319
340
|
.map((filter, index) => nested(() => validateProtocolExpression(filter, { extension: version === 3 ? 2 : 1 }), `${path}.filters[${index}]`))),
|
|
320
341
|
};
|
|
342
|
+
if (merge)
|
|
343
|
+
result.stateFunction = value.stateFunction;
|
|
321
344
|
if (approximate)
|
|
322
345
|
result.approximate = true;
|
|
323
346
|
if (value.argField !== undefined)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { ProtocolExpressionError } from './errors.js';
|
|
2
2
|
export { DEFAULT_PROTOCOL_EXPRESSION_LIMITS } from './limits.js';
|
|
3
3
|
export { validateProtocolExpression, validateProtocolSemanticQuery } from './validate.js';
|
|
4
|
-
export
|
|
4
|
+
export { PROTOCOL_NULL_CHECK_OPERATORS, isProtocolNullCheckOperator } from './null-checks.js';
|
|
5
|
+
export type { ProtocolAggregation, ProtocolBinaryOperator, ProtocolComparisonOperator, ProtocolDatasetQuery, ProtocolExpression, ProtocolExpressionErrorCode, ProtocolExpressionExtension, ProtocolExpressionLimits, ProtocolExpressionOptions, ProtocolFunctionName, ProtocolMetricQuery, ProtocolNullCheckOperator, ProtocolOrderBy, ProtocolSemanticQuery, ProtocolQueryTimeGrain, ProtocolTimeGrain, ProtocolValueComparisonOperator, } from './types.js';
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/expressions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,kCAAkC,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AAC1F,YAAY,EACV,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,kBAAkB,EAClB,2BAA2B,EAC3B,2BAA2B,EAC3B,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/expressions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,kCAAkC,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC9F,YAAY,EACV,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,kBAAkB,EAClB,2BAA2B,EAC3B,2BAA2B,EAC3B,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,EACzB,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,+BAA+B,GAChC,MAAM,YAAY,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { ProtocolExpressionError } from './errors.js';
|
|
2
2
|
export { DEFAULT_PROTOCOL_EXPRESSION_LIMITS } from './limits.js';
|
|
3
3
|
export { validateProtocolExpression, validateProtocolSemanticQuery } from './validate.js';
|
|
4
|
+
export { PROTOCOL_NULL_CHECK_OPERATORS, isProtocolNullCheckOperator } from './null-checks.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ProtocolNullCheckOperator } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Comparison operators that test a field for NULL (RFC 0023). They take no
|
|
4
|
+
* right-hand value: a comparison, filter, or client predicate using one must
|
|
5
|
+
* omit it, and validators reject one that carries a value.
|
|
6
|
+
*/
|
|
7
|
+
export declare const PROTOCOL_NULL_CHECK_OPERATORS: readonly ProtocolNullCheckOperator[];
|
|
8
|
+
/** True for `isNull` and `isNotNull`, the comparison operators without a value. */
|
|
9
|
+
export declare function isProtocolNullCheckOperator(operator: unknown): operator is ProtocolNullCheckOperator;
|
|
10
|
+
//# sourceMappingURL=null-checks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"null-checks.d.ts","sourceRoot":"","sources":["../../src/expressions/null-checks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,EAAE,SAAS,yBAAyB,EAG5E,CAAC;AAEH,mFAAmF;AACnF,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,IAAI,yBAAyB,CAEpG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comparison operators that test a field for NULL (RFC 0023). They take no
|
|
3
|
+
* right-hand value: a comparison, filter, or client predicate using one must
|
|
4
|
+
* omit it, and validators reject one that carries a value.
|
|
5
|
+
*/
|
|
6
|
+
export const PROTOCOL_NULL_CHECK_OPERATORS = Object.freeze([
|
|
7
|
+
'isNull',
|
|
8
|
+
'isNotNull',
|
|
9
|
+
]);
|
|
10
|
+
/** True for `isNull` and `isNotNull`, the comparison operators without a value. */
|
|
11
|
+
export function isProtocolNullCheckOperator(operator) {
|
|
12
|
+
return operator === 'isNull' || operator === 'isNotNull';
|
|
13
|
+
}
|
|
@@ -2,7 +2,11 @@ import type { ProtocolIdentifier, ProtocolQualifiedIdentifier } from '../identif
|
|
|
2
2
|
import type { CanonicalValue } from '../values/index.js';
|
|
3
3
|
export type ProtocolBinaryOperator = 'add' | 'subtract' | 'multiply' | 'divide';
|
|
4
4
|
export type ProtocolFunctionName = 'nullIfZero' | 'coalesce' | 'round' | 'floor' | 'ceil';
|
|
5
|
-
|
|
5
|
+
/** Comparison operators that compare `left` with a `right` value. */
|
|
6
|
+
export type ProtocolValueComparisonOperator = 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'notIn' | 'between' | 'like';
|
|
7
|
+
/** Comparison operators that test `left` for NULL and take no `right` (RFC 0023). */
|
|
8
|
+
export type ProtocolNullCheckOperator = 'isNull' | 'isNotNull';
|
|
9
|
+
export type ProtocolComparisonOperator = ProtocolValueComparisonOperator | ProtocolNullCheckOperator;
|
|
6
10
|
/**
|
|
7
11
|
* Every aggregation any supported expression extension accepts.
|
|
8
12
|
* `approxCountDistinct` is extension 2 (RFC 0015); the validator rejects it
|
|
@@ -26,9 +30,13 @@ export type ProtocolExpression = {
|
|
|
26
30
|
readonly args: readonly ProtocolExpression[];
|
|
27
31
|
} | {
|
|
28
32
|
readonly kind: 'comparison';
|
|
29
|
-
readonly operator:
|
|
33
|
+
readonly operator: ProtocolValueComparisonOperator;
|
|
30
34
|
readonly left: ProtocolExpression;
|
|
31
35
|
readonly right: ProtocolExpression;
|
|
36
|
+
} | {
|
|
37
|
+
readonly kind: 'comparison';
|
|
38
|
+
readonly operator: ProtocolNullCheckOperator;
|
|
39
|
+
readonly left: ProtocolExpression;
|
|
32
40
|
} | {
|
|
33
41
|
readonly kind: 'logical';
|
|
34
42
|
readonly operator: 'and' | 'or';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/expressions/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAC/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;AAChF,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAC1F,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/expressions/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/expressions/validate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/expressions/validate.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAEV,kBAAkB,EAGlB,yBAAyB,EACzB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAkRpB,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,yBAA8B,GACtC,kBAAkB,CAEpB;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,yBAA8B,GACtC,qBAAqB,CAwDvB"}
|
|
@@ -2,8 +2,11 @@ import { ProtocolIdentifierError, parseProtocolIdentifier, parseProtocolQualifie
|
|
|
2
2
|
import { ProtocolValueError, validateCanonicalValue } from '../values/index.js';
|
|
3
3
|
import { expressionError } from './errors.js';
|
|
4
4
|
import { resolveExpressionLimits } from './limits.js';
|
|
5
|
+
import { isProtocolNullCheckOperator } from './null-checks.js';
|
|
5
6
|
const BINARY = new Set(['add', 'subtract', 'multiply', 'divide']);
|
|
6
|
-
const COMPARISONS = new Set([
|
|
7
|
+
const COMPARISONS = new Set([
|
|
8
|
+
'eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'in', 'notIn', 'between', 'like', 'isNull', 'isNotNull',
|
|
9
|
+
]);
|
|
7
10
|
const AGGREGATIONS_V1 = new Set([
|
|
8
11
|
'sum', 'count', 'countDistinct', 'avg', 'min', 'max',
|
|
9
12
|
'argMax', 'argMin', 'percentile', 'stddev', 'variance',
|
|
@@ -149,10 +152,21 @@ function validateExpression(input, path, depth, state) {
|
|
|
149
152
|
});
|
|
150
153
|
}
|
|
151
154
|
case 'comparison': {
|
|
152
|
-
|
|
155
|
+
// A null check tests `left` alone (RFC 0023); a right-hand value is refused.
|
|
156
|
+
const nullCheck = isProtocolNullCheckOperator(value.operator);
|
|
157
|
+
if (nullCheck && Object.hasOwn(value, 'right'))
|
|
158
|
+
expressionError('HQ_EXPRESSION_INVALID_ARITY', `${path}.right`);
|
|
159
|
+
exactFields(value, nullCheck ? ['kind', 'operator', 'left'] : ['kind', 'operator', 'left', 'right'], [], path);
|
|
153
160
|
const operator = stringValue(value.operator, `${path}.operator`);
|
|
154
161
|
if (!COMPARISONS.has(operator))
|
|
155
162
|
expressionError('HQ_EXPRESSION_INVALID_OPERATOR', `${path}.operator`);
|
|
163
|
+
if (nullCheck) {
|
|
164
|
+
return freezeRecord({
|
|
165
|
+
kind,
|
|
166
|
+
operator,
|
|
167
|
+
left: validateExpression(value.left, `${path}.left`, depth + 1, state),
|
|
168
|
+
});
|
|
169
|
+
}
|
|
156
170
|
const left = validateExpression(value.left, `${path}.left`, depth + 1, state);
|
|
157
171
|
const right = validateExpression(value.right, `${path}.right`, depth + 1, state);
|
|
158
172
|
validateComparisonOperands(operator, right, `${path}.right`);
|
package/dist/index.d.ts
CHANGED
|
@@ -3,10 +3,10 @@ export type { ArrayTaggedValue, BytesTaggedValue, CanonicalValue, CanonicalValue
|
|
|
3
3
|
export { PROTOCOL_IDENTIFIER_LIMITS, ProtocolIdentifierError, isProtocolIdentifier, isProtocolQualifiedIdentifier, joinProtocolQualifiedIdentifier, parseProtocolIdentifier, parseProtocolQualifiedIdentifier, splitProtocolQualifiedIdentifier, } from './identifiers/index.js';
|
|
4
4
|
export { PROTOCOL_CACHE_KEY_LIMITS, ProtocolCacheKeyError, deriveProtocolCacheKey, deriveProtocolCacheNamespaceToken, } from './cache-keys/index.js';
|
|
5
5
|
export { ProtocolCachePreimageError, buildProtocolCachePreimage, deriveProtocolTenantFingerprint, } from './cache-preimages/index.js';
|
|
6
|
-
export { DEFAULT_PROTOCOL_EXPRESSION_LIMITS, ProtocolExpressionError, validateProtocolExpression, validateProtocolSemanticQuery, } from './expressions/index.js';
|
|
6
|
+
export { DEFAULT_PROTOCOL_EXPRESSION_LIMITS, PROTOCOL_NULL_CHECK_OPERATORS, ProtocolExpressionError, isProtocolNullCheckOperator, validateProtocolExpression, validateProtocolSemanticQuery, } from './expressions/index.js';
|
|
7
7
|
export { DEFAULT_PROTOCOL_SCHEMA_LIMITS, DEFAULT_PROTOCOL_SCHEMA_VALUE_LIMITS, ProtocolSchemaError, ProtocolSchemaValueError, applyProtocolSchemaValue, createProtocolSchemaValueParser, resolveProtocolSchemaValueLimits, validateProtocolSchema, } from './schemas/index.js';
|
|
8
8
|
export type { ProtocolSchema, ProtocolSchemaErrorCode, ProtocolSchemaLimits, ProtocolSchemaOptions, ProtocolSchemaValueLimits, ProtocolSchemaValueOptions, ProtocolSchemaValueParser, } from './schemas/index.js';
|
|
9
|
-
export type { ProtocolAggregation, ProtocolBinaryOperator, ProtocolComparisonOperator, ProtocolDatasetQuery, ProtocolExpression, ProtocolExpressionErrorCode, ProtocolExpressionExtension, ProtocolExpressionLimits, ProtocolExpressionOptions, ProtocolFunctionName, ProtocolMetricQuery, ProtocolOrderBy, ProtocolSemanticQuery, ProtocolQueryTimeGrain, ProtocolTimeGrain, } from './expressions/index.js';
|
|
9
|
+
export type { ProtocolAggregation, ProtocolBinaryOperator, ProtocolComparisonOperator, ProtocolDatasetQuery, ProtocolExpression, ProtocolExpressionErrorCode, ProtocolExpressionExtension, ProtocolExpressionLimits, ProtocolExpressionOptions, ProtocolFunctionName, ProtocolMetricQuery, ProtocolNullCheckOperator, ProtocolOrderBy, ProtocolSemanticQuery, ProtocolQueryTimeGrain, ProtocolTimeGrain, ProtocolValueComparisonOperator, } from './expressions/index.js';
|
|
10
10
|
export type { DeriveProtocolCacheKeyOptions, ProtocolCacheKeyErrorCode, ProtocolCacheKeyNamespace, } from './cache-keys/index.js';
|
|
11
11
|
export type { BuildProtocolCachePreimageOptions, ProtocolCachePreimageErrorCode, ProtocolCacheTenantScope, } from './cache-preimages/index.js';
|
|
12
12
|
export type { ProtocolIdentifier, ProtocolIdentifierErrorCode, ProtocolQualifiedIdentifier, } from './identifiers/index.js';
|
|
@@ -27,4 +27,5 @@ export * from './client-contract/index.js';
|
|
|
27
27
|
export { PROTOCOL_FIELD_VISIBILITY_LIMITS, ProtocolFieldVisibilityError, resolveProtocolVisibleDatasetFields, validateProtocolFieldVisibility, } from './visibility/index.js';
|
|
28
28
|
export type { ProtocolDatasetVisibility, ProtocolFieldVisibility, ProtocolFieldVisibilityErrorCode, ProtocolVisibleDatasetFields, ProtocolVisibleFields, } from './visibility/index.js';
|
|
29
29
|
export { validateProtocolRowResolution } from './deployments/row-resolution.js';
|
|
30
|
+
export { PROTOCOL_AGGREGATE_STATE_FUNCTIONS, PROTOCOL_APPROXIMATE_STATE_FUNCTIONS, isApproximateStateFunction, isProtocolAggregateStateFunction, type ProtocolAggregateStateFunction, } from './deployments/aggregate-states.js';
|
|
30
31
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,4BAA4B,EAC5B,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,WAAW,EACX,gBAAgB,EAChB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,oBAAoB,EACpB,6BAA6B,EAC7B,+BAA+B,EAC/B,uBAAuB,EACvB,gCAAgC,EAChC,gCAAgC,GACjC,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,iCAAiC,GAClC,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,+BAA+B,GAChC,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,kCAAkC,EAClC,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,8BAA8B,EAC9B,oCAAoC,EACpC,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,+BAA+B,EAC/B,gCAAgC,EAChC,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,cAAc,EACd,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,kBAAkB,EAClB,2BAA2B,EAC3B,2BAA2B,EAC3B,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ export { DEFAULT_CANONICAL_VALUE_LIMITS, ProtocolValueError, decodeCanonicalValu
|
|
|
2
2
|
export { PROTOCOL_IDENTIFIER_LIMITS, ProtocolIdentifierError, isProtocolIdentifier, isProtocolQualifiedIdentifier, joinProtocolQualifiedIdentifier, parseProtocolIdentifier, parseProtocolQualifiedIdentifier, splitProtocolQualifiedIdentifier, } from './identifiers/index.js';
|
|
3
3
|
export { PROTOCOL_CACHE_KEY_LIMITS, ProtocolCacheKeyError, deriveProtocolCacheKey, deriveProtocolCacheNamespaceToken, } from './cache-keys/index.js';
|
|
4
4
|
export { ProtocolCachePreimageError, buildProtocolCachePreimage, deriveProtocolTenantFingerprint, } from './cache-preimages/index.js';
|
|
5
|
-
export { DEFAULT_PROTOCOL_EXPRESSION_LIMITS, ProtocolExpressionError, validateProtocolExpression, validateProtocolSemanticQuery, } from './expressions/index.js';
|
|
5
|
+
export { DEFAULT_PROTOCOL_EXPRESSION_LIMITS, PROTOCOL_NULL_CHECK_OPERATORS, ProtocolExpressionError, isProtocolNullCheckOperator, validateProtocolExpression, validateProtocolSemanticQuery, } from './expressions/index.js';
|
|
6
6
|
export { DEFAULT_PROTOCOL_SCHEMA_LIMITS, DEFAULT_PROTOCOL_SCHEMA_VALUE_LIMITS, ProtocolSchemaError, ProtocolSchemaValueError, applyProtocolSchemaValue, createProtocolSchemaValueParser, resolveProtocolSchemaValueLimits, validateProtocolSchema, } from './schemas/index.js';
|
|
7
7
|
export { DEFAULT_PROTOCOL_QUERY_IMPLEMENTATION_LIMITS, ProtocolQueryImplementationError, validateProtocolQueryImplementation, validateProtocolSqlExpression, } from './query-implementations/index.js';
|
|
8
8
|
export { DEFAULT_PROTOCOL_QUERY_EVENT_LIMITS, ProtocolQueryDiagnosticsError, ProtocolQueryEventError, validateProtocolQueryDiagnostics, validateProtocolQueryEvent, } from './events/index.js';
|
|
@@ -14,3 +14,4 @@ export { PROTOCOL_SEMANTIC_FAILURE_MESSAGES } from './invocations/failure-messag
|
|
|
14
14
|
export * from './client-contract/index.js';
|
|
15
15
|
export { PROTOCOL_FIELD_VISIBILITY_LIMITS, ProtocolFieldVisibilityError, resolveProtocolVisibleDatasetFields, validateProtocolFieldVisibility, } from './visibility/index.js';
|
|
16
16
|
export { validateProtocolRowResolution } from './deployments/row-resolution.js';
|
|
17
|
+
export { PROTOCOL_AGGREGATE_STATE_FUNCTIONS, PROTOCOL_APPROXIMATE_STATE_FUNCTIONS, isApproximateStateFunction, isProtocolAggregateStateFunction, } from './deployments/aggregate-states.js';
|