@hypequery/datasets 0.1.0 → 0.2.1
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 +498 -0
- package/dist/api.type-test.d.ts +2 -0
- package/dist/api.type-test.d.ts.map +1 -0
- package/dist/api.type-test.js +103 -0
- package/dist/catalog.d.ts +68 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +105 -0
- package/dist/constants.d.ts +13 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +26 -0
- package/dist/dataset-query.d.ts +16 -0
- package/dist/dataset-query.d.ts.map +1 -0
- package/dist/dataset-query.js +56 -0
- package/dist/dataset.d.ts +1 -1
- package/dist/dataset.d.ts.map +1 -1
- package/dist/dataset.js +22 -157
- package/dist/executor.d.ts +42 -14
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +188 -36
- package/dist/formulas.d.ts +1 -1
- package/dist/formulas.d.ts.map +1 -1
- package/dist/formulas.js +27 -12
- package/dist/in-memory-backend.d.ts +5 -0
- package/dist/in-memory-backend.d.ts.map +1 -0
- package/dist/in-memory-backend.js +221 -0
- package/dist/index.d.ts +11 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -5
- package/dist/internal.d.ts +23 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +19 -0
- package/dist/measure.d.ts.map +1 -1
- package/dist/measure.js +1 -0
- package/dist/query-builder-protocol.d.ts +2 -2
- package/dist/query-builder-protocol.d.ts.map +1 -1
- package/dist/query-builder-protocol.js +1 -1
- package/dist/query-helpers.d.ts +12 -12
- package/dist/query-helpers.d.ts.map +1 -1
- package/dist/query-planner.d.ts +9 -7
- package/dist/query-planner.d.ts.map +1 -1
- package/dist/query-planner.js +26 -9
- package/dist/registry.d.ts +1 -1
- package/dist/registry.js +1 -1
- package/dist/relationships.d.ts +1 -1
- package/dist/relationships.js +1 -1
- package/dist/semantic-plan.d.ts +82 -0
- package/dist/semantic-plan.d.ts.map +1 -0
- package/dist/semantic-plan.js +1 -0
- package/dist/semantic-planner.d.ts +5 -0
- package/dist/semantic-planner.d.ts.map +1 -0
- package/dist/semantic-planner.js +155 -0
- package/dist/sql-utils.d.ts +1 -1
- package/dist/sql-utils.js +4 -4
- package/dist/tools.d.ts +53 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +322 -0
- package/dist/types.d.ts +130 -52
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/dataset-contract.d.ts +3 -0
- package/dist/utils/dataset-contract.d.ts.map +1 -0
- package/dist/utils/dataset-contract.js +30 -0
- package/dist/utils/dataset-metric-ref.d.ts +9 -0
- package/dist/utils/dataset-metric-ref.d.ts.map +1 -0
- package/dist/utils/dataset-metric-ref.js +39 -0
- package/dist/utils/dataset-normalization.d.ts +10 -0
- package/dist/utils/dataset-normalization.d.ts.map +1 -0
- package/dist/utils/dataset-normalization.js +35 -0
- package/dist/utils/dataset-query-validation.d.ts +4 -0
- package/dist/utils/dataset-query-validation.d.ts.map +1 -0
- package/dist/utils/dataset-query-validation.js +96 -0
- package/dist/utils/dataset-validation.d.ts +6 -0
- package/dist/utils/dataset-validation.d.ts.map +1 -0
- package/dist/utils/dataset-validation.js +42 -0
- package/dist/utils/derived-cte-validation.d.ts +3 -0
- package/dist/utils/derived-cte-validation.d.ts.map +1 -0
- package/dist/utils/derived-cte-validation.js +32 -0
- package/dist/utils/filtered-aggregation-sql.d.ts +5 -0
- package/dist/utils/filtered-aggregation-sql.d.ts.map +1 -0
- package/dist/utils/filtered-aggregation-sql.js +73 -0
- package/dist/utils/metric-handle.d.ts +11 -0
- package/dist/utils/metric-handle.d.ts.map +1 -0
- package/dist/utils/metric-handle.js +36 -0
- package/dist/utils/pagination.d.ts +17 -0
- package/dist/utils/pagination.d.ts.map +1 -0
- package/dist/utils/pagination.js +23 -0
- package/dist/utils/tenant-runtime.d.ts +14 -0
- package/dist/utils/tenant-runtime.d.ts.map +1 -0
- package/dist/utils/tenant-runtime.js +36 -0
- package/package.json +14 -2
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { QueryBuilderFactoryLike } from './query-builder-protocol.js';
|
|
2
|
+
import type { SemanticExpression } from './semantic-plan.js';
|
|
2
3
|
export type FieldType = 'string' | 'number' | 'boolean' | 'timestamp';
|
|
3
4
|
export type DimensionType = FieldType;
|
|
4
5
|
export interface DimensionOptions {
|
|
@@ -37,11 +38,14 @@ export interface AggregationSpec {
|
|
|
37
38
|
__type: 'aggregation_spec';
|
|
38
39
|
aggregation: AggregationType;
|
|
39
40
|
field: string;
|
|
41
|
+
sql?: string;
|
|
42
|
+
filters?: MetricFilter[];
|
|
40
43
|
}
|
|
41
44
|
export interface MeasureOptions {
|
|
42
45
|
sql?: string;
|
|
43
46
|
label?: string;
|
|
44
47
|
description?: string;
|
|
48
|
+
filters?: MetricFilter[];
|
|
45
49
|
}
|
|
46
50
|
export interface MeasureDefinition {
|
|
47
51
|
__type: 'measure_definition';
|
|
@@ -50,34 +54,44 @@ export interface MeasureDefinition {
|
|
|
50
54
|
sql?: string;
|
|
51
55
|
label?: string;
|
|
52
56
|
description?: string;
|
|
57
|
+
filters?: MetricFilter[];
|
|
53
58
|
}
|
|
54
59
|
export type FormulaExpr = {
|
|
55
60
|
__type: 'formula_expr';
|
|
61
|
+
expression: SemanticExpression;
|
|
56
62
|
toSQL: () => string;
|
|
57
63
|
};
|
|
58
|
-
export interface
|
|
64
|
+
export interface DerivedMetricSpec<TDatasetName extends string = string> {
|
|
65
|
+
__type: 'derived_metric_spec';
|
|
66
|
+
uses: Record<string, BaseMetricRef<TDatasetName>>;
|
|
67
|
+
formula: (inputs: Record<string, string>) => FormulaExpr;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The wide dataset instance used as the default `TDataset` for a metric ref.
|
|
71
|
+
* Refs created via `DatasetInstance.metric()` carry their dataset's concrete
|
|
72
|
+
* dimension/measure types instead, enabling field-level typing downstream.
|
|
73
|
+
*/
|
|
74
|
+
export type DefaultMetricDataset<TDatasetName extends string = string> = DatasetInstance<Record<string, DimensionDefinition>, Record<string, MeasureDefinition>, Record<string, RelationshipDefinition>, TDatasetName>;
|
|
75
|
+
export interface MetricRef<TDatasetName extends string = string, TMetricName extends string = string, TSpec extends AggregationSpec | DerivedMetricSpec<TDatasetName> = AggregationSpec | DerivedMetricSpec<TDatasetName>, TDataset extends DatasetInstance<any, any, any, TDatasetName> = DefaultMetricDataset<TDatasetName>> {
|
|
59
76
|
__type: 'metric_ref';
|
|
60
77
|
datasetName: TDatasetName;
|
|
61
78
|
name: TMetricName;
|
|
62
|
-
spec:
|
|
79
|
+
spec: TSpec;
|
|
63
80
|
label?: string;
|
|
64
81
|
description?: string;
|
|
65
|
-
dataset:
|
|
66
|
-
by(grain: TimeGrain): GrainedMetricRef<TDatasetName, TMetricName>;
|
|
82
|
+
dataset: TDataset;
|
|
83
|
+
by(grain: TimeGrain): GrainedMetricRef<TDatasetName, TMetricName, TSpec, TDataset>;
|
|
67
84
|
contract(): MetricContract;
|
|
68
85
|
}
|
|
69
|
-
export
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
formula: (inputs: Record<string, string>) => FormulaExpr;
|
|
73
|
-
}
|
|
74
|
-
export interface GrainedMetricRef<TDatasetName extends string = string, TMetricName extends string = string> {
|
|
86
|
+
export type BaseMetricRef<TDatasetName extends string = string, TMetricName extends string = string, TDataset extends DatasetInstance<any, any, any, TDatasetName> = DefaultMetricDataset<TDatasetName>> = MetricRef<TDatasetName, TMetricName, AggregationSpec, TDataset>;
|
|
87
|
+
export type DerivedMetricRef<TDatasetName extends string = string, TMetricName extends string = string, TDataset extends DatasetInstance<any, any, any, TDatasetName> = DefaultMetricDataset<TDatasetName>> = MetricRef<TDatasetName, TMetricName, DerivedMetricSpec<TDatasetName>, TDataset>;
|
|
88
|
+
export interface GrainedMetricRef<TDatasetName extends string = string, TMetricName extends string = string, TSpec extends AggregationSpec | DerivedMetricSpec<TDatasetName> = AggregationSpec | DerivedMetricSpec<TDatasetName>, TDataset extends DatasetInstance<any, any, any, TDatasetName> = DefaultMetricDataset<TDatasetName>> {
|
|
75
89
|
__type: 'grained_metric_ref';
|
|
76
|
-
metric: MetricRef<TDatasetName, TMetricName>;
|
|
90
|
+
metric: MetricRef<TDatasetName, TMetricName, TSpec, TDataset>;
|
|
77
91
|
grain: TimeGrain;
|
|
78
92
|
contract(): MetricContract;
|
|
79
93
|
}
|
|
80
|
-
export type MetricHandle<TDatasetName extends string = string, TMetricName extends string = string> = MetricRef<TDatasetName, TMetricName> | GrainedMetricRef<TDatasetName, TMetricName>;
|
|
94
|
+
export type MetricHandle<TDatasetName extends string = string, TMetricName extends string = string, TSpec extends AggregationSpec | DerivedMetricSpec<TDatasetName> = AggregationSpec | DerivedMetricSpec<TDatasetName>, TDataset extends DatasetInstance<any, any, any, TDatasetName> = DefaultMetricDataset<TDatasetName>> = MetricRef<TDatasetName, TMetricName, TSpec, TDataset> | GrainedMetricRef<TDatasetName, TMetricName, TSpec, TDataset>;
|
|
81
95
|
export type TimeGrain = 'day' | 'week' | 'month' | 'quarter' | 'year';
|
|
82
96
|
export interface MetricContract {
|
|
83
97
|
kind: 'metric' | 'derived_metric' | 'grained_metric';
|
|
@@ -94,13 +108,13 @@ export interface MetricContract {
|
|
|
94
108
|
requires?: string[];
|
|
95
109
|
tenantScoped: boolean;
|
|
96
110
|
}
|
|
97
|
-
export interface MetricFilter {
|
|
98
|
-
field:
|
|
111
|
+
export interface MetricFilter<TField extends string = string, TValue = unknown> {
|
|
112
|
+
field: TField;
|
|
99
113
|
operator: 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'notIn' | 'between' | 'like';
|
|
100
|
-
value:
|
|
114
|
+
value: TValue;
|
|
101
115
|
}
|
|
102
|
-
export interface MetricOrderBy {
|
|
103
|
-
field:
|
|
116
|
+
export interface MetricOrderBy<TField extends string = string> {
|
|
117
|
+
field: TField;
|
|
104
118
|
direction: 'asc' | 'desc';
|
|
105
119
|
}
|
|
106
120
|
export interface MetricQuery {
|
|
@@ -111,20 +125,47 @@ export interface MetricQuery {
|
|
|
111
125
|
offset?: number;
|
|
112
126
|
by?: TimeGrain;
|
|
113
127
|
}
|
|
128
|
+
export interface DatasetQuery {
|
|
129
|
+
dimensions?: string[];
|
|
130
|
+
measures?: string[];
|
|
131
|
+
filters?: MetricFilter[];
|
|
132
|
+
orderBy?: MetricOrderBy[];
|
|
133
|
+
limit?: number;
|
|
134
|
+
offset?: number;
|
|
135
|
+
by?: TimeGrain;
|
|
136
|
+
}
|
|
114
137
|
export interface MetricResultMeta {
|
|
115
138
|
timingMs?: number;
|
|
116
139
|
sql?: string;
|
|
117
140
|
tenant?: string;
|
|
141
|
+
/** Number of rows returned in `data`. */
|
|
142
|
+
rowCount?: number;
|
|
143
|
+
/**
|
|
144
|
+
* Offset pagination state. Present when the query specified a `limit`.
|
|
145
|
+
* `hasMore` is derived by over-fetching one row, so it is exact without a
|
|
146
|
+
* separate count query.
|
|
147
|
+
*/
|
|
148
|
+
pagination?: {
|
|
149
|
+
limit: number;
|
|
150
|
+
offset: number;
|
|
151
|
+
hasMore: boolean;
|
|
152
|
+
};
|
|
118
153
|
}
|
|
119
154
|
export interface MetricResult<T = Record<string, unknown>> {
|
|
120
155
|
data: T[];
|
|
121
156
|
meta?: MetricResultMeta;
|
|
122
157
|
}
|
|
123
|
-
export interface
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
handledByBuilder: boolean;
|
|
158
|
+
export interface DatasetQueryResult<T = Record<string, unknown>> {
|
|
159
|
+
data: T[];
|
|
160
|
+
meta?: MetricResultMeta;
|
|
127
161
|
}
|
|
162
|
+
export type SemanticTenantRuntime = string | {
|
|
163
|
+
id: string;
|
|
164
|
+
} | {
|
|
165
|
+
in: string[];
|
|
166
|
+
} | {
|
|
167
|
+
scope: 'all';
|
|
168
|
+
};
|
|
128
169
|
export interface SemanticExecutionRuntime {
|
|
129
170
|
builderFactory?: QueryBuilderFactoryLike;
|
|
130
171
|
tenant?: SemanticTenantRuntime;
|
|
@@ -146,40 +187,17 @@ export interface DatasetLimits {
|
|
|
146
187
|
maxFilters?: number;
|
|
147
188
|
maxResultSize?: number;
|
|
148
189
|
}
|
|
149
|
-
export interface BaseMetricConfig<
|
|
190
|
+
export interface BaseMetricConfig<TMeasures extends Record<string, MeasureDefinition> = Record<string, MeasureDefinition>> {
|
|
150
191
|
measure: keyof TMeasures & string;
|
|
151
192
|
label?: string;
|
|
152
193
|
description?: string;
|
|
153
194
|
}
|
|
154
|
-
export interface DerivedMetricConfig {
|
|
155
|
-
uses: Record<string,
|
|
195
|
+
export interface DerivedMetricConfig<TDatasetName extends string = string> {
|
|
196
|
+
uses: Record<string, BaseMetricRef<TDatasetName>>;
|
|
156
197
|
formula: (inputs: Record<string, string>) => FormulaExpr;
|
|
157
198
|
label?: string;
|
|
158
199
|
description?: string;
|
|
159
200
|
}
|
|
160
|
-
export interface DatasetQueryConfig<TDimensions extends Record<string, DimensionDefinition> = Record<string, DimensionDefinition>, TMeasures extends Record<string, MeasureDefinition> = Record<string, MeasureDefinition>> {
|
|
161
|
-
dimensions?: Array<keyof TDimensions & string>;
|
|
162
|
-
measures?: Array<keyof TMeasures & string>;
|
|
163
|
-
filters?: MetricFilter[];
|
|
164
|
-
orderBy?: MetricOrderBy[];
|
|
165
|
-
limit?: number;
|
|
166
|
-
offset?: number;
|
|
167
|
-
by?: TimeGrain;
|
|
168
|
-
}
|
|
169
|
-
export interface DatasetQueryContract {
|
|
170
|
-
dataset: string;
|
|
171
|
-
dimensions: string[];
|
|
172
|
-
measures: string[];
|
|
173
|
-
filters: string[];
|
|
174
|
-
grains: TimeGrain[];
|
|
175
|
-
tenantScoped: boolean;
|
|
176
|
-
}
|
|
177
|
-
export interface DatasetQueryRef<TDimensions extends Record<string, DimensionDefinition> = Record<string, DimensionDefinition>, TMeasures extends Record<string, MeasureDefinition> = Record<string, MeasureDefinition>> {
|
|
178
|
-
__type: 'dataset_query_ref';
|
|
179
|
-
dataset: DatasetInstance<TDimensions, TMeasures, any>;
|
|
180
|
-
config: DatasetQueryConfig<TDimensions, TMeasures>;
|
|
181
|
-
contract(): DatasetQueryContract;
|
|
182
|
-
}
|
|
183
201
|
export interface DatasetConfig<TDimensions extends Record<string, DimensionDefinition> = Record<string, DimensionDefinition>, TMeasures extends Record<string, MeasureDefinition> = Record<string, MeasureDefinition>, TRelationships extends Record<string, RelationshipDefinition> = Record<string, never>> {
|
|
184
202
|
source: string;
|
|
185
203
|
tenantKey?: string;
|
|
@@ -190,9 +208,9 @@ export interface DatasetConfig<TDimensions extends Record<string, DimensionDefin
|
|
|
190
208
|
relationships?: TRelationships;
|
|
191
209
|
limits?: DatasetLimits;
|
|
192
210
|
}
|
|
193
|
-
export interface DatasetInstance<TDimensions extends Record<string, DimensionDefinition> = Record<string, DimensionDefinition>, TMeasures extends Record<string, MeasureDefinition> = Record<string, MeasureDefinition>, TRelationships extends Record<string, RelationshipDefinition> = Record<string, never
|
|
211
|
+
export interface DatasetInstance<TDimensions extends Record<string, DimensionDefinition> = Record<string, DimensionDefinition>, TMeasures extends Record<string, MeasureDefinition> = Record<string, MeasureDefinition>, TRelationships extends Record<string, RelationshipDefinition> = Record<string, never>, TDatasetName extends string = string> {
|
|
194
212
|
__type: 'dataset';
|
|
195
|
-
name:
|
|
213
|
+
name: TDatasetName;
|
|
196
214
|
source: string;
|
|
197
215
|
tenantKey?: string;
|
|
198
216
|
timeKey?: string;
|
|
@@ -201,8 +219,8 @@ export interface DatasetInstance<TDimensions extends Record<string, DimensionDef
|
|
|
201
219
|
filters: SemanticFiltersDefinition;
|
|
202
220
|
relationships: TRelationships;
|
|
203
221
|
limits?: DatasetLimits;
|
|
204
|
-
metric<TName extends string>(metricName: TName, metricConfig: BaseMetricConfig<
|
|
205
|
-
|
|
222
|
+
metric<TName extends string>(metricName: TName, metricConfig: BaseMetricConfig<TMeasures>): BaseMetricRef<TDatasetName, TName, DatasetInstance<TDimensions, TMeasures, TRelationships, TDatasetName>>;
|
|
223
|
+
metric<TName extends string>(metricName: TName, metricConfig: DerivedMetricConfig<TDatasetName>): DerivedMetricRef<TDatasetName, TName, DatasetInstance<TDimensions, TMeasures, TRelationships, TDatasetName>>;
|
|
206
224
|
}
|
|
207
225
|
export interface DatasetRegistryInstance {
|
|
208
226
|
register(ds: DatasetInstance): void;
|
|
@@ -210,5 +228,65 @@ export interface DatasetRegistryInstance {
|
|
|
210
228
|
getAll(): DatasetInstance[];
|
|
211
229
|
has(name: string): boolean;
|
|
212
230
|
}
|
|
213
|
-
export type
|
|
231
|
+
export type AnyDatasetInstance = DatasetInstance<Record<string, DimensionDefinition>, Record<string, MeasureDefinition>, Record<string, RelationshipDefinition>, string>;
|
|
232
|
+
export type DatasetFieldNames<TDataset extends DatasetInstance<any, any, any, any>> = keyof TDataset['dimensions'] & string;
|
|
233
|
+
type NonNeverStringKeys<T extends Record<string, unknown>> = {
|
|
234
|
+
[K in keyof T]: [T[K]] extends [never] ? never : K;
|
|
235
|
+
}[keyof T] & string;
|
|
236
|
+
/** Dimension names declared by a dataset. */
|
|
237
|
+
export type DatasetDimensionNames<TDataset extends DatasetInstance<any, any, any, any>> = NonNeverStringKeys<TDataset['dimensions']>;
|
|
238
|
+
/** Measure names declared by a dataset. */
|
|
239
|
+
export type DatasetMeasureNames<TDataset extends DatasetInstance<any, any, any, any>> = NonNeverStringKeys<TDataset['measures']>;
|
|
240
|
+
/**
|
|
241
|
+
* Fields a result can be ordered by. This is the selection-independent superset
|
|
242
|
+
* (every dimension + measure, plus the synthetic `period` column for grained
|
|
243
|
+
* queries); the runtime validator additionally requires the field to be selected.
|
|
244
|
+
*/
|
|
245
|
+
export type DatasetOrderableNames<TDataset extends DatasetInstance<any, any, any, any>> = DatasetDimensionNames<TDataset> | DatasetMeasureNames<TDataset> | 'period';
|
|
246
|
+
/** A dataset query whose fields are constrained to the dataset's contract. */
|
|
247
|
+
export interface DatasetQueryFor<TDataset extends DatasetInstance<any, any, any, any>> {
|
|
248
|
+
dimensions?: DatasetDimensionNames<TDataset>[];
|
|
249
|
+
measures?: DatasetMeasureNames<TDataset>[];
|
|
250
|
+
filters?: MetricFilter[];
|
|
251
|
+
orderBy?: MetricOrderBy<DatasetOrderableNames<TDataset>>[];
|
|
252
|
+
limit?: number;
|
|
253
|
+
offset?: number;
|
|
254
|
+
by?: TimeGrain;
|
|
255
|
+
includeMeta?: boolean;
|
|
256
|
+
}
|
|
257
|
+
/** A best-effort typed result row for a dataset query. */
|
|
258
|
+
export type DatasetRow<TDataset extends DatasetInstance<any, any, any, any>> = {
|
|
259
|
+
[K in DatasetDimensionNames<TDataset>]?: InferDimensionType<TDataset['dimensions'][K]>;
|
|
260
|
+
} & {
|
|
261
|
+
[K in DatasetMeasureNames<TDataset>]?: number;
|
|
262
|
+
} & {
|
|
263
|
+
period?: string;
|
|
264
|
+
};
|
|
265
|
+
export interface DatasetQueryResultFor<TDataset extends DatasetInstance<any, any, any, any>> {
|
|
266
|
+
data: DatasetRow<TDataset>[];
|
|
267
|
+
meta?: MetricResultMeta;
|
|
268
|
+
}
|
|
269
|
+
/** A metric query whose fields are constrained to the metric's dataset + value column. */
|
|
270
|
+
export interface MetricQueryFor<TDataset extends DatasetInstance<any, any, any, any>, TMetricName extends string> {
|
|
271
|
+
dimensions?: DatasetDimensionNames<TDataset>[];
|
|
272
|
+
filters?: MetricFilter[];
|
|
273
|
+
orderBy?: MetricOrderBy<DatasetDimensionNames<TDataset> | TMetricName | 'period'>[];
|
|
274
|
+
limit?: number;
|
|
275
|
+
offset?: number;
|
|
276
|
+
by?: TimeGrain;
|
|
277
|
+
includeMeta?: boolean;
|
|
278
|
+
}
|
|
279
|
+
/** A best-effort typed result row for a metric query (dimensions + the metric value). */
|
|
280
|
+
export type MetricRow<TDataset extends DatasetInstance<any, any, any, any>, TMetricName extends string> = {
|
|
281
|
+
[K in DatasetDimensionNames<TDataset>]?: InferDimensionType<TDataset['dimensions'][K]>;
|
|
282
|
+
} & {
|
|
283
|
+
[K in TMetricName]?: number;
|
|
284
|
+
} & {
|
|
285
|
+
period?: string;
|
|
286
|
+
};
|
|
287
|
+
export interface MetricResultFor<TDataset extends DatasetInstance<any, any, any, any>, TMetricName extends string> {
|
|
288
|
+
data: MetricRow<TDataset, TMetricName>[];
|
|
289
|
+
meta?: MetricResultMeta;
|
|
290
|
+
}
|
|
291
|
+
export {};
|
|
214
292
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { AggregationSpec, AnyDatasetInstance, DerivedMetricSpec, MetricContract, TimeGrain } from '../types.js';
|
|
2
|
+
export declare function buildMetricContract(metricName: string, ds: AnyDatasetInstance, spec: AggregationSpec | DerivedMetricSpec, label?: string, description?: string, grain?: TimeGrain): MetricContract;
|
|
3
|
+
//# sourceMappingURL=dataset-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataset-contract.d.ts","sourceRoot":"","sources":["../../src/utils/dataset-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,SAAS,EACV,MAAM,aAAa,CAAC;AAIrB,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,kBAAkB,EACtB,IAAI,EAAE,eAAe,GAAG,iBAAiB,EACzC,KAAK,CAAC,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,SAAS,GAChB,cAAc,CA6BhB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const ALL_GRAINS = ['day', 'week', 'month', 'quarter', 'year'];
|
|
2
|
+
export function buildMetricContract(metricName, ds, spec, label, description, grain) {
|
|
3
|
+
const dimensionNames = Object.keys(ds.dimensions);
|
|
4
|
+
const measureNames = Object.keys(ds.measures);
|
|
5
|
+
const filterNames = Object.keys(ds.filters).length > 0
|
|
6
|
+
? Object.keys(ds.filters)
|
|
7
|
+
: dimensionNames.filter(name => ds.dimensions[name]?.filterable !== false);
|
|
8
|
+
const kind = grain
|
|
9
|
+
? 'grained_metric'
|
|
10
|
+
: spec.__type === 'derived_metric_spec'
|
|
11
|
+
? 'derived_metric'
|
|
12
|
+
: 'metric';
|
|
13
|
+
return {
|
|
14
|
+
kind,
|
|
15
|
+
name: metricName,
|
|
16
|
+
dataset: ds.name,
|
|
17
|
+
valueType: 'number',
|
|
18
|
+
label,
|
|
19
|
+
description,
|
|
20
|
+
dimensions: dimensionNames,
|
|
21
|
+
measures: measureNames,
|
|
22
|
+
filters: filterNames,
|
|
23
|
+
grains: ds.timeKey ? ALL_GRAINS : [],
|
|
24
|
+
grain,
|
|
25
|
+
requires: spec.__type === 'derived_metric_spec'
|
|
26
|
+
? Object.keys(spec.uses)
|
|
27
|
+
: undefined,
|
|
28
|
+
tenantScoped: !!ds.tenantKey,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AggregationSpec, BaseMetricConfig, BaseMetricRef, DatasetInstance, DerivedMetricConfig, DerivedMetricRef, DerivedMetricSpec, DimensionDefinition, MeasureDefinition, MetricRef, RelationshipDefinition } from '../types.js';
|
|
2
|
+
type AnyDimensions = Record<string, DimensionDefinition>;
|
|
3
|
+
type AnyMeasures = Record<string, MeasureDefinition>;
|
|
4
|
+
type AnyRelationships = Record<string, RelationshipDefinition>;
|
|
5
|
+
export declare function isDerivedMetricConfig<TMeasures extends Record<string, MeasureDefinition>, TDatasetName extends string>(config: BaseMetricConfig<TMeasures> | DerivedMetricConfig<TDatasetName>): config is DerivedMetricConfig<TDatasetName>;
|
|
6
|
+
export declare function createMetricRef<TDatasetName extends string, TMetricName extends string, TSpec extends AggregationSpec | DerivedMetricSpec<TDatasetName>, TDataset extends DatasetInstance<AnyDimensions, AnyMeasures, AnyRelationships, TDatasetName>>(ds: TDataset, name: TMetricName, spec: TSpec, label?: string, description?: string): MetricRef<TDatasetName, TMetricName, TSpec, TDataset>;
|
|
7
|
+
export declare function createDerivedMetricSpec<TDatasetName extends string>(config: DerivedMetricConfig<TDatasetName>): DerivedMetricSpec<TDatasetName>;
|
|
8
|
+
export type { BaseMetricRef, DerivedMetricRef };
|
|
9
|
+
//# sourceMappingURL=dataset-metric-ref.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataset-metric-ref.d.ts","sourceRoot":"","sources":["../../src/utils/dataset-metric-ref.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EAEnB,iBAAiB,EACjB,SAAS,EACT,sBAAsB,EAEvB,MAAM,aAAa,CAAC;AAGrB,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;AACzD,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AACrD,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;AAE/D,wBAAgB,qBAAqB,CACnC,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACnD,YAAY,SAAS,MAAM,EAE3B,MAAM,EAAE,gBAAgB,CAAC,SAAS,CAAC,GAAG,mBAAmB,CAAC,YAAY,CAAC,GACtE,MAAM,IAAI,mBAAmB,CAAC,YAAY,CAAC,CAE7C;AAED,wBAAgB,eAAe,CAC7B,YAAY,SAAS,MAAM,EAC3B,WAAW,SAAS,MAAM,EAC1B,KAAK,SAAS,eAAe,GAAG,iBAAiB,CAAC,YAAY,CAAC,EAC/D,QAAQ,SAAS,eAAe,CAAC,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,CAAC,EAE5F,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,KAAK,EACX,KAAK,CAAC,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,SAAS,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAiCvD;AAED,wBAAgB,uBAAuB,CAAC,YAAY,SAAS,MAAM,EACjE,MAAM,EAAE,mBAAmB,CAAC,YAAY,CAAC,GACxC,iBAAiB,CAAC,YAAY,CAAC,CAMjC;AAED,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { buildMetricContract } from './dataset-contract.js';
|
|
2
|
+
export function isDerivedMetricConfig(config) {
|
|
3
|
+
return 'uses' in config && 'formula' in config;
|
|
4
|
+
}
|
|
5
|
+
export function createMetricRef(ds, name, spec, label, description) {
|
|
6
|
+
const ref = {
|
|
7
|
+
__type: 'metric_ref',
|
|
8
|
+
datasetName: ds.name,
|
|
9
|
+
name,
|
|
10
|
+
spec,
|
|
11
|
+
label,
|
|
12
|
+
description,
|
|
13
|
+
dataset: ds,
|
|
14
|
+
by(grain) {
|
|
15
|
+
if (!ds.timeKey) {
|
|
16
|
+
throw new Error(`Cannot apply .by("${grain}") to metric "${name}" — dataset "${ds.name}" has no timeKey defined.`);
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
__type: 'grained_metric_ref',
|
|
20
|
+
metric: ref,
|
|
21
|
+
grain,
|
|
22
|
+
contract() {
|
|
23
|
+
return buildMetricContract(name, ds, spec, label, description, grain);
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
},
|
|
27
|
+
contract() {
|
|
28
|
+
return buildMetricContract(name, ds, spec, label, description);
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
return ref;
|
|
32
|
+
}
|
|
33
|
+
export function createDerivedMetricSpec(config) {
|
|
34
|
+
return {
|
|
35
|
+
__type: 'derived_metric_spec',
|
|
36
|
+
uses: config.uses,
|
|
37
|
+
formula: config.formula,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AggregationSpec, DatasetConfig, DimensionDefinition, MeasureDefinition, RelationshipDefinition, SemanticFiltersDefinition } from '../types.js';
|
|
2
|
+
type AnyMeasures = Record<string, MeasureDefinition>;
|
|
3
|
+
type AnyRelationships = Record<string, RelationshipDefinition>;
|
|
4
|
+
export declare function normalizeDimensions<TDimensions extends Record<string, DimensionDefinition>>(config: DatasetConfig<TDimensions, AnyMeasures, AnyRelationships>): TDimensions;
|
|
5
|
+
export declare function normalizeFilters(dimensions: Record<string, DimensionDefinition>, filters?: SemanticFiltersDefinition): SemanticFiltersDefinition;
|
|
6
|
+
export declare function normalizeMeasures<TMeasures extends Record<string, MeasureDefinition>>(measures: TMeasures | undefined): TMeasures;
|
|
7
|
+
export declare function normalizeRelationships<TRelationships extends Record<string, RelationshipDefinition>>(relationships: TRelationships | undefined): TRelationships;
|
|
8
|
+
export declare function measureToAggregationSpec(measureName: string, definition: MeasureDefinition): AggregationSpec;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=dataset-normalization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataset-normalization.d.ts","sourceRoot":"","sources":["../../src/utils/dataset-normalization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,aAAa,CAAC;AAErB,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AACrD,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;AAE/D,wBAAgB,mBAAmB,CAAC,WAAW,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACzF,MAAM,EAAE,aAAa,CAAC,WAAW,EAAE,WAAW,EAAE,gBAAgB,CAAC,GAChE,WAAW,CAEb;AAED,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAC/C,OAAO,CAAC,EAAE,yBAAyB,GAClC,yBAAyB,CAgB3B;AAED,wBAAgB,iBAAiB,CAAC,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACnF,QAAQ,EAAE,SAAS,GAAG,SAAS,GAC9B,SAAS,CAEX;AAED,wBAAgB,sBAAsB,CAAC,cAAc,SAAS,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,EAClG,aAAa,EAAE,cAAc,GAAG,SAAS,GACxC,cAAc,CAEhB;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,iBAAiB,GAC5B,eAAe,CAYjB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export function normalizeDimensions(config) {
|
|
2
|
+
return config.dimensions;
|
|
3
|
+
}
|
|
4
|
+
export function normalizeFilters(dimensions, filters) {
|
|
5
|
+
if (filters) {
|
|
6
|
+
return filters;
|
|
7
|
+
}
|
|
8
|
+
return Object.fromEntries(Object.entries(dimensions)
|
|
9
|
+
.filter(([, definition]) => definition.filterable !== false)
|
|
10
|
+
.map(([name]) => [
|
|
11
|
+
name,
|
|
12
|
+
{
|
|
13
|
+
__type: 'filter_definition',
|
|
14
|
+
field: name,
|
|
15
|
+
},
|
|
16
|
+
]));
|
|
17
|
+
}
|
|
18
|
+
export function normalizeMeasures(measures) {
|
|
19
|
+
return (measures ?? {});
|
|
20
|
+
}
|
|
21
|
+
export function normalizeRelationships(relationships) {
|
|
22
|
+
return (relationships ?? {});
|
|
23
|
+
}
|
|
24
|
+
export function measureToAggregationSpec(measureName, definition) {
|
|
25
|
+
if (!definition.field) {
|
|
26
|
+
throw new Error(`Invalid measure "${measureName}": a backing field is required.`);
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
__type: 'aggregation_spec',
|
|
30
|
+
aggregation: definition.aggregation,
|
|
31
|
+
field: definition.field,
|
|
32
|
+
sql: definition.sql,
|
|
33
|
+
filters: definition.filters,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AnyDatasetInstance, DatasetQuery, ExecutionContext } from '../types.js';
|
|
2
|
+
import { type ValidationResult } from '../validation.js';
|
|
3
|
+
export declare function validateDatasetQueryInput(ds: AnyDatasetInstance, query: DatasetQuery, context?: ExecutionContext): ValidationResult;
|
|
4
|
+
//# sourceMappingURL=dataset-query-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataset-query-validation.d.ts","sourceRoot":"","sources":["../../src/utils/dataset-query-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAO9E,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACzB,gBAAgB,CAmHlB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { validateFilterValue } from '../validation.js';
|
|
2
|
+
import { SUPPORTED_TIME_GRAINS, isSupportedTimeGrain } from '../constants.js';
|
|
3
|
+
import { getRuntimeTenantPredicate, validateTenantRuntime, } from './tenant-runtime.js';
|
|
4
|
+
export function validateDatasetQueryInput(ds, query, context) {
|
|
5
|
+
const errors = [];
|
|
6
|
+
const dimensionNames = Object.keys(ds.dimensions);
|
|
7
|
+
const measureNames = Object.keys(ds.measures);
|
|
8
|
+
const selectedDimensions = query.dimensions ?? [];
|
|
9
|
+
const selectedMeasures = query.measures ?? measureNames;
|
|
10
|
+
const filterNames = Object.keys(ds.filters);
|
|
11
|
+
const orderableFields = new Set([
|
|
12
|
+
...selectedDimensions,
|
|
13
|
+
...selectedMeasures,
|
|
14
|
+
...(query.by ? ['period'] : []),
|
|
15
|
+
]);
|
|
16
|
+
const tenantRuntimeError = validateTenantRuntime(ds, context);
|
|
17
|
+
if (tenantRuntimeError) {
|
|
18
|
+
errors.push(tenantRuntimeError);
|
|
19
|
+
}
|
|
20
|
+
if (selectedDimensions.length === 0 && selectedMeasures.length === 0) {
|
|
21
|
+
errors.push(`Dataset "${ds.name}" query must select at least one dimension or measure.`);
|
|
22
|
+
}
|
|
23
|
+
if (query.dimensions) {
|
|
24
|
+
const invalid = query.dimensions.filter(dimension => !dimensionNames.includes(dimension));
|
|
25
|
+
if (invalid.length > 0) {
|
|
26
|
+
errors.push(`Unknown dimensions: ${invalid.join(', ')}. Available: ${dimensionNames.join(', ')}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (query.measures) {
|
|
30
|
+
const invalid = query.measures.filter(measure => !measureNames.includes(measure));
|
|
31
|
+
if (invalid.length > 0) {
|
|
32
|
+
errors.push(`Unknown measures: ${invalid.join(', ')}. Available: ${measureNames.join(', ')}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (query.filters) {
|
|
36
|
+
const invalid = query.filters.filter(filter => !filterNames.includes(filter.field));
|
|
37
|
+
if (invalid.length > 0) {
|
|
38
|
+
errors.push(`Unknown filter fields: ${invalid.map(filter => filter.field).join(', ')}. Available: ${filterNames.join(', ')}`);
|
|
39
|
+
}
|
|
40
|
+
for (const filter of query.filters) {
|
|
41
|
+
const filterDefinition = ds.filters[filter.field];
|
|
42
|
+
if (filterDefinition?.operators && !filterDefinition.operators.includes(filter.operator)) {
|
|
43
|
+
errors.push(`Filter "${filter.field}" does not allow operator "${filter.operator}". Allowed: ${filterDefinition.operators.join(', ')}`);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const resolvedField = ds.filters[filter.field]?.field ?? filter.field;
|
|
47
|
+
const resolvedDimension = ds.dimensions[resolvedField];
|
|
48
|
+
const resolvedColumn = resolvedDimension?.sql
|
|
49
|
+
? undefined
|
|
50
|
+
: resolvedDimension?.column ?? resolvedField;
|
|
51
|
+
if (getRuntimeTenantPredicate(context) && ds.tenantKey && resolvedColumn === ds.tenantKey) {
|
|
52
|
+
errors.push(`Cannot filter on tenant field "${filter.field}" when runtime tenancy enforcement is active.`);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const fieldType = resolvedDimension?.fieldType;
|
|
56
|
+
if (!fieldType) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const filterError = validateFilterValue(filter, fieldType);
|
|
60
|
+
if (filterError) {
|
|
61
|
+
errors.push(filterError);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (query.orderBy) {
|
|
66
|
+
const invalid = query.orderBy.filter(order => !orderableFields.has(order.field));
|
|
67
|
+
if (invalid.length > 0) {
|
|
68
|
+
errors.push(`Unknown orderBy fields: ${invalid.map(order => order.field).join(', ')}. Available: ${Array.from(orderableFields).join(', ')}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (query.by && !ds.timeKey) {
|
|
72
|
+
errors.push(`Cannot use "by" grain — dataset "${ds.name}" has no timeKey.`);
|
|
73
|
+
}
|
|
74
|
+
if (query.by && !isSupportedTimeGrain(query.by)) {
|
|
75
|
+
errors.push(`Unsupported time grain "${query.by}". Supported: ${SUPPORTED_TIME_GRAINS.join(', ')}`);
|
|
76
|
+
}
|
|
77
|
+
if (query.limit != null && (!Number.isInteger(query.limit) || query.limit < 0)) {
|
|
78
|
+
errors.push(`Invalid limit: expected a non-negative integer.`);
|
|
79
|
+
}
|
|
80
|
+
if (query.offset != null && (!Number.isInteger(query.offset) || query.offset < 0)) {
|
|
81
|
+
errors.push(`Invalid offset: expected a non-negative integer.`);
|
|
82
|
+
}
|
|
83
|
+
if (ds.limits?.maxDimensions && query.dimensions && query.dimensions.length > ds.limits.maxDimensions) {
|
|
84
|
+
errors.push(`Too many dimensions: ${query.dimensions.length} (max ${ds.limits.maxDimensions})`);
|
|
85
|
+
}
|
|
86
|
+
if (ds.limits?.maxMeasures && query.measures && query.measures.length > ds.limits.maxMeasures) {
|
|
87
|
+
errors.push(`Too many measures: ${query.measures.length} (max ${ds.limits.maxMeasures})`);
|
|
88
|
+
}
|
|
89
|
+
if (ds.limits?.maxFilters && query.filters && query.filters.length > ds.limits.maxFilters) {
|
|
90
|
+
errors.push(`Too many filters: ${query.filters.length} (max ${ds.limits.maxFilters})`);
|
|
91
|
+
}
|
|
92
|
+
if (ds.limits?.maxResultSize && query.limit != null && query.limit > ds.limits.maxResultSize) {
|
|
93
|
+
errors.push(`Too many results requested: ${query.limit} (max ${ds.limits.maxResultSize})`);
|
|
94
|
+
}
|
|
95
|
+
return { valid: errors.length === 0, errors };
|
|
96
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AggregationSpec, AnyDatasetInstance, DerivedMetricConfig } from '../types.js';
|
|
2
|
+
export declare function validateBaseMetric(ds: AnyDatasetInstance, metricName: string, spec: AggregationSpec, options?: {
|
|
3
|
+
allowHiddenField?: boolean;
|
|
4
|
+
}): void;
|
|
5
|
+
export declare function validateDerivedMetric(ds: AnyDatasetInstance, metricName: string, config: DerivedMetricConfig<string>): void;
|
|
6
|
+
//# sourceMappingURL=dataset-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataset-validation.d.ts","sourceRoot":"","sources":["../../src/utils/dataset-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAKrB,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,kBAAkB,EACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,eAAe,EACrB,OAAO,CAAC,EAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,GACvC,IAAI,CAwCN;AAED,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,kBAAkB,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAClC,IAAI,CAmBN"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { validateFilterValue } from '../validation.js';
|
|
2
|
+
const NUMERIC_FIELD_TYPES = new Set(['number']);
|
|
3
|
+
export function validateBaseMetric(ds, metricName, spec, options) {
|
|
4
|
+
const dimension = ds.dimensions[spec.field];
|
|
5
|
+
if (!dimension && !options?.allowHiddenField) {
|
|
6
|
+
throw new Error(`Invalid metric "${metricName}": dimension "${spec.field}" does not exist on dataset "${ds.name}".`);
|
|
7
|
+
}
|
|
8
|
+
if (dimension &&
|
|
9
|
+
(spec.aggregation === 'sum' || spec.aggregation === 'avg') &&
|
|
10
|
+
!NUMERIC_FIELD_TYPES.has(dimension.fieldType)) {
|
|
11
|
+
throw new Error(`Invalid metric "${metricName}": ${spec.aggregation}() requires a numeric dimension, but "${spec.field}" is ${dimension.fieldType}.`);
|
|
12
|
+
}
|
|
13
|
+
for (const filter of spec.filters ?? []) {
|
|
14
|
+
const filterDefinition = ds.filters[filter.field];
|
|
15
|
+
const resolvedField = filterDefinition?.field ?? filter.field;
|
|
16
|
+
const fieldType = ds.dimensions[resolvedField]?.fieldType;
|
|
17
|
+
if (!fieldType) {
|
|
18
|
+
throw new Error(`Invalid metric "${metricName}": measure filter field "${filter.field}" does not exist on dataset "${ds.name}".`);
|
|
19
|
+
}
|
|
20
|
+
if (filterDefinition?.operators && !filterDefinition.operators.includes(filter.operator)) {
|
|
21
|
+
throw new Error(`Invalid metric "${metricName}": measure filter "${filter.field}" does not allow operator "${filter.operator}".`);
|
|
22
|
+
}
|
|
23
|
+
const filterError = validateFilterValue(filter, fieldType);
|
|
24
|
+
if (filterError) {
|
|
25
|
+
throw new Error(`Invalid metric "${metricName}": ${filterError}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function validateDerivedMetric(ds, metricName, config) {
|
|
30
|
+
const usedMetrics = Object.entries(config.uses);
|
|
31
|
+
if (usedMetrics.length === 0) {
|
|
32
|
+
throw new Error(`Invalid metric "${metricName}": derived metrics must reference at least one base metric.`);
|
|
33
|
+
}
|
|
34
|
+
for (const [alias, metric] of usedMetrics) {
|
|
35
|
+
if (metric.datasetName !== ds.name) {
|
|
36
|
+
throw new Error(`Invalid metric "${metricName}": referenced metric "${alias}" belongs to dataset "${metric.datasetName}", expected "${ds.name}".`);
|
|
37
|
+
}
|
|
38
|
+
if (metric.spec.__type !== 'aggregation_spec') {
|
|
39
|
+
throw new Error(`Invalid metric "${metricName}": referenced metric "${alias}" must be a base aggregation on dataset "${ds.name}".`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|