@openplait/adapter-clickhouse 0.1.0-alpha.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/LICENSE +201 -0
- package/README.md +101 -0
- package/dist/src/adapter.d.ts +23 -0
- package/dist/src/adapter.d.ts.map +1 -0
- package/dist/src/adapter.js +319 -0
- package/dist/src/adapter.js.map +1 -0
- package/dist/src/compiler.d.ts +5 -0
- package/dist/src/compiler.d.ts.map +1 -0
- package/dist/src/compiler.js +449 -0
- package/dist/src/compiler.js.map +1 -0
- package/dist/src/datasets.d.ts +7 -0
- package/dist/src/datasets.d.ts.map +1 -0
- package/dist/src/datasets.js +203 -0
- package/dist/src/datasets.js.map +1 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/native.d.ts +7 -0
- package/dist/src/native.d.ts.map +1 -0
- package/dist/src/native.js +128 -0
- package/dist/src/native.js.map +1 -0
- package/dist/src/normalization.d.ts +22 -0
- package/dist/src/normalization.d.ts.map +1 -0
- package/dist/src/normalization.js +79 -0
- package/dist/src/normalization.js.map +1 -0
- package/dist/src/parameters.d.ts +5 -0
- package/dist/src/parameters.d.ts.map +1 -0
- package/dist/src/parameters.js +39 -0
- package/dist/src/parameters.js.map +1 -0
- package/dist/src/types.d.ts +49 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SemanticQuery } from "@openplait/core";
|
|
2
|
+
import { type CompileContext, type CompiledQuery } from "@openplait/adapter-sdk";
|
|
3
|
+
import type { ClickHouseAdapterConfig, ClickHouseCompiledStatement } from "./types.js";
|
|
4
|
+
export declare function compileClickHouseQuery(query: SemanticQuery, config: ClickHouseAdapterConfig, context?: CompileContext): CompiledQuery<ClickHouseCompiledStatement>;
|
|
5
|
+
//# sourceMappingURL=compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAQV,aAAa,EAEd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAEL,KAAK,cAAc,EAEnB,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EACV,uBAAuB,EACvB,2BAA2B,EAG5B,MAAM,YAAY,CAAC;AAslBpB,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,uBAAuB,EAC/B,OAAO,GAAE,cAAmB,GAC3B,aAAa,CAAC,2BAA2B,CAAC,CA+H5C"}
|
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
import { validateQuery } from "@openplait/core";
|
|
2
|
+
import { AdapterError, } from "@openplait/adapter-sdk";
|
|
3
|
+
import { createDatasetRegistry } from "./datasets.js";
|
|
4
|
+
import { resolveParameterValue, scalarClickHouseType, } from "./parameters.js";
|
|
5
|
+
const DEFAULT_MAX_RESULT_ROWS = 10_000;
|
|
6
|
+
const DEFAULT_MAX_TIME_RANGE_MS = 31 * 24 * 60 * 60 * 1_000;
|
|
7
|
+
const SAFE_OUTPUT_NAME = /^[A-Za-z_][A-Za-z0-9_.]*$/;
|
|
8
|
+
const SAFE_IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
9
|
+
class ParameterBinder {
|
|
10
|
+
parameters = {};
|
|
11
|
+
nextId = 0;
|
|
12
|
+
bind(value, clickhouseType) {
|
|
13
|
+
const name = `op_${this.nextId++}`;
|
|
14
|
+
this.parameters[name] = value;
|
|
15
|
+
return `{${name}:${clickhouseType}}`;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function adapterError(code, message, path, details) {
|
|
19
|
+
return new AdapterError(code, message, {
|
|
20
|
+
path,
|
|
21
|
+
...(details === undefined ? {} : { details }),
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function quoteOutputName(value, path) {
|
|
25
|
+
if (!SAFE_OUTPUT_NAME.test(value)) {
|
|
26
|
+
throw adapterError("QUERY_VALIDATION_FAILED", `Output name '${value}' is not a safe ClickHouse alias.`, path);
|
|
27
|
+
}
|
|
28
|
+
return `\`${value}\``;
|
|
29
|
+
}
|
|
30
|
+
function quoteTable(value) {
|
|
31
|
+
const parts = value.split(".");
|
|
32
|
+
if (parts.length > 2 || parts.some((part) => !SAFE_IDENTIFIER.test(part))) {
|
|
33
|
+
throw adapterError("QUERY_VALIDATION_FAILED", `Table '${value}' is not a safe ClickHouse identifier.`, "/spec/input/entity");
|
|
34
|
+
}
|
|
35
|
+
return parts.map((part) => `\`${part}\``).join(".");
|
|
36
|
+
}
|
|
37
|
+
function fieldMapping(dataset, field, path) {
|
|
38
|
+
const mapping = dataset.fields[field];
|
|
39
|
+
if (!mapping) {
|
|
40
|
+
throw adapterError("FIELD_NOT_FOUND", `Field '${field}' is not defined by dataset '${dataset.name}'.`, path, { dataset: dataset.name, field });
|
|
41
|
+
}
|
|
42
|
+
return mapping;
|
|
43
|
+
}
|
|
44
|
+
function compileComparison(expression, state, path) {
|
|
45
|
+
const mapping = fieldMapping(state.dataset, expression.field, `${path}/field`);
|
|
46
|
+
const field = mapping.expression;
|
|
47
|
+
if (expression.operator === "isNull")
|
|
48
|
+
return `isNull(${field})`;
|
|
49
|
+
if (expression.operator === "isNotNull")
|
|
50
|
+
return `isNotNull(${field})`;
|
|
51
|
+
if (!("value" in expression)) {
|
|
52
|
+
throw adapterError("QUERY_VALIDATION_FAILED", `Operator '${expression.operator}' requires a value.`, path);
|
|
53
|
+
}
|
|
54
|
+
if (["contains", "notContains", "startsWith", "endsWith", "matches"].includes(expression.operator) &&
|
|
55
|
+
mapping.type !== "string") {
|
|
56
|
+
throw adapterError("UNSUPPORTED_OPERATION", `Operator '${expression.operator}' requires a string field.`, `${path}/operator`);
|
|
57
|
+
}
|
|
58
|
+
const value = resolveParameterValue(expression.value, state.parameters, state.context.variables, `${path}/value`);
|
|
59
|
+
if (value === null) {
|
|
60
|
+
if (expression.operator === "equals")
|
|
61
|
+
return `isNull(${field})`;
|
|
62
|
+
if (expression.operator === "notEquals")
|
|
63
|
+
return `isNotNull(${field})`;
|
|
64
|
+
throw adapterError("INVALID_PARAMETER", `Operator '${expression.operator}' cannot compare against null.`, `${path}/value`);
|
|
65
|
+
}
|
|
66
|
+
if (expression.operator === "in" || expression.operator === "notIn") {
|
|
67
|
+
if (!Array.isArray(value)) {
|
|
68
|
+
throw adapterError("INVALID_PARAMETER", `Operator '${expression.operator}' requires an array value.`, `${path}/value`);
|
|
69
|
+
}
|
|
70
|
+
const parameter = state.binder.bind(value, `Array(${mapping.clickhouseType})`);
|
|
71
|
+
return `${field} ${expression.operator === "in" ? "IN" : "NOT IN"} ${parameter}`;
|
|
72
|
+
}
|
|
73
|
+
if (Array.isArray(value)) {
|
|
74
|
+
throw adapterError("INVALID_PARAMETER", `Operator '${expression.operator}' requires a scalar value.`, `${path}/value`);
|
|
75
|
+
}
|
|
76
|
+
const parameter = state.binder.bind(value, mapping.clickhouseType);
|
|
77
|
+
switch (expression.operator) {
|
|
78
|
+
case "equals":
|
|
79
|
+
return `${field} = ${parameter}`;
|
|
80
|
+
case "notEquals":
|
|
81
|
+
return `${field} != ${parameter}`;
|
|
82
|
+
case "greaterThan":
|
|
83
|
+
return `${field} > ${parameter}`;
|
|
84
|
+
case "greaterThanOrEqual":
|
|
85
|
+
return `${field} >= ${parameter}`;
|
|
86
|
+
case "lessThan":
|
|
87
|
+
return `${field} < ${parameter}`;
|
|
88
|
+
case "lessThanOrEqual":
|
|
89
|
+
return `${field} <= ${parameter}`;
|
|
90
|
+
case "contains":
|
|
91
|
+
return `position(${field}, ${parameter}) > 0`;
|
|
92
|
+
case "notContains":
|
|
93
|
+
return `position(${field}, ${parameter}) = 0`;
|
|
94
|
+
case "startsWith":
|
|
95
|
+
return `startsWith(${field}, ${parameter})`;
|
|
96
|
+
case "endsWith":
|
|
97
|
+
return `endsWith(${field}, ${parameter})`;
|
|
98
|
+
case "matches":
|
|
99
|
+
return `match(${field}, ${parameter})`;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function compileBoolean(expression, state, path) {
|
|
103
|
+
if ("and" in expression) {
|
|
104
|
+
return `(${expression.and
|
|
105
|
+
.map((item, index) => compileBoolean(item, state, `${path}/and/${index}`))
|
|
106
|
+
.join(" AND ")})`;
|
|
107
|
+
}
|
|
108
|
+
if ("or" in expression) {
|
|
109
|
+
return `(${expression.or
|
|
110
|
+
.map((item, index) => compileBoolean(item, state, `${path}/or/${index}`))
|
|
111
|
+
.join(" OR ")})`;
|
|
112
|
+
}
|
|
113
|
+
if ("not" in expression) {
|
|
114
|
+
return `(NOT ${compileBoolean(expression.not, state, `${path}/not`)})`;
|
|
115
|
+
}
|
|
116
|
+
return compileComparison(expression, state, path);
|
|
117
|
+
}
|
|
118
|
+
function compileValueExpression(expression, state, path) {
|
|
119
|
+
if ("field" in expression) {
|
|
120
|
+
const mapping = fieldMapping(state.dataset, expression.field, `${path}/field`);
|
|
121
|
+
if (mapping.type !== "number" && mapping.type !== "duration") {
|
|
122
|
+
throw adapterError("UNSUPPORTED_OPERATION", `Arithmetic requires numeric fields; '${expression.field}' is '${mapping.type}'.`, `${path}/field`);
|
|
123
|
+
}
|
|
124
|
+
return mapping.expression;
|
|
125
|
+
}
|
|
126
|
+
if ("value" in expression) {
|
|
127
|
+
const value = resolveParameterValue(expression.value, state.parameters, state.context.variables, `${path}/value`);
|
|
128
|
+
if (Array.isArray(value)) {
|
|
129
|
+
throw adapterError("INVALID_PARAMETER", "Arithmetic expressions cannot contain array values.", `${path}/value`);
|
|
130
|
+
}
|
|
131
|
+
return state.binder.bind(value, scalarClickHouseType(value));
|
|
132
|
+
}
|
|
133
|
+
let operator;
|
|
134
|
+
let operands;
|
|
135
|
+
let sqlOperator;
|
|
136
|
+
if ("add" in expression) {
|
|
137
|
+
operator = "add";
|
|
138
|
+
operands = expression.add;
|
|
139
|
+
sqlOperator = "+";
|
|
140
|
+
}
|
|
141
|
+
else if ("subtract" in expression) {
|
|
142
|
+
operator = "subtract";
|
|
143
|
+
operands = expression.subtract;
|
|
144
|
+
sqlOperator = "-";
|
|
145
|
+
}
|
|
146
|
+
else if ("multiply" in expression) {
|
|
147
|
+
operator = "multiply";
|
|
148
|
+
operands = expression.multiply;
|
|
149
|
+
sqlOperator = "*";
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
operator = "divide";
|
|
153
|
+
operands = expression.divide;
|
|
154
|
+
sqlOperator = "/";
|
|
155
|
+
}
|
|
156
|
+
return `(${operands
|
|
157
|
+
.map((operand, index) => compileValueExpression(operand, state, `${path}/${operator}/${index}`))
|
|
158
|
+
.join(` ${sqlOperator} `)})`;
|
|
159
|
+
}
|
|
160
|
+
function parseInterval(interval, path) {
|
|
161
|
+
const match = /^(\d+)(ms|s|m|h|d)$/.exec(interval);
|
|
162
|
+
if (!match || Number(match[1]) < 1) {
|
|
163
|
+
throw adapterError("INVALID_PARAMETER", `Interval '${interval}' must be a positive integer followed by ms, s, m, h, or d.`, path);
|
|
164
|
+
}
|
|
165
|
+
const unit = {
|
|
166
|
+
ms: "MILLISECOND",
|
|
167
|
+
s: "SECOND",
|
|
168
|
+
m: "MINUTE",
|
|
169
|
+
h: "HOUR",
|
|
170
|
+
d: "DAY",
|
|
171
|
+
}[match[2]];
|
|
172
|
+
return `INTERVAL ${match[1]} ${unit}`;
|
|
173
|
+
}
|
|
174
|
+
function compileGroupBy(group, state, path) {
|
|
175
|
+
if ("field" in group) {
|
|
176
|
+
return fieldMapping(state.dataset, group.field, `${path}/field`).expression;
|
|
177
|
+
}
|
|
178
|
+
const field = fieldMapping(state.dataset, group.timeBucket.field, `${path}/timeBucket/field`);
|
|
179
|
+
const interval = parseInterval(group.timeBucket.interval, `${path}/timeBucket/interval`);
|
|
180
|
+
return `toStartOfInterval(${field.expression}, ${interval})`;
|
|
181
|
+
}
|
|
182
|
+
function timeBucketForField(field, groups) {
|
|
183
|
+
return groups?.find((group) => "timeBucket" in group && group.timeBucket.field === field);
|
|
184
|
+
}
|
|
185
|
+
function compileAggregate(aggregate, state, path) {
|
|
186
|
+
const mapping = aggregate.field
|
|
187
|
+
? fieldMapping(state.dataset, aggregate.field, `${path}/field`)
|
|
188
|
+
: undefined;
|
|
189
|
+
const field = mapping?.expression;
|
|
190
|
+
if (mapping &&
|
|
191
|
+
["sum", "avg", "min", "max", "percentile", "rate", "histogram"].includes(aggregate.function) &&
|
|
192
|
+
mapping.type !== "number" &&
|
|
193
|
+
mapping.type !== "duration") {
|
|
194
|
+
throw adapterError("UNSUPPORTED_OPERATION", `Aggregate '${aggregate.function}' requires a numeric field.`, `${path}/field`);
|
|
195
|
+
}
|
|
196
|
+
switch (aggregate.function) {
|
|
197
|
+
case "count":
|
|
198
|
+
return { expression: field ? `count(${field})` : "count()", type: "number" };
|
|
199
|
+
case "sum":
|
|
200
|
+
case "avg":
|
|
201
|
+
case "min":
|
|
202
|
+
case "max":
|
|
203
|
+
if (!field) {
|
|
204
|
+
throw adapterError("QUERY_VALIDATION_FAILED", `Aggregate '${aggregate.function}' requires a field.`, path);
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
expression: `${aggregate.function}(${field})`,
|
|
208
|
+
type: "number",
|
|
209
|
+
...(mapping?.unit === undefined ? {} : { unit: mapping.unit }),
|
|
210
|
+
};
|
|
211
|
+
case "percentile": {
|
|
212
|
+
if (!field || aggregate.percentile === undefined) {
|
|
213
|
+
throw adapterError("QUERY_VALIDATION_FAILED", "Percentile requires a field and percentile value.", path);
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
expression: `quantile(${aggregate.percentile / 100})(${field})`,
|
|
217
|
+
type: "number",
|
|
218
|
+
...(mapping?.unit === undefined ? {} : { unit: mapping.unit }),
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
case "distinctCount":
|
|
222
|
+
if (!field) {
|
|
223
|
+
throw adapterError("QUERY_VALIDATION_FAILED", "Distinct count requires a field.", path);
|
|
224
|
+
}
|
|
225
|
+
return { expression: `uniqExact(${field})`, type: "number" };
|
|
226
|
+
case "rate": {
|
|
227
|
+
if (!field) {
|
|
228
|
+
throw adapterError("QUERY_VALIDATION_FAILED", "Rate requires a field.", path);
|
|
229
|
+
}
|
|
230
|
+
const timestamp = fieldMapping(state.dataset, state.dataset.timeField, "/spec/input/entity").expression;
|
|
231
|
+
return {
|
|
232
|
+
expression: `sum(${field}) / greatest(dateDiff('second', min(${timestamp}), max(${timestamp})), 1)`,
|
|
233
|
+
type: "number",
|
|
234
|
+
...(mapping?.unit === undefined ? {} : { unit: `${mapping.unit}/s` }),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
case "histogram": {
|
|
238
|
+
if (!field || !aggregate.interval || !/^\d+$/.test(aggregate.interval)) {
|
|
239
|
+
throw adapterError("INVALID_PARAMETER", "Histogram requires a field and a positive integer bin count in interval.", `${path}/interval`);
|
|
240
|
+
}
|
|
241
|
+
const bins = Number(aggregate.interval);
|
|
242
|
+
if (bins < 1 || bins > 1_000) {
|
|
243
|
+
throw adapterError("INVALID_PARAMETER", "Histogram bin count must be between 1 and 1000.", `${path}/interval`);
|
|
244
|
+
}
|
|
245
|
+
return { expression: `histogram(${bins})(${field})`, type: "json" };
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
function selectOutputName(select) {
|
|
250
|
+
if ("as" in select && select.as)
|
|
251
|
+
return select.as;
|
|
252
|
+
if ("field" in select)
|
|
253
|
+
return select.field;
|
|
254
|
+
throw new AdapterError("QUERY_VALIDATION_FAILED", "Calculated and aggregate fields require an output alias.");
|
|
255
|
+
}
|
|
256
|
+
function valueExpressionFields(expression) {
|
|
257
|
+
if ("field" in expression)
|
|
258
|
+
return [expression.field];
|
|
259
|
+
if ("value" in expression)
|
|
260
|
+
return [];
|
|
261
|
+
if ("add" in expression)
|
|
262
|
+
return expression.add.flatMap(valueExpressionFields);
|
|
263
|
+
if ("subtract" in expression)
|
|
264
|
+
return expression.subtract.flatMap(valueExpressionFields);
|
|
265
|
+
if ("multiply" in expression)
|
|
266
|
+
return expression.multiply.flatMap(valueExpressionFields);
|
|
267
|
+
return expression.divide.flatMap(valueExpressionFields);
|
|
268
|
+
}
|
|
269
|
+
function validateGrouping(query) {
|
|
270
|
+
const groupedFields = new Set((query.spec.groupBy ?? []).map((group) => "field" in group ? group.field : group.timeBucket.field));
|
|
271
|
+
const hasAggregate = query.spec.select.some((select) => "aggregate" in select);
|
|
272
|
+
for (const [index, select] of query.spec.select.entries()) {
|
|
273
|
+
if ("aggregate" in select)
|
|
274
|
+
continue;
|
|
275
|
+
const fields = "field" in select
|
|
276
|
+
? [select.field]
|
|
277
|
+
: valueExpressionFields(select.expression);
|
|
278
|
+
if ((hasAggregate || groupedFields.size > 0) && fields.some((field) => !groupedFields.has(field))) {
|
|
279
|
+
throw adapterError("QUERY_VALIDATION_FAILED", "Every non-aggregate selected field must appear in groupBy when grouping or aggregation is used.", `/spec/select/${index}`, { fields, groupedFields: [...groupedFields] });
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
function compileSelect(select, index, query, state) {
|
|
284
|
+
const path = `/spec/select/${index}`;
|
|
285
|
+
const name = selectOutputName(select);
|
|
286
|
+
const alias = quoteOutputName(name, `${path}/as`);
|
|
287
|
+
if ("field" in select) {
|
|
288
|
+
const mapping = fieldMapping(state.dataset, select.field, `${path}/field`);
|
|
289
|
+
const bucket = timeBucketForField(select.field, query.spec.groupBy);
|
|
290
|
+
const expression = bucket
|
|
291
|
+
? compileGroupBy(bucket, state, "/spec/groupBy")
|
|
292
|
+
: mapping.expression;
|
|
293
|
+
return {
|
|
294
|
+
sql: `${expression} AS ${alias}`,
|
|
295
|
+
field: {
|
|
296
|
+
name,
|
|
297
|
+
type: mapping.type,
|
|
298
|
+
source: select.field,
|
|
299
|
+
...(mapping.unit === undefined ? {} : { unit: mapping.unit }),
|
|
300
|
+
},
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
if ("aggregate" in select) {
|
|
304
|
+
const aggregate = compileAggregate(select.aggregate, state, `${path}/aggregate`);
|
|
305
|
+
return {
|
|
306
|
+
sql: `${aggregate.expression} AS ${alias}`,
|
|
307
|
+
field: {
|
|
308
|
+
name,
|
|
309
|
+
type: aggregate.type,
|
|
310
|
+
...(aggregate.unit === undefined ? {} : { unit: aggregate.unit }),
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
return {
|
|
315
|
+
sql: `${compileValueExpression(select.expression, state, `${path}/expression`)} AS ${alias}`,
|
|
316
|
+
field: { name, type: "number" },
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
function resolvedTime(value, path) {
|
|
320
|
+
if (Array.isArray(value) || value === null || typeof value === "boolean") {
|
|
321
|
+
throw adapterError("INVALID_PARAMETER", "Time values must be strings or numbers.", path);
|
|
322
|
+
}
|
|
323
|
+
const milliseconds = typeof value === "number" ? value : Date.parse(value);
|
|
324
|
+
if (!Number.isFinite(milliseconds)) {
|
|
325
|
+
throw adapterError("INVALID_PARAMETER", `Time value '${value}' is invalid.`, path);
|
|
326
|
+
}
|
|
327
|
+
return milliseconds;
|
|
328
|
+
}
|
|
329
|
+
function compileTimeRange(query, state, maxTimeRangeMs, requireTimeRange) {
|
|
330
|
+
const range = query.spec.timeRange;
|
|
331
|
+
if (!range) {
|
|
332
|
+
if (requireTimeRange) {
|
|
333
|
+
throw adapterError("TIME_RANGE_REQUIRED", `Dataset '${state.dataset.name}' requires a time range.`, "/spec/timeRange");
|
|
334
|
+
}
|
|
335
|
+
return undefined;
|
|
336
|
+
}
|
|
337
|
+
const mapping = fieldMapping(state.dataset, range.field, "/spec/timeRange/field");
|
|
338
|
+
if (mapping.type !== "time") {
|
|
339
|
+
throw adapterError("QUERY_VALIDATION_FAILED", `Time range field '${range.field}' is not a time field.`, "/spec/timeRange/field");
|
|
340
|
+
}
|
|
341
|
+
const from = resolveParameterValue(range.from, state.parameters, state.context.variables, "/spec/timeRange/from");
|
|
342
|
+
const to = resolveParameterValue(range.to, state.parameters, state.context.variables, "/spec/timeRange/to");
|
|
343
|
+
const fromMs = resolvedTime(from, "/spec/timeRange/from");
|
|
344
|
+
const toMs = resolvedTime(to, "/spec/timeRange/to");
|
|
345
|
+
if (toMs < fromMs) {
|
|
346
|
+
throw adapterError("INVALID_PARAMETER", "Time range end must not precede its start.", "/spec/timeRange");
|
|
347
|
+
}
|
|
348
|
+
if (toMs - fromMs > maxTimeRangeMs) {
|
|
349
|
+
throw adapterError("TIME_RANGE_TOO_LARGE", `Time range exceeds the configured maximum of ${maxTimeRangeMs}ms.`, "/spec/timeRange", { requestedMs: toMs - fromMs, maxTimeRangeMs });
|
|
350
|
+
}
|
|
351
|
+
const fromParameter = state.binder.bind(from, "DateTime64(9)");
|
|
352
|
+
const toParameter = state.binder.bind(to, "DateTime64(9)");
|
|
353
|
+
return `${mapping.expression} BETWEEN ${fromParameter} AND ${toParameter}`;
|
|
354
|
+
}
|
|
355
|
+
function resolveLimit(query, config, context) {
|
|
356
|
+
const configured = config.maxResultRows ?? DEFAULT_MAX_RESULT_ROWS;
|
|
357
|
+
const contextual = context.maxResultRows ?? configured;
|
|
358
|
+
const maximum = Math.min(configured, contextual);
|
|
359
|
+
const requested = query.spec.limit ?? maximum;
|
|
360
|
+
if (!Number.isInteger(requested) || requested < 1 || requested > maximum) {
|
|
361
|
+
throw adapterError("QUERY_LIMIT_EXCEEDED", `Query limit ${requested} exceeds the allowed maximum of ${maximum}.`, "/spec/limit", { requested, maximum });
|
|
362
|
+
}
|
|
363
|
+
return requested;
|
|
364
|
+
}
|
|
365
|
+
export function compileClickHouseQuery(query, config, context = {}) {
|
|
366
|
+
const validation = validateQuery(query);
|
|
367
|
+
if (!validation.valid) {
|
|
368
|
+
throw new AdapterError("QUERY_VALIDATION_FAILED", "The semantic query is not valid.", { details: { errors: validation.errors } });
|
|
369
|
+
}
|
|
370
|
+
if (query.spec.mode !== "semantic") {
|
|
371
|
+
throw new AdapterError("QUERY_VALIDATION_FAILED", "The ClickHouse semantic compiler only accepts semantic queries.");
|
|
372
|
+
}
|
|
373
|
+
if (query.spec.joins?.length) {
|
|
374
|
+
throw adapterError("UNSUPPORTED_OPERATION", "ClickHouse semantic joins are not supported in this release.", "/spec/joins");
|
|
375
|
+
}
|
|
376
|
+
validateGrouping(query);
|
|
377
|
+
const datasets = createDatasetRegistry(config.datasets ?? []);
|
|
378
|
+
const dataset = datasets.get(query.spec.input.entity);
|
|
379
|
+
if (!dataset) {
|
|
380
|
+
throw adapterError("DATASET_NOT_FOUND", `Dataset '${query.spec.input.entity}' is not registered.`, "/spec/input/entity");
|
|
381
|
+
}
|
|
382
|
+
if (dataset.signal !== query.spec.input.signal) {
|
|
383
|
+
throw adapterError("QUERY_VALIDATION_FAILED", `Dataset '${dataset.name}' carries '${dataset.signal}', not '${query.spec.input.signal}'.`, "/spec/input/signal");
|
|
384
|
+
}
|
|
385
|
+
const state = {
|
|
386
|
+
binder: new ParameterBinder(),
|
|
387
|
+
context,
|
|
388
|
+
dataset,
|
|
389
|
+
parameters: query.spec.parameters ?? {},
|
|
390
|
+
};
|
|
391
|
+
const selected = query.spec.select.map((select, index) => compileSelect(select, index, query, state));
|
|
392
|
+
const filters = [];
|
|
393
|
+
const timeFilter = compileTimeRange(query, state, config.maxTimeRangeMs ?? DEFAULT_MAX_TIME_RANGE_MS, config.requireTimeRange ?? true);
|
|
394
|
+
if (timeFilter)
|
|
395
|
+
filters.push(timeFilter);
|
|
396
|
+
if (dataset.defaultFilter) {
|
|
397
|
+
filters.push(compileBoolean(dataset.defaultFilter, state, "/dataset/defaultFilter"));
|
|
398
|
+
}
|
|
399
|
+
if (config.tenant) {
|
|
400
|
+
filters.push(compileBoolean({
|
|
401
|
+
field: config.tenant.field,
|
|
402
|
+
operator: "equals",
|
|
403
|
+
value: config.tenant.value,
|
|
404
|
+
}, state, "/config/tenant"));
|
|
405
|
+
}
|
|
406
|
+
if (query.spec.where) {
|
|
407
|
+
filters.push(compileBoolean(query.spec.where, state, "/spec/where"));
|
|
408
|
+
}
|
|
409
|
+
const groups = query.spec.groupBy?.map((group, index) => compileGroupBy(group, state, `/spec/groupBy/${index}`));
|
|
410
|
+
const outputNames = new Set(selected.map(({ field }) => field.name));
|
|
411
|
+
const order = query.spec.orderBy?.map((item, index) => {
|
|
412
|
+
const expression = outputNames.has(item.field)
|
|
413
|
+
? quoteOutputName(item.field, `/spec/orderBy/${index}/field`)
|
|
414
|
+
: fieldMapping(dataset, item.field, `/spec/orderBy/${index}/field`).expression;
|
|
415
|
+
return `${expression} ${item.direction.toUpperCase()}`;
|
|
416
|
+
});
|
|
417
|
+
const limit = resolveLimit(query, config, context);
|
|
418
|
+
const lines = [
|
|
419
|
+
"SELECT",
|
|
420
|
+
selected.map(({ sql }) => ` ${sql}`).join(",\n"),
|
|
421
|
+
`FROM ${quoteTable(dataset.table)}`,
|
|
422
|
+
];
|
|
423
|
+
if (dataset.arrayJoin) {
|
|
424
|
+
if (!SAFE_IDENTIFIER.test(dataset.arrayJoin)) {
|
|
425
|
+
throw adapterError("QUERY_VALIDATION_FAILED", `Array join '${dataset.arrayJoin}' is not a safe identifier.`, "/spec/input/entity");
|
|
426
|
+
}
|
|
427
|
+
lines.push(`ARRAY JOIN \`${dataset.arrayJoin}\``);
|
|
428
|
+
}
|
|
429
|
+
if (filters.length)
|
|
430
|
+
lines.push(`WHERE ${filters.join("\n AND ")}`);
|
|
431
|
+
if (groups?.length)
|
|
432
|
+
lines.push(`GROUP BY ${groups.join(", ")}`);
|
|
433
|
+
if (order?.length)
|
|
434
|
+
lines.push(`ORDER BY ${order.join(", ")}`);
|
|
435
|
+
lines.push(`LIMIT ${limit}`);
|
|
436
|
+
return {
|
|
437
|
+
kind: "CompiledQuery",
|
|
438
|
+
language: "sql",
|
|
439
|
+
compiled: { statement: lines.join("\n") },
|
|
440
|
+
parameters: state.binder.parameters,
|
|
441
|
+
fields: selected.map(({ field }) => field),
|
|
442
|
+
source: {
|
|
443
|
+
resourceName: query.metadata.name,
|
|
444
|
+
dataset: dataset.name,
|
|
445
|
+
},
|
|
446
|
+
warnings: [],
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
//# sourceMappingURL=compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SemanticSchema } from "@openplait/core";
|
|
2
|
+
import type { ClickHouseDataset } from "./types.js";
|
|
3
|
+
export declare const OTEL_CLICKHOUSE_DATASETS: readonly ClickHouseDataset[];
|
|
4
|
+
export declare const OPENLIT_CLICKHOUSE_DATASETS: readonly ClickHouseDataset[];
|
|
5
|
+
export declare function createDatasetRegistry(overrides?: readonly ClickHouseDataset[]): ReadonlyMap<string, ClickHouseDataset>;
|
|
6
|
+
export declare function datasetsToSemanticSchema(datasets: ReadonlyMap<string, ClickHouseDataset>): SemanticSchema;
|
|
7
|
+
//# sourceMappingURL=datasets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasets.d.ts","sourceRoot":"","sources":["../../src/datasets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,KAAK,EAAE,iBAAiB,EAA0B,MAAM,YAAY,CAAC;AAuD5E,eAAO,MAAM,wBAAwB,EAAE,SAAS,iBAAiB,EAuFhE,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,SAAS,iBAAiB,EA+D1D,CAAC;AAEX,wBAAgB,qBAAqB,CACnC,SAAS,GAAE,SAAS,iBAAiB,EAAO,GAC3C,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAMxC;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAC/C,cAAc,CA2BhB"}
|