@devrev/meerkat-core 0.0.123 → 0.0.124
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/package.json +1 -1
- package/src/ast-validator/index.d.ts +1 -1
- package/src/ast-validator/index.js +2 -1
- package/src/ast-validator/index.js.map +1 -1
- package/src/ast-validator/tests/test-data.d.ts +8 -1
- package/src/ast-validator/tests/test-data.js +16 -9
- package/src/ast-validator/tests/test-data.js.map +1 -1
- package/src/ast-validator/utils.d.ts +1 -0
- package/src/ast-validator/utils.js +11 -3
- package/src/ast-validator/utils.js.map +1 -1
- package/src/index.d.ts +5 -1
- package/src/index.js +5 -1
- package/src/index.js.map +1 -1
- package/src/utils/__fixtures__/ensure-sql-expression-column-alias.fixtures.d.ts +15 -0
- package/src/utils/__fixtures__/ensure-sql-expression-column-alias.fixtures.js +240 -0
- package/src/utils/__fixtures__/ensure-sql-expression-column-alias.fixtures.js.map +1 -0
- package/src/utils/duckdb-ast-parse-serialize.d.ts +4 -0
- package/src/utils/duckdb-ast-parse-serialize.js +108 -0
- package/src/utils/duckdb-ast-parse-serialize.js.map +1 -0
- package/src/utils/ensure-sql-expression-column-alias.d.ts +14 -0
- package/src/utils/ensure-sql-expression-column-alias.js +184 -0
- package/src/utils/ensure-sql-expression-column-alias.js.map +1 -0
- package/src/utils/ensure-table-schema-alias-sql.d.ts +19 -0
- package/src/utils/ensure-table-schema-alias-sql.js +67 -0
- package/src/utils/ensure-table-schema-alias-sql.js.map +1 -0
- package/src/utils/get-child-expressions.d.ts +13 -0
- package/src/utils/get-child-expressions.js +75 -0
- package/src/utils/get-child-expressions.js.map +1 -0
- package/src/utils/get-column-names-from-ast.js +4 -27
- package/src/utils/get-column-names-from-ast.js.map +1 -1
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createEnsureTableSchemaAliasSqlFixture = exports.DEFERRED_ENSURE_COLUMN_ALIAS_SCENARIOS = exports.ENSURE_COLUMN_ALIAS_SCENARIOS = void 0;
|
|
4
|
+
exports.ENSURE_COLUMN_ALIAS_SCENARIOS = [
|
|
5
|
+
{
|
|
6
|
+
description: 'bare dimension column',
|
|
7
|
+
tableName: 'orders',
|
|
8
|
+
inputSql: 'customer_id',
|
|
9
|
+
expectedSql: 'orders.customer_id',
|
|
10
|
+
shouldChange: true,
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
description: 'bare aggregate argument',
|
|
14
|
+
tableName: 'orders',
|
|
15
|
+
inputSql: 'SUM(order_amount)',
|
|
16
|
+
expectedSql: 'SUM(orders.order_amount)',
|
|
17
|
+
shouldChange: true,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
description: 'bare aggregate argument for customers schema',
|
|
21
|
+
tableName: 'customers',
|
|
22
|
+
inputSql: 'SUM(order_amount)',
|
|
23
|
+
expectedSql: 'SUM(customers.order_amount)',
|
|
24
|
+
shouldChange: true,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
description: 'multiple bare columns in arithmetic expression',
|
|
28
|
+
tableName: 'orders',
|
|
29
|
+
inputSql: 'price * quantity',
|
|
30
|
+
expectedSql: 'orders.price * orders.quantity',
|
|
31
|
+
shouldChange: true,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
description: 'mixed qualified and unqualified references',
|
|
35
|
+
tableName: 'orders',
|
|
36
|
+
inputSql: 'orders.price * quantity',
|
|
37
|
+
expectedSql: 'orders.price * orders.quantity',
|
|
38
|
+
shouldChange: true,
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
description: 'already qualified column reference',
|
|
42
|
+
tableName: 'orders',
|
|
43
|
+
inputSql: 'orders.order_amount',
|
|
44
|
+
expectedSql: 'orders.order_amount',
|
|
45
|
+
shouldChange: false,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
description: 'already qualified column reference for customers schema',
|
|
49
|
+
tableName: 'customers',
|
|
50
|
+
inputSql: 'customers.order_amount',
|
|
51
|
+
expectedSql: 'customers.order_amount',
|
|
52
|
+
shouldChange: false,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
description: 'cast expression',
|
|
56
|
+
tableName: 'orders',
|
|
57
|
+
inputSql: 'CAST(amount AS DOUBLE)',
|
|
58
|
+
expectedSql: 'CAST(orders.amount AS DOUBLE)',
|
|
59
|
+
shouldChange: true,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
description: 'nested scalar functions',
|
|
63
|
+
tableName: 'orders',
|
|
64
|
+
inputSql: 'ROUND(COALESCE(amount, 0), 2)',
|
|
65
|
+
expectedSql: 'ROUND(COALESCE(orders.amount, 0), 2)',
|
|
66
|
+
shouldChange: true,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
description: 'aggregate with nested scalar function',
|
|
70
|
+
tableName: 'orders',
|
|
71
|
+
inputSql: "AVG(DATE_DIFF('minute', created_date, first_response_time))",
|
|
72
|
+
expectedSql: "AVG(DATE_DIFF('minute', orders.created_date, orders.first_response_time))",
|
|
73
|
+
shouldChange: true,
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
description: 'count distinct',
|
|
77
|
+
tableName: 'orders',
|
|
78
|
+
inputSql: 'COUNT(DISTINCT id)',
|
|
79
|
+
expectedSql: 'COUNT(DISTINCT orders.id)',
|
|
80
|
+
shouldChange: true,
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
description: 'case expression with comparison and result column',
|
|
84
|
+
tableName: 'orders',
|
|
85
|
+
inputSql: "CASE WHEN status = 'open' THEN id END",
|
|
86
|
+
expectedSql: "CASE WHEN orders.status = 'open' THEN orders.id END",
|
|
87
|
+
shouldChange: true,
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
description: 'boolean conjunction expression',
|
|
91
|
+
tableName: 'orders',
|
|
92
|
+
inputSql: 'CASE WHEN a > 0 AND b < 10 THEN c ELSE 0 END',
|
|
93
|
+
expectedSql: 'CASE WHEN orders.a > 0 AND orders.b < 10 THEN orders.c ELSE 0 END',
|
|
94
|
+
shouldChange: true,
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
description: 'null check expression',
|
|
98
|
+
tableName: 'orders',
|
|
99
|
+
inputSql: 'CASE WHEN deleted_at IS NULL THEN id END',
|
|
100
|
+
expectedSql: 'CASE WHEN orders.deleted_at IS NULL THEN orders.id END',
|
|
101
|
+
shouldChange: true,
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
description: 'coalesce expression',
|
|
105
|
+
tableName: 'orders',
|
|
106
|
+
inputSql: 'COALESCE(discount_amount, 0)',
|
|
107
|
+
expectedSql: 'COALESCE(orders.discount_amount, 0)',
|
|
108
|
+
shouldChange: true,
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
description: 'json extract operator',
|
|
112
|
+
tableName: 'tickets',
|
|
113
|
+
inputSql: "stage_json->>'name'",
|
|
114
|
+
expectedSql: "tickets.stage_json->>'name'",
|
|
115
|
+
shouldChange: true,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
description: 'array function',
|
|
119
|
+
tableName: 'tickets',
|
|
120
|
+
inputSql: 'ARRAY_LENGTH(owner_ids)',
|
|
121
|
+
expectedSql: 'ARRAY_LENGTH(tickets.owner_ids)',
|
|
122
|
+
shouldChange: true,
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
description: 'string literal with column-like content',
|
|
126
|
+
tableName: 'orders',
|
|
127
|
+
inputSql: "'customer_id'",
|
|
128
|
+
expectedSql: "'customer_id'",
|
|
129
|
+
shouldChange: false,
|
|
130
|
+
notes: 'Column-like text inside string literals should not be rewritten.',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
description: 'quoted identifier',
|
|
134
|
+
tableName: 'orders',
|
|
135
|
+
inputSql: '"Order ID"',
|
|
136
|
+
expectedSql: '"Order ID"',
|
|
137
|
+
shouldChange: false,
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
description: 'reference to a different table remains untouched',
|
|
141
|
+
tableName: 'orders',
|
|
142
|
+
inputSql: 'customers.id',
|
|
143
|
+
expectedSql: 'customers.id',
|
|
144
|
+
shouldChange: false,
|
|
145
|
+
},
|
|
146
|
+
];
|
|
147
|
+
exports.DEFERRED_ENSURE_COLUMN_ALIAS_SCENARIOS = [
|
|
148
|
+
{
|
|
149
|
+
description: 'window aggregate with order expression',
|
|
150
|
+
tableName: 'orders',
|
|
151
|
+
inputSql: 'AVG(COUNT(order_id)) OVER (ORDER BY record_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)',
|
|
152
|
+
expectedSql: 'AVG(COUNT(orders.order_id)) OVER (ORDER BY orders.record_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)',
|
|
153
|
+
shouldChange: true,
|
|
154
|
+
deferredReason: 'Needs dedicated coverage for window order and frame AST traversal.',
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
description: 'aggregate filter clause',
|
|
158
|
+
tableName: 'orders',
|
|
159
|
+
inputSql: "SUM(amount) FILTER (WHERE direction = 'Income')",
|
|
160
|
+
expectedSql: "SUM(orders.amount) FILTER (WHERE orders.direction = 'Income')",
|
|
161
|
+
shouldChange: true,
|
|
162
|
+
deferredReason: 'DuckDB filter-clause AST shape should be verified before enabling.',
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
description: 'subquery expression',
|
|
166
|
+
tableName: 'orders',
|
|
167
|
+
inputSql: "(SELECT CASE WHEN COUNT(DISTINCT id) > 0 THEN MAX(created_at) END)",
|
|
168
|
+
expectedSql: "(SELECT CASE WHEN COUNT(DISTINCT orders.id) > 0 THEN MAX(orders.created_at) END)",
|
|
169
|
+
shouldChange: true,
|
|
170
|
+
deferredReason: 'Nested SELECT rewriting should be confirmed against actual parser output.',
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
description: 'three-part qualified identifier',
|
|
174
|
+
tableName: 'orders',
|
|
175
|
+
inputSql: 'analytics.orders.amount',
|
|
176
|
+
expectedSql: 'analytics.orders.amount',
|
|
177
|
+
shouldChange: false,
|
|
178
|
+
deferredReason: 'Need to confirm whether DuckDB returns three-part names in member expressions.',
|
|
179
|
+
},
|
|
180
|
+
];
|
|
181
|
+
const createEnsureTableSchemaAliasSqlFixture = () => [
|
|
182
|
+
{
|
|
183
|
+
name: 'orders',
|
|
184
|
+
sql: 'SELECT * FROM orders',
|
|
185
|
+
measures: [
|
|
186
|
+
{
|
|
187
|
+
name: 'gross_amount',
|
|
188
|
+
sql: 'SUM(order_amount)',
|
|
189
|
+
type: 'number',
|
|
190
|
+
alias: 'Gross Amount',
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
name: 'net_amount',
|
|
194
|
+
sql: 'SUM(order_amount - discount_amount)',
|
|
195
|
+
type: 'number',
|
|
196
|
+
},
|
|
197
|
+
],
|
|
198
|
+
dimensions: [
|
|
199
|
+
{
|
|
200
|
+
name: 'customer_id',
|
|
201
|
+
sql: 'customer_id',
|
|
202
|
+
type: 'string',
|
|
203
|
+
alias: 'Customer ID',
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
name: 'order_month',
|
|
207
|
+
sql: "DATE_TRUNC('month', created_at)",
|
|
208
|
+
type: 'time',
|
|
209
|
+
modifier: {
|
|
210
|
+
shouldUnnestGroupBy: false,
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
joins: [
|
|
215
|
+
{
|
|
216
|
+
sql: 'orders.customer_id = customers.id',
|
|
217
|
+
},
|
|
218
|
+
],
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
name: 'customers',
|
|
222
|
+
sql: 'SELECT * FROM customers',
|
|
223
|
+
measures: [
|
|
224
|
+
{
|
|
225
|
+
name: 'gross_amount',
|
|
226
|
+
sql: 'SUM(order_amount)',
|
|
227
|
+
type: 'number',
|
|
228
|
+
},
|
|
229
|
+
],
|
|
230
|
+
dimensions: [
|
|
231
|
+
{
|
|
232
|
+
name: 'id',
|
|
233
|
+
sql: 'id',
|
|
234
|
+
type: 'string',
|
|
235
|
+
},
|
|
236
|
+
],
|
|
237
|
+
},
|
|
238
|
+
];
|
|
239
|
+
exports.createEnsureTableSchemaAliasSqlFixture = createEnsureTableSchemaAliasSqlFixture;
|
|
240
|
+
//# sourceMappingURL=ensure-sql-expression-column-alias.fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-sql-expression-column-alias.fixtures.js","sourceRoot":"","sources":["../../../../../meerkat-core/src/utils/__fixtures__/ensure-sql-expression-column-alias.fixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ParsedExpression } from '../types/duckdb-serialization-types';
|
|
2
|
+
export type GetQueryOutput = (query: string) => Promise<Record<string, string>[]>;
|
|
3
|
+
export declare const parseExpressions: (sqls: string[], executeQuery: GetQueryOutput) => Promise<ParsedExpression[]>;
|
|
4
|
+
export declare const serializeExpressions: (expressions: ParsedExpression[], executeQuery: GetQueryOutput) => Promise<string[]>;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serializeExpressions = exports.parseExpressions = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const ast_deserializer_1 = require("../ast-deserializer/ast-deserializer");
|
|
6
|
+
const ast_serializer_1 = require("../ast-serializer/ast-serializer");
|
|
7
|
+
const ast_validator_1 = require("../ast-validator");
|
|
8
|
+
const sanitize_value_1 = require("../member-formatters/sanitize-value");
|
|
9
|
+
const duckdb_serialization_types_1 = require("../types/duckdb-serialization-types");
|
|
10
|
+
const stripSelectWrapper = (query) => {
|
|
11
|
+
const normalized = query.trim().replace(/;$/, '');
|
|
12
|
+
if (!/^SELECT\s+/i.test(normalized)) {
|
|
13
|
+
throw new Error(`Expected SELECT wrapper, received: ${normalized}`);
|
|
14
|
+
}
|
|
15
|
+
return normalized.replace(/^SELECT\s+/i, '').trim();
|
|
16
|
+
};
|
|
17
|
+
const BATCH_SERIALIZE_ALIAS_PREFIX = '__meerkat_batch_expr_';
|
|
18
|
+
const getBatchSerializeAlias = (index) => {
|
|
19
|
+
return `${BATCH_SERIALIZE_ALIAS_PREFIX}${index}__`;
|
|
20
|
+
};
|
|
21
|
+
const splitBatchSerializedExpressions = (sql, expressionCount) => {
|
|
22
|
+
const expressionSql = stripSelectWrapper(sql);
|
|
23
|
+
let cursor = 0;
|
|
24
|
+
const expressions = [];
|
|
25
|
+
for (let index = 0; index < expressionCount; index += 1) {
|
|
26
|
+
const aliasToken = ` AS ${getBatchSerializeAlias(index)}`;
|
|
27
|
+
const aliasIndex = expressionSql.indexOf(aliasToken, cursor);
|
|
28
|
+
if (aliasIndex === -1) {
|
|
29
|
+
throw new Error(`Failed to locate batch serialization alias ${getBatchSerializeAlias(index)}`);
|
|
30
|
+
}
|
|
31
|
+
expressions.push(expressionSql.slice(cursor, aliasIndex).trim());
|
|
32
|
+
cursor = aliasIndex + aliasToken.length;
|
|
33
|
+
if (index < expressionCount - 1) {
|
|
34
|
+
if (expressionSql[cursor] !== ',') {
|
|
35
|
+
throw new Error(`Expected comma after batch serialization alias ${getBatchSerializeAlias(index)}`);
|
|
36
|
+
}
|
|
37
|
+
cursor += 1;
|
|
38
|
+
while (expressionSql[cursor] === ' ') {
|
|
39
|
+
cursor += 1;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return expressions;
|
|
44
|
+
};
|
|
45
|
+
const stripQueryLocationInPlace = (root) => {
|
|
46
|
+
const stack = [root];
|
|
47
|
+
while (stack.length > 0) {
|
|
48
|
+
const current = stack.pop();
|
|
49
|
+
if (!current || typeof current !== 'object') {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (Array.isArray(current)) {
|
|
53
|
+
current.forEach((item) => stack.push(item));
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const record = current;
|
|
57
|
+
if (Object.prototype.hasOwnProperty.call(record, 'query_location')) {
|
|
58
|
+
delete record['query_location'];
|
|
59
|
+
}
|
|
60
|
+
Object.values(record).forEach((value) => stack.push(value));
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const parseExpressions = (sqls, executeQuery) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
64
|
+
if (sqls.length === 0) {
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
const selectSql = `SELECT ${sqls.join(', ')}`;
|
|
68
|
+
const rows = yield executeQuery((0, ast_serializer_1.astSerializerQuery)((0, sanitize_value_1.sanitizeStringValue)(selectSql)));
|
|
69
|
+
const parsedSerialization = JSON.parse((0, ast_deserializer_1.deserializeQuery)(rows));
|
|
70
|
+
stripQueryLocationInPlace(parsedSerialization);
|
|
71
|
+
const parsedExpressions = (0, ast_validator_1.getSelectNodes)(parsedSerialization);
|
|
72
|
+
if (parsedExpressions.length !== sqls.length) {
|
|
73
|
+
throw new Error(`Expected ${sqls.length} parsed expressions, received ${parsedExpressions.length}`);
|
|
74
|
+
}
|
|
75
|
+
return parsedExpressions;
|
|
76
|
+
});
|
|
77
|
+
exports.parseExpressions = parseExpressions;
|
|
78
|
+
const serializeExpressions = (expressions, executeQuery) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
79
|
+
if (expressions.length === 0)
|
|
80
|
+
return [];
|
|
81
|
+
expressions.forEach((expr, i) => {
|
|
82
|
+
expr.alias = getBatchSerializeAlias(i);
|
|
83
|
+
});
|
|
84
|
+
const statement = {
|
|
85
|
+
node: {
|
|
86
|
+
type: duckdb_serialization_types_1.QueryNodeType.SELECT_NODE,
|
|
87
|
+
modifiers: [],
|
|
88
|
+
cte_map: { map: [] },
|
|
89
|
+
select_list: expressions,
|
|
90
|
+
from_table: {
|
|
91
|
+
type: duckdb_serialization_types_1.TableReferenceType.EMPTY,
|
|
92
|
+
alias: '',
|
|
93
|
+
sample: null,
|
|
94
|
+
},
|
|
95
|
+
group_expressions: [],
|
|
96
|
+
group_sets: [],
|
|
97
|
+
aggregate_handling: duckdb_serialization_types_1.AggregateHandling.STANDARD_HANDLING,
|
|
98
|
+
having: null,
|
|
99
|
+
sample: null,
|
|
100
|
+
qualify: null,
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
const rows = yield executeQuery((0, ast_deserializer_1.astDeserializerQuery)(statement));
|
|
104
|
+
const deserializedSql = (0, ast_deserializer_1.deserializeQuery)(rows);
|
|
105
|
+
return splitBatchSerializedExpressions(deserializedSql, expressions.length);
|
|
106
|
+
});
|
|
107
|
+
exports.serializeExpressions = serializeExpressions;
|
|
108
|
+
//# sourceMappingURL=duckdb-ast-parse-serialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-ast-parse-serialize.js","sourceRoot":"","sources":["../../../../meerkat-core/src/utils/duckdb-ast-parse-serialize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { GetQueryOutput } from './duckdb-ast-parse-serialize';
|
|
2
|
+
export interface EnsureColumnAliasBatchItem<TContext = unknown> {
|
|
3
|
+
sql: string;
|
|
4
|
+
tableName: string;
|
|
5
|
+
context?: TContext;
|
|
6
|
+
}
|
|
7
|
+
export interface EnsureColumnAliasBatchResult<TContext = unknown> extends EnsureColumnAliasBatchItem<TContext> {
|
|
8
|
+
didChange: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface EnsureColumnAliasBatchParams<TContext = unknown> {
|
|
11
|
+
items: EnsureColumnAliasBatchItem<TContext>[];
|
|
12
|
+
executeQuery: GetQueryOutput;
|
|
13
|
+
}
|
|
14
|
+
export declare const ensureColumnAliasBatch: <TContext = unknown>({ items, executeQuery, }: EnsureColumnAliasBatchParams<TContext>) => Promise<EnsureColumnAliasBatchResult<TContext>[]>;
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ensureColumnAliasBatch = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const duckdb_serialization_types_1 = require("../types/duckdb-serialization-types");
|
|
6
|
+
const utils_1 = require("../types/utils");
|
|
7
|
+
const duckdb_ast_parse_serialize_1 = require("./duckdb-ast-parse-serialize");
|
|
8
|
+
const get_child_expressions_1 = require("./get-child-expressions");
|
|
9
|
+
const ALIASABLE_IDENTIFIER_REGEX = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
10
|
+
const shouldEnsureColumnRefAlias = (columnNames, scopedIdentifiers) => {
|
|
11
|
+
if (columnNames.length !== 1) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
const [columnName] = columnNames;
|
|
15
|
+
if (!columnName) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
if (/\s/.test(columnName)) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
if (scopedIdentifiers.has(columnName)) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
return ALIASABLE_IDENTIFIER_REGEX.test(columnName);
|
|
25
|
+
};
|
|
26
|
+
const getLambdaBoundIdentifiers = (node, boundIdentifiers = new Set()) => {
|
|
27
|
+
if ((0, utils_1.isColumnRefExpression)(node) && node.column_names.length === 1) {
|
|
28
|
+
boundIdentifiers.add(node.column_names[0]);
|
|
29
|
+
return boundIdentifiers;
|
|
30
|
+
}
|
|
31
|
+
if ((0, utils_1.isConjunctionExpression)(node) || (0, utils_1.isOperatorExpression)(node)) {
|
|
32
|
+
node.children.forEach((child) => getLambdaBoundIdentifiers(child, boundIdentifiers));
|
|
33
|
+
}
|
|
34
|
+
return boundIdentifiers;
|
|
35
|
+
};
|
|
36
|
+
const ensureOrderByNodesAlias = (orders, scopedIdentifiers, tableName) => {
|
|
37
|
+
return orders.reduce((changed, order) => ensureParsedExpressionAlias(order.expression, tableName, scopedIdentifiers) || changed, false);
|
|
38
|
+
};
|
|
39
|
+
const isOrderModifier = (modifier) => {
|
|
40
|
+
return modifier.type === 'ORDER_MODIFIER';
|
|
41
|
+
};
|
|
42
|
+
const isDistinctModifier = (modifier) => {
|
|
43
|
+
return modifier.type === 'DISTINCT_MODIFIER';
|
|
44
|
+
};
|
|
45
|
+
const isLimitLikeModifier = (modifier) => {
|
|
46
|
+
return (modifier.type === 'LIMIT_MODIFIER' ||
|
|
47
|
+
modifier.type === 'LIMIT_PERCENT_MODIFIER');
|
|
48
|
+
};
|
|
49
|
+
const ensureQueryNodeAlias = (node, tableName, scopedIdentifiers = new Set()) => {
|
|
50
|
+
if ((0, utils_1.isSelectNode)(node)) {
|
|
51
|
+
let changed = false;
|
|
52
|
+
node.select_list.forEach((expression) => {
|
|
53
|
+
changed =
|
|
54
|
+
ensureParsedExpressionAlias(expression, tableName, scopedIdentifiers) || changed;
|
|
55
|
+
});
|
|
56
|
+
changed =
|
|
57
|
+
(node.where_clause
|
|
58
|
+
? ensureParsedExpressionAlias(node.where_clause, tableName, scopedIdentifiers)
|
|
59
|
+
: false) || changed;
|
|
60
|
+
node.group_expressions.forEach((expression) => {
|
|
61
|
+
changed =
|
|
62
|
+
ensureParsedExpressionAlias(expression, tableName, scopedIdentifiers) || changed;
|
|
63
|
+
});
|
|
64
|
+
changed =
|
|
65
|
+
(node.having
|
|
66
|
+
? ensureParsedExpressionAlias(node.having, tableName, scopedIdentifiers)
|
|
67
|
+
: false) || changed;
|
|
68
|
+
changed =
|
|
69
|
+
(node.qualify
|
|
70
|
+
? ensureParsedExpressionAlias(node.qualify, tableName, scopedIdentifiers)
|
|
71
|
+
: false) || changed;
|
|
72
|
+
node.modifiers.forEach((modifier) => {
|
|
73
|
+
if (isOrderModifier(modifier)) {
|
|
74
|
+
changed =
|
|
75
|
+
ensureOrderByNodesAlias(modifier.orders, scopedIdentifiers, tableName) || changed;
|
|
76
|
+
}
|
|
77
|
+
if (isDistinctModifier(modifier)) {
|
|
78
|
+
modifier.distinct_on_targets.forEach((target) => (changed =
|
|
79
|
+
ensureParsedExpressionAlias(target, tableName, scopedIdentifiers) || changed));
|
|
80
|
+
}
|
|
81
|
+
if (isLimitLikeModifier(modifier)) {
|
|
82
|
+
changed =
|
|
83
|
+
(modifier.limit
|
|
84
|
+
? ensureParsedExpressionAlias(modifier.limit, tableName, scopedIdentifiers)
|
|
85
|
+
: false) || changed;
|
|
86
|
+
changed =
|
|
87
|
+
(modifier.offset
|
|
88
|
+
? ensureParsedExpressionAlias(modifier.offset, tableName, scopedIdentifiers)
|
|
89
|
+
: false) || changed;
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
return changed;
|
|
93
|
+
}
|
|
94
|
+
if (node.type === duckdb_serialization_types_1.QueryNodeType.SET_OPERATION_NODE) {
|
|
95
|
+
let changed = false;
|
|
96
|
+
changed =
|
|
97
|
+
ensureQueryNodeAlias(node.left, tableName, scopedIdentifiers) || changed;
|
|
98
|
+
changed =
|
|
99
|
+
ensureQueryNodeAlias(node.right, tableName, scopedIdentifiers) || changed;
|
|
100
|
+
return changed;
|
|
101
|
+
}
|
|
102
|
+
if (node.type === duckdb_serialization_types_1.QueryNodeType.RECURSIVE_CTE_NODE) {
|
|
103
|
+
let changed = false;
|
|
104
|
+
changed =
|
|
105
|
+
ensureQueryNodeAlias(node.left, tableName, scopedIdentifiers) || changed;
|
|
106
|
+
changed =
|
|
107
|
+
ensureQueryNodeAlias(node.right, tableName, scopedIdentifiers) || changed;
|
|
108
|
+
return changed;
|
|
109
|
+
}
|
|
110
|
+
if (node.type === duckdb_serialization_types_1.QueryNodeType.CTE_NODE) {
|
|
111
|
+
let changed = false;
|
|
112
|
+
changed =
|
|
113
|
+
ensureQueryNodeAlias(node.query, tableName, scopedIdentifiers) || changed;
|
|
114
|
+
changed =
|
|
115
|
+
ensureQueryNodeAlias(node.child, tableName, scopedIdentifiers) || changed;
|
|
116
|
+
return changed;
|
|
117
|
+
}
|
|
118
|
+
return false;
|
|
119
|
+
};
|
|
120
|
+
const ensureParsedExpressionAlias = (node, tableName, scopedIdentifiers = new Set()) => {
|
|
121
|
+
if (!node || !tableName) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
if ((0, utils_1.isColumnRefExpression)(node)) {
|
|
125
|
+
if (shouldEnsureColumnRefAlias(node.column_names, scopedIdentifiers)) {
|
|
126
|
+
node.column_names = [tableName, node.column_names[0]];
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
if ((0, utils_1.isLambdaExpression)(node)) {
|
|
132
|
+
const lambdaScopedIdentifiers = new Set(scopedIdentifiers);
|
|
133
|
+
getLambdaBoundIdentifiers(node.lhs).forEach((identifier) => lambdaScopedIdentifiers.add(identifier));
|
|
134
|
+
return node.expr
|
|
135
|
+
? ensureParsedExpressionAlias(node.expr, tableName, lambdaScopedIdentifiers)
|
|
136
|
+
: false;
|
|
137
|
+
}
|
|
138
|
+
if ((0, utils_1.isSubqueryExpression)(node)) {
|
|
139
|
+
let changed = ensureQueryNodeAlias(node.subquery.node, tableName, scopedIdentifiers);
|
|
140
|
+
if (node.child) {
|
|
141
|
+
changed =
|
|
142
|
+
ensureParsedExpressionAlias(node.child, tableName, scopedIdentifiers) || changed;
|
|
143
|
+
}
|
|
144
|
+
return changed;
|
|
145
|
+
}
|
|
146
|
+
return (0, get_child_expressions_1.getChildExpressions)(node).reduce((changed, child) => ensureParsedExpressionAlias(child, tableName, scopedIdentifiers) ||
|
|
147
|
+
changed, false);
|
|
148
|
+
};
|
|
149
|
+
const ensureColumnAliasBatch = ({ items, executeQuery, }) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
150
|
+
if (items.length === 0) {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
const parsedExpressions = yield (0, duckdb_ast_parse_serialize_1.parseExpressions)(items.map((item) => item.sql), executeQuery);
|
|
154
|
+
if (parsedExpressions.length !== items.length) {
|
|
155
|
+
throw new Error(`Expected ${items.length} parsed expressions, received ${parsedExpressions.length}`);
|
|
156
|
+
}
|
|
157
|
+
const results = items.map((item) => (Object.assign(Object.assign({}, item), { sql: item.sql, didChange: false })));
|
|
158
|
+
const changedResultIndexes = [];
|
|
159
|
+
parsedExpressions.forEach((parsedExpression, index) => {
|
|
160
|
+
const didChange = ensureParsedExpressionAlias(parsedExpression, items[index].tableName);
|
|
161
|
+
if (!didChange) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
results[index].didChange = true;
|
|
165
|
+
changedResultIndexes.push(index);
|
|
166
|
+
});
|
|
167
|
+
if (changedResultIndexes.length > 0) {
|
|
168
|
+
const serializedSqls = yield (0, duckdb_ast_parse_serialize_1.serializeExpressions)(parsedExpressions, executeQuery);
|
|
169
|
+
const expectedSerializedCount = items.length;
|
|
170
|
+
if (serializedSqls.length !== expectedSerializedCount) {
|
|
171
|
+
throw new Error(`Expected ${expectedSerializedCount} serialized expressions, received ${serializedSqls.length}`);
|
|
172
|
+
}
|
|
173
|
+
changedResultIndexes.forEach((resultIndex) => {
|
|
174
|
+
const serializedSql = serializedSqls[resultIndex];
|
|
175
|
+
if (!serializedSql) {
|
|
176
|
+
throw new Error('Missing serialized SQL for batched expression');
|
|
177
|
+
}
|
|
178
|
+
results[resultIndex].sql = serializedSql;
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return results;
|
|
182
|
+
});
|
|
183
|
+
exports.ensureColumnAliasBatch = ensureColumnAliasBatch;
|
|
184
|
+
//# sourceMappingURL=ensure-sql-expression-column-alias.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-sql-expression-column-alias.js","sourceRoot":"","sources":["../../../../meerkat-core/src/utils/ensure-sql-expression-column-alias.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Dimension, Measure, TableSchema } from '../types/cube-types';
|
|
2
|
+
export type AliasableMember = Measure | Dimension;
|
|
3
|
+
type MemberType = 'measure' | 'dimension';
|
|
4
|
+
export interface EnsureAliasExpressionContext {
|
|
5
|
+
tableName: string;
|
|
6
|
+
memberName: string;
|
|
7
|
+
memberType: MemberType;
|
|
8
|
+
}
|
|
9
|
+
export interface EnsureTableSchemaAliasSqlParams {
|
|
10
|
+
tableSchemas: TableSchema[];
|
|
11
|
+
ensureExpressionAlias: (params: {
|
|
12
|
+
items: {
|
|
13
|
+
sql: string;
|
|
14
|
+
context: EnsureAliasExpressionContext;
|
|
15
|
+
}[];
|
|
16
|
+
}) => Promise<string[]>;
|
|
17
|
+
}
|
|
18
|
+
export declare const ensureTableSchemaAliasSql: ({ tableSchemas, ensureExpressionAlias, }: EnsureTableSchemaAliasSqlParams) => Promise<TableSchema[]>;
|
|
19
|
+
export {};
|