@memberjunction/core-entities-server 5.13.0 → 5.15.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/dist/custom/MJQueryEntityServer.server.d.ts +22 -1
- package/dist/custom/MJQueryEntityServer.server.d.ts.map +1 -1
- package/dist/custom/MJQueryEntityServer.server.js +120 -86
- package/dist/custom/MJQueryEntityServer.server.js.map +1 -1
- package/dist/engines/QueryEngineServer.d.ts +117 -0
- package/dist/engines/QueryEngineServer.d.ts.map +1 -0
- package/dist/engines/QueryEngineServer.js +251 -0
- package/dist/engines/QueryEngineServer.js.map +1 -0
- package/dist/engines/QueryMatchResult.d.ts +55 -0
- package/dist/engines/QueryMatchResult.d.ts.map +1 -0
- package/dist/engines/QueryMatchResult.js +2 -0
- package/dist/engines/QueryMatchResult.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +20 -18
- package/dist/custom/sql-parser.d.ts +0 -95
- package/dist/custom/sql-parser.d.ts.map +0 -1
- package/dist/custom/sql-parser.js +0 -313
- package/dist/custom/sql-parser.js.map +0 -1
|
@@ -1,313 +0,0 @@
|
|
|
1
|
-
import NodeSqlParser from 'node-sql-parser';
|
|
2
|
-
const { Parser } = NodeSqlParser;
|
|
3
|
-
import * as nunjucks from 'nunjucks';
|
|
4
|
-
/**
|
|
5
|
-
* Reusable SQL parsing utility that extracts table/view references and column references
|
|
6
|
-
* from SQL statements using node-sql-parser with a regex fallback.
|
|
7
|
-
*
|
|
8
|
-
* This class has no dependency on MJ Metadata — it returns raw parse results.
|
|
9
|
-
* Callers are responsible for cross-referencing against entity metadata.
|
|
10
|
-
*/
|
|
11
|
-
export class SQLParser {
|
|
12
|
-
/**
|
|
13
|
-
* Parse a plain SQL statement and extract all table and column references.
|
|
14
|
-
* Uses AST parsing with TransactSQL dialect, falls back to regex on failure.
|
|
15
|
-
*/
|
|
16
|
-
static Parse(sql) {
|
|
17
|
-
if (!sql || sql.trim().length === 0) {
|
|
18
|
-
return { Tables: [], Columns: [], UsedASTParsing: false };
|
|
19
|
-
}
|
|
20
|
-
const astResult = SQLParser.ParseViaAST(sql);
|
|
21
|
-
if (astResult) {
|
|
22
|
-
return astResult;
|
|
23
|
-
}
|
|
24
|
-
return SQLParser.ParseViaRegex(sql);
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Parse a SQL statement that may contain Nunjucks template syntax.
|
|
28
|
-
* Pre-processes templates into valid SQL before parsing.
|
|
29
|
-
*/
|
|
30
|
-
static ParseWithTemplatePreprocessing(sql) {
|
|
31
|
-
if (!sql || sql.trim().length === 0) {
|
|
32
|
-
return { Tables: [], Columns: [], UsedASTParsing: false };
|
|
33
|
-
}
|
|
34
|
-
const processedSQL = SQLParser.PreProcessNunjucksForParsing(sql);
|
|
35
|
-
return SQLParser.Parse(processedSQL);
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Attempt to parse SQL via node-sql-parser AST.
|
|
39
|
-
* Returns null if parsing fails (caller should fall back to regex).
|
|
40
|
-
*/
|
|
41
|
-
static ParseViaAST(sql) {
|
|
42
|
-
try {
|
|
43
|
-
const parser = new Parser();
|
|
44
|
-
const ast = parser.astify(sql, { database: 'TransactSQL' });
|
|
45
|
-
const tableAliasMap = new Map();
|
|
46
|
-
const columnRefs = new Set();
|
|
47
|
-
const statements = Array.isArray(ast) ? ast : [ast];
|
|
48
|
-
for (const statement of statements) {
|
|
49
|
-
SQLParser.ExtractFromAST(statement, tableAliasMap, columnRefs);
|
|
50
|
-
}
|
|
51
|
-
return SQLParser.BuildResult(tableAliasMap, columnRefs, true);
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Regex-based fallback for extracting table references from SQL.
|
|
59
|
-
* Less accurate than AST but handles edge cases where the parser fails.
|
|
60
|
-
*/
|
|
61
|
-
static ParseViaRegex(sql) {
|
|
62
|
-
const tableAliasMap = new Map();
|
|
63
|
-
const tablePattern = /(?:FROM|JOIN|INTO)\s+(?:\[?(\w+)\]?\.)?\[?(\w+)\]?(?:\s+(?:AS\s+)?(\w+))?/gi;
|
|
64
|
-
const matches = [...sql.matchAll(tablePattern)];
|
|
65
|
-
for (const match of matches) {
|
|
66
|
-
const schemaName = match[1] || 'dbo';
|
|
67
|
-
const tableName = match[2];
|
|
68
|
-
const alias = match[3] || tableName;
|
|
69
|
-
const key = alias;
|
|
70
|
-
if (!tableAliasMap.has(key)) {
|
|
71
|
-
tableAliasMap.set(key, { schemaName, tableName });
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// Regex can't reliably extract column references, return empty
|
|
75
|
-
return SQLParser.BuildResult(tableAliasMap, new Set(), false);
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Converts internal maps into the public SQLParseResult shape.
|
|
79
|
-
*/
|
|
80
|
-
static BuildResult(tableAliasMap, columnRefs, usedAST) {
|
|
81
|
-
const tables = SQLParser.DeduplicateTables(tableAliasMap);
|
|
82
|
-
const columns = SQLParser.ParseColumnRefs(columnRefs);
|
|
83
|
-
return { Tables: tables, Columns: columns, UsedASTParsing: usedAST };
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Deduplicates table references by schema.table key, keeping distinct entries.
|
|
87
|
-
*/
|
|
88
|
-
static DeduplicateTables(tableAliasMap) {
|
|
89
|
-
const seen = new Set();
|
|
90
|
-
const tables = [];
|
|
91
|
-
for (const [alias, info] of tableAliasMap) {
|
|
92
|
-
const key = `${info.schemaName.toLowerCase()}.${info.tableName.toLowerCase()}`;
|
|
93
|
-
if (!seen.has(key)) {
|
|
94
|
-
seen.add(key);
|
|
95
|
-
tables.push({
|
|
96
|
-
TableName: info.tableName,
|
|
97
|
-
SchemaName: info.schemaName,
|
|
98
|
-
Alias: alias
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return tables;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Converts raw column reference strings into structured SQLColumnReference objects.
|
|
106
|
-
*/
|
|
107
|
-
static ParseColumnRefs(columnRefs) {
|
|
108
|
-
const columns = [];
|
|
109
|
-
for (const ref of columnRefs) {
|
|
110
|
-
const dotIndex = ref.lastIndexOf('.');
|
|
111
|
-
if (dotIndex >= 0) {
|
|
112
|
-
columns.push({
|
|
113
|
-
ColumnName: ref.substring(dotIndex + 1),
|
|
114
|
-
TableQualifier: ref.substring(0, dotIndex)
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
columns.push({ ColumnName: ref, TableQualifier: null });
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
return columns;
|
|
122
|
-
}
|
|
123
|
-
// ─────────────────────────────────────────────────────
|
|
124
|
-
// AST Walking (moved from MJQueryEntityServer)
|
|
125
|
-
// ─────────────────────────────────────────────────────
|
|
126
|
-
/**
|
|
127
|
-
* Recursively extracts table references and column references from SQL AST.
|
|
128
|
-
*/
|
|
129
|
-
static ExtractFromAST(node, tableAliasMap, referencedColumns) {
|
|
130
|
-
if (!node || typeof node !== 'object')
|
|
131
|
-
return;
|
|
132
|
-
// Handle CTEs (WITH clause)
|
|
133
|
-
if (node.with) {
|
|
134
|
-
const ctes = Array.isArray(node.with) ? node.with : [node.with];
|
|
135
|
-
for (const cte of ctes) {
|
|
136
|
-
const cteRecord = cte;
|
|
137
|
-
if (cteRecord.stmt) {
|
|
138
|
-
const stmtRecord = cteRecord.stmt;
|
|
139
|
-
const cteAst = (stmtRecord.ast || stmtRecord);
|
|
140
|
-
SQLParser.ExtractFromAST(cteAst, tableAliasMap, referencedColumns);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
// Extract FROM clause tables (including JOINs)
|
|
145
|
-
if (node.from) {
|
|
146
|
-
const fromItems = Array.isArray(node.from) ? node.from : [node.from];
|
|
147
|
-
for (const fromItem of fromItems) {
|
|
148
|
-
SQLParser.ExtractTableFromItem(fromItem, tableAliasMap, referencedColumns);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
// Extract column references from SELECT
|
|
152
|
-
if (node.columns) {
|
|
153
|
-
const cols = Array.isArray(node.columns) ? node.columns : [node.columns];
|
|
154
|
-
for (const col of cols) {
|
|
155
|
-
if (col === '*')
|
|
156
|
-
continue;
|
|
157
|
-
const colRecord = col;
|
|
158
|
-
if (colRecord.expr) {
|
|
159
|
-
SQLParser.ExtractColumnReferences(colRecord.expr, referencedColumns, tableAliasMap);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
// Extract column references from WHERE
|
|
164
|
-
if (node.where) {
|
|
165
|
-
SQLParser.ExtractColumnReferences(node.where, referencedColumns, tableAliasMap);
|
|
166
|
-
}
|
|
167
|
-
// Extract column references from GROUP BY
|
|
168
|
-
if (node.groupby) {
|
|
169
|
-
const groupbyRecord = node.groupby;
|
|
170
|
-
const groupItems = groupbyRecord.columns || node.groupby;
|
|
171
|
-
const items = Array.isArray(groupItems) ? groupItems : [groupItems];
|
|
172
|
-
for (const group of items) {
|
|
173
|
-
SQLParser.ExtractColumnReferences(group, referencedColumns, tableAliasMap);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
// Extract column references from ORDER BY
|
|
177
|
-
if (node.orderby) {
|
|
178
|
-
const orders = Array.isArray(node.orderby) ? node.orderby : [node.orderby];
|
|
179
|
-
for (const order of orders) {
|
|
180
|
-
const orderRecord = order;
|
|
181
|
-
SQLParser.ExtractColumnReferences((orderRecord.expr || orderRecord), referencedColumns, tableAliasMap);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
// Handle UNION/INTERSECT/EXCEPT
|
|
185
|
-
if (node._next) {
|
|
186
|
-
SQLParser.ExtractFromAST(node._next, tableAliasMap, referencedColumns);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* Extracts table information from a FROM clause item, handling tables and JOINs.
|
|
191
|
-
*/
|
|
192
|
-
static ExtractTableFromItem(fromItem, tableAliasMap, referencedColumns) {
|
|
193
|
-
if (!fromItem)
|
|
194
|
-
return;
|
|
195
|
-
// Direct table reference
|
|
196
|
-
if (fromItem.table) {
|
|
197
|
-
const alias = (fromItem.as || fromItem.table);
|
|
198
|
-
tableAliasMap.set(alias, {
|
|
199
|
-
schemaName: fromItem.db || 'dbo',
|
|
200
|
-
tableName: fromItem.table
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
// Handle subqueries in FROM (derived tables)
|
|
204
|
-
if (fromItem.expr) {
|
|
205
|
-
const exprRecord = fromItem.expr;
|
|
206
|
-
const subqueryAst = (exprRecord.ast || exprRecord);
|
|
207
|
-
SQLParser.ExtractFromAST(subqueryAst, tableAliasMap, referencedColumns);
|
|
208
|
-
}
|
|
209
|
-
// Extract column references from ON conditions
|
|
210
|
-
if (fromItem.on) {
|
|
211
|
-
SQLParser.ExtractColumnReferences(fromItem.on, referencedColumns, tableAliasMap);
|
|
212
|
-
}
|
|
213
|
-
// Handle USING clause
|
|
214
|
-
if (fromItem.using) {
|
|
215
|
-
const usings = Array.isArray(fromItem.using) ? fromItem.using : [fromItem.using];
|
|
216
|
-
for (const col of usings) {
|
|
217
|
-
if (typeof col === 'string') {
|
|
218
|
-
referencedColumns.add(col);
|
|
219
|
-
}
|
|
220
|
-
else if (col && typeof col === 'object' && 'column' in col) {
|
|
221
|
-
referencedColumns.add(col.column);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Extracts column references from an expression node.
|
|
228
|
-
* Also extracts tables from subqueries found in expressions (e.g., EXISTS, IN).
|
|
229
|
-
*/
|
|
230
|
-
static ExtractColumnReferences(expr, referencedColumns, tableAliasMap) {
|
|
231
|
-
if (!expr || typeof expr !== 'object')
|
|
232
|
-
return;
|
|
233
|
-
if (expr.type === 'column_ref') {
|
|
234
|
-
const colName = expr.table ? `${expr.table}.${expr.column}` : expr.column;
|
|
235
|
-
referencedColumns.add(colName);
|
|
236
|
-
}
|
|
237
|
-
// Handle subqueries in expressions (EXISTS, IN, scalar subqueries)
|
|
238
|
-
if (expr.ast && tableAliasMap) {
|
|
239
|
-
SQLParser.ExtractFromAST(expr.ast, tableAliasMap, referencedColumns);
|
|
240
|
-
}
|
|
241
|
-
// Recursively process nested expressions
|
|
242
|
-
if (expr.left) {
|
|
243
|
-
SQLParser.ExtractColumnReferences(expr.left, referencedColumns, tableAliasMap);
|
|
244
|
-
}
|
|
245
|
-
if (expr.right) {
|
|
246
|
-
SQLParser.ExtractColumnReferences(expr.right, referencedColumns, tableAliasMap);
|
|
247
|
-
}
|
|
248
|
-
if (expr.args) {
|
|
249
|
-
const argsRecord = expr.args;
|
|
250
|
-
const args = argsRecord.value || expr.args;
|
|
251
|
-
const argList = Array.isArray(args) ? args : [args];
|
|
252
|
-
for (const arg of argList) {
|
|
253
|
-
SQLParser.ExtractColumnReferences(arg, referencedColumns, tableAliasMap);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
if (expr.expr) {
|
|
257
|
-
SQLParser.ExtractColumnReferences(expr.expr, referencedColumns, tableAliasMap);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
// ─────────────────────────────────────────────────────
|
|
261
|
-
// Nunjucks Preprocessing (moved from MJQueryEntityServer)
|
|
262
|
-
// ─────────────────────────────────────────────────────
|
|
263
|
-
/**
|
|
264
|
-
* Pre-processes Nunjucks templates in SQL to create valid SQL for parsing.
|
|
265
|
-
* Replaces Nunjucks syntax with placeholder values.
|
|
266
|
-
*/
|
|
267
|
-
static PreProcessNunjucksForParsing(sql) {
|
|
268
|
-
const env = new nunjucks.Environment(null, {
|
|
269
|
-
autoescape: false,
|
|
270
|
-
throwOnUndefined: false
|
|
271
|
-
});
|
|
272
|
-
// Add placeholder filters that return safe SQL values
|
|
273
|
-
env.addFilter('sqlString', () => "'placeholder'");
|
|
274
|
-
env.addFilter('sqlNumber', () => '0');
|
|
275
|
-
env.addFilter('sqlDate', () => "'2000-01-01'");
|
|
276
|
-
env.addFilter('sqlIn', () => "('placeholder')");
|
|
277
|
-
env.addFilter('sqlIdentifier', (val) => val || 'placeholder');
|
|
278
|
-
env.addFilter('sqlNoKeywordsExpression', (val) => val || 'placeholder');
|
|
279
|
-
env.addFilter('default', (val, defaultVal) => val || defaultVal || 'placeholder');
|
|
280
|
-
env.addFilter('safe', (val) => val || 'placeholder');
|
|
281
|
-
env.addFilter('dump', (val) => JSON.stringify(val || {}));
|
|
282
|
-
try {
|
|
283
|
-
return env.renderString(sql, {});
|
|
284
|
-
}
|
|
285
|
-
catch {
|
|
286
|
-
return SQLParser.PreProcessNunjucksViaRegex(sql);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
/**
|
|
290
|
-
* Regex fallback for Nunjucks preprocessing when rendering fails.
|
|
291
|
-
*/
|
|
292
|
-
static PreProcessNunjucksViaRegex(sql) {
|
|
293
|
-
let processed = sql;
|
|
294
|
-
// Replace {{ variable | filter }} patterns
|
|
295
|
-
processed = processed.replace(/\{\{\s*[\w.]+\s*\|\s*sqlString\s*\}\}/g, "'placeholder'");
|
|
296
|
-
processed = processed.replace(/\{\{\s*[\w.]+\s*\|\s*sqlNumber\s*\}\}/g, '0');
|
|
297
|
-
processed = processed.replace(/\{\{\s*[\w.]+\s*\|\s*sqlDate\s*\}\}/g, "'2000-01-01'");
|
|
298
|
-
processed = processed.replace(/\{\{\s*[\w.]+\s*\|\s*sqlIn\s*\}\}/g, "('placeholder')");
|
|
299
|
-
processed = processed.replace(/\{\{\s*[\w.]+\s*\|\s*sqlIdentifier\s*\}\}/g, 'placeholder');
|
|
300
|
-
processed = processed.replace(/\{\{\s*[\w.]+\s*[^}]*\}\}/g, "'placeholder'");
|
|
301
|
-
// Remove block tags but keep content between them
|
|
302
|
-
processed = processed.replace(/\{%\s*if\s+[^%]+%\}/g, '');
|
|
303
|
-
processed = processed.replace(/\{%\s*endif\s*%\}/g, '');
|
|
304
|
-
processed = processed.replace(/\{%\s*else\s*%\}/g, '');
|
|
305
|
-
processed = processed.replace(/\{%\s*elif\s+[^%]+%\}/g, '');
|
|
306
|
-
processed = processed.replace(/\{%\s*for\s+[^%]+%\}/g, '');
|
|
307
|
-
processed = processed.replace(/\{%\s*endfor\s*%\}/g, '');
|
|
308
|
-
processed = processed.replace(/\{%\s*set\s+[^%]+%\}/g, '');
|
|
309
|
-
processed = processed.replace(/\{#[^#]*#\}/g, ''); // Comments
|
|
310
|
-
return processed;
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
//# sourceMappingURL=sql-parser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sql-parser.js","sourceRoot":"","sources":["../../src/custom/sql-parser.ts"],"names":[],"mappings":"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"}
|