@webda/ql 4.0.0-beta.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/LICENSE +166 -0
- package/README.md +3 -0
- package/lib/WebdaQLLexer.d.ts +54 -0
- package/lib/WebdaQLLexer.js +295 -0
- package/lib/WebdaQLLexer.js.map +1 -0
- package/lib/WebdaQLParserLexer.d.ts +54 -0
- package/lib/WebdaQLParserLexer.js +295 -0
- package/lib/WebdaQLParserLexer.js.map +1 -0
- package/lib/WebdaQLParserListener.d.ts +296 -0
- package/lib/WebdaQLParserListener.js +3 -0
- package/lib/WebdaQLParserListener.js.map +1 -0
- package/lib/WebdaQLParserParser.d.ts +311 -0
- package/lib/WebdaQLParserParser.js +1807 -0
- package/lib/WebdaQLParserParser.js.map +1 -0
- package/lib/WebdaQLParserVisitor.d.ts +181 -0
- package/lib/WebdaQLParserVisitor.js +3 -0
- package/lib/WebdaQLParserVisitor.js.map +1 -0
- package/lib/query.d.ts +385 -0
- package/lib/query.js +646 -0
- package/lib/query.js.map +1 -0
- package/lib/query.spec.d.ts +1 -0
- package/lib/query.spec.js +199 -0
- package/lib/query.spec.js.map +1 -0
- package/package.json +67 -0
package/lib/query.js
ADDED
|
@@ -0,0 +1,646 @@
|
|
|
1
|
+
import { CharStreams, CommonTokenStream } from "antlr4ts";
|
|
2
|
+
import { AbstractParseTreeVisitor, TerminalNode } from "antlr4ts/tree/index.js";
|
|
3
|
+
import { WebdaQLLexer } from "./WebdaQLLexer.js";
|
|
4
|
+
import { OrderFieldExpressionContext, SubExpressionContext, WebdaQLParserParser } from "./WebdaQLParserParser.js";
|
|
5
|
+
export function PrependCondition(query = "", condition) {
|
|
6
|
+
if (!condition) {
|
|
7
|
+
return query;
|
|
8
|
+
}
|
|
9
|
+
query = query.trim();
|
|
10
|
+
// Find the right part of the query this regex will always be true as all part are optional
|
|
11
|
+
const rightPart = query.match(/(?<order>ORDER BY ([a-zA-Z0-9\._]+( DESC| ASC)?,?)+ ?)?(?<offset>OFFSET ["']\w+["'] ?)?(?<limit>LIMIT \d+)?$/);
|
|
12
|
+
// Remove it if found
|
|
13
|
+
query = query.substring(0, query.length - rightPart[0].length).trim();
|
|
14
|
+
// Add the condition to the query now
|
|
15
|
+
if (!query) {
|
|
16
|
+
query = condition;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
query = `(${condition}) AND (${query})`;
|
|
20
|
+
}
|
|
21
|
+
// Re-add the right part
|
|
22
|
+
if (rightPart[0].length) {
|
|
23
|
+
query += " " + rightPart[0];
|
|
24
|
+
}
|
|
25
|
+
return query;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create Expression based on the parsed token
|
|
29
|
+
*
|
|
30
|
+
* Expression allow to optimize and split between Query and Filter
|
|
31
|
+
*/
|
|
32
|
+
export class ExpressionBuilder extends AbstractParseTreeVisitor {
|
|
33
|
+
/**
|
|
34
|
+
* Default result for the override
|
|
35
|
+
* @returns
|
|
36
|
+
*/
|
|
37
|
+
defaultResult() {
|
|
38
|
+
// An empty AND return true
|
|
39
|
+
return {
|
|
40
|
+
filter: new AndExpression([])
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get offset
|
|
45
|
+
* @returns
|
|
46
|
+
*/
|
|
47
|
+
getOffset() {
|
|
48
|
+
return this.offset;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get limit
|
|
52
|
+
* @returns
|
|
53
|
+
*/
|
|
54
|
+
getLimit() {
|
|
55
|
+
return this.limit;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Read the limit
|
|
59
|
+
* @param ctx
|
|
60
|
+
*/
|
|
61
|
+
visitLimitExpression(ctx) {
|
|
62
|
+
this.limit = this.visitIntegerLiteral(ctx.getChild(1));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Read the offset if provided
|
|
66
|
+
* @param ctx
|
|
67
|
+
*/
|
|
68
|
+
visitOffsetExpression(ctx) {
|
|
69
|
+
this.offset = this.visitStringLiteral(ctx.getChild(1));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Visit a order field expression
|
|
73
|
+
*/
|
|
74
|
+
visitOrderFieldExpression(ctx) {
|
|
75
|
+
return {
|
|
76
|
+
field: ctx.getChild(0).text,
|
|
77
|
+
direction: ctx.childCount > 1 ? ctx.getChild(1).text : "ASC"
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Read the order by values
|
|
82
|
+
*/
|
|
83
|
+
visitOrderExpression(ctx) {
|
|
84
|
+
this.orderBy = ctx.children
|
|
85
|
+
?.filter(c => c instanceof OrderFieldExpressionContext)
|
|
86
|
+
.map((c) => this.visitOrderFieldExpression(c));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Return only AndExpression
|
|
90
|
+
* @param ctx
|
|
91
|
+
* @returns
|
|
92
|
+
*/
|
|
93
|
+
visitWebdaql(ctx) {
|
|
94
|
+
if (ctx.childCount === 1) {
|
|
95
|
+
// An empty AND return true
|
|
96
|
+
return {
|
|
97
|
+
filter: new AndExpression([])
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// To parse offset and limit and order by
|
|
101
|
+
for (let i = 1; i < ctx.childCount - 1; i++) {
|
|
102
|
+
this.visit(ctx.getChild(i));
|
|
103
|
+
}
|
|
104
|
+
// If the first element is a sub expression, it means we have a filter
|
|
105
|
+
if (ctx.getChild(0) instanceof SubExpressionContext) {
|
|
106
|
+
return {
|
|
107
|
+
filter: this.visit(ctx.getChild(0).getChild(1)) || new AndExpression([]),
|
|
108
|
+
limit: this.limit,
|
|
109
|
+
continuationToken: this.offset,
|
|
110
|
+
orderBy: this.orderBy
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
// Go down one level - if expression empty it means no expression were provided
|
|
114
|
+
return {
|
|
115
|
+
filter: this.visit(ctx.getChild(0)) || new AndExpression([]),
|
|
116
|
+
limit: this.limit,
|
|
117
|
+
continuationToken: this.offset,
|
|
118
|
+
orderBy: this.orderBy
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Simplify Logic expression and regroup them
|
|
123
|
+
* @param ctx
|
|
124
|
+
* @returns
|
|
125
|
+
*/
|
|
126
|
+
getComparison(ctx) {
|
|
127
|
+
const res = [];
|
|
128
|
+
let [left, _, right] = ctx.children;
|
|
129
|
+
if (right instanceof SubExpressionContext) {
|
|
130
|
+
right = right.getChild(1);
|
|
131
|
+
}
|
|
132
|
+
if (left instanceof SubExpressionContext) {
|
|
133
|
+
left = left.getChild(1);
|
|
134
|
+
}
|
|
135
|
+
if (left instanceof ctx.constructor) {
|
|
136
|
+
res.push(...this.getComparison(left));
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
res.push(left);
|
|
140
|
+
}
|
|
141
|
+
if (right instanceof ctx.constructor) {
|
|
142
|
+
res.push(...this.getComparison(right));
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
res.push(right);
|
|
146
|
+
}
|
|
147
|
+
return res;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get the AndExpression, regrouping all the parameters
|
|
151
|
+
*
|
|
152
|
+
* By default the parser is doing a AND (b AND (c AND d)) creating 3 depth expressions
|
|
153
|
+
* This visitor simplify to a AND b AND c AND d with only one Expression
|
|
154
|
+
*/
|
|
155
|
+
visitAndLogicExpression(ctx) {
|
|
156
|
+
return new AndExpression(this.getComparison(ctx).map(c => this.visit(c)));
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Implement the BinaryComparison with all methods managed
|
|
160
|
+
*/
|
|
161
|
+
visitBinaryComparisonExpression(ctx) {
|
|
162
|
+
const [left, op, right] = ctx.children;
|
|
163
|
+
// @ts-ignore
|
|
164
|
+
return new ComparisonExpression(op.text, left.text, this.visit(right));
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Visit each value of the [..., ..., ...] set
|
|
168
|
+
*/
|
|
169
|
+
visitSetExpression(ctx) {
|
|
170
|
+
return ctx.children.filter((_i, id) => id % 2).map(c => this.visit(c));
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* a LIKE "%A?"
|
|
174
|
+
* @param ctx
|
|
175
|
+
* @returns
|
|
176
|
+
*/
|
|
177
|
+
visitLikeExpression(ctx) {
|
|
178
|
+
const [left, _, right] = ctx.children;
|
|
179
|
+
let value = this.visit(right);
|
|
180
|
+
return new ComparisonExpression("LIKE", left.text, value);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Map the a IN ['b','c']
|
|
184
|
+
*/
|
|
185
|
+
visitInExpression(ctx) {
|
|
186
|
+
const [left, _, right] = ctx.children;
|
|
187
|
+
let value = this.visit(right);
|
|
188
|
+
return new ComparisonExpression("IN", left.text, value);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Map the a CONTAINS 'b'
|
|
192
|
+
*/
|
|
193
|
+
visitContainsExpression(ctx) {
|
|
194
|
+
const [left, _, right] = ctx.children;
|
|
195
|
+
let value = this.visit(right);
|
|
196
|
+
return new ComparisonExpression("CONTAINS", left.text, value);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get the OrExpression, regrouping all the parameters
|
|
200
|
+
*
|
|
201
|
+
* By default the parser is doing a OR (b OR (c OR d)) creating 3 depth expressions
|
|
202
|
+
* This visitor simplify to a OR b OR c OR d with only one Expression
|
|
203
|
+
*/
|
|
204
|
+
visitOrLogicExpression(ctx) {
|
|
205
|
+
return new OrExpression(this.getComparison(ctx).map(c => this.visit(c)));
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Read the string literal (removing the simple or double bracket)
|
|
209
|
+
*/
|
|
210
|
+
visitStringLiteral(ctx) {
|
|
211
|
+
return ctx.text.substring(1, ctx.text.length - 1);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Read the boolean literal
|
|
215
|
+
*/
|
|
216
|
+
visitBooleanLiteral(ctx) {
|
|
217
|
+
return "TRUE" === ctx.text;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Read the number literal
|
|
221
|
+
*/
|
|
222
|
+
visitIntegerLiteral(ctx) {
|
|
223
|
+
return parseInt(ctx.text);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Represent the query expression or subset
|
|
228
|
+
*/
|
|
229
|
+
export class Expression {
|
|
230
|
+
constructor(operator) {
|
|
231
|
+
this.operator = operator;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Comparison expression
|
|
236
|
+
*/
|
|
237
|
+
export class ComparisonExpression extends Expression {
|
|
238
|
+
/**
|
|
239
|
+
*
|
|
240
|
+
* @param operator of the expression
|
|
241
|
+
* @param attribute of the object to read
|
|
242
|
+
* @param value
|
|
243
|
+
*/
|
|
244
|
+
constructor(operator, attribute, value) {
|
|
245
|
+
super(operator);
|
|
246
|
+
this.value = value;
|
|
247
|
+
this.attribute = attribute.split(".");
|
|
248
|
+
}
|
|
249
|
+
static likeToRegex(like) {
|
|
250
|
+
return new RegExp(like
|
|
251
|
+
// Prevent common regexp chars
|
|
252
|
+
.replace(/\?/g, "\\?")
|
|
253
|
+
.replace(/\[/g, "\\[")
|
|
254
|
+
.replace(/\{/g, "\\{")
|
|
255
|
+
.replace(/\(/g, "\\(")
|
|
256
|
+
// Update % and _ to match regex version
|
|
257
|
+
.replace(/([^\\])_/g, "$1.{1}")
|
|
258
|
+
.replace(/^_/g, ".{1}")
|
|
259
|
+
.replace(/\\_/g, "_")
|
|
260
|
+
.replace(/([^\\])%/g, "$1.*")
|
|
261
|
+
.replace(/^%/g, ".*")
|
|
262
|
+
.replace(/\\%/g, "%")
|
|
263
|
+
// Replace backslash aswell
|
|
264
|
+
.replace(/\\([^?[{(])/g, "\\\\"));
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Read the value from the object
|
|
268
|
+
*
|
|
269
|
+
* @param target
|
|
270
|
+
* @returns
|
|
271
|
+
*/
|
|
272
|
+
static getAttributeValue(target, attribute) {
|
|
273
|
+
let res = target;
|
|
274
|
+
for (let i = 0; res && i < attribute.length; i++) {
|
|
275
|
+
res = res[attribute[i]];
|
|
276
|
+
}
|
|
277
|
+
return res;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Set the value of the attribute based on the assignment
|
|
281
|
+
*
|
|
282
|
+
* If used as a Set expression
|
|
283
|
+
* @param target
|
|
284
|
+
*/
|
|
285
|
+
setAttributeValue(target) {
|
|
286
|
+
var _a;
|
|
287
|
+
// Avoid alteration of prototype for security reason
|
|
288
|
+
if (this.attribute.includes("__proto__")) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
if (this.operator === "=") {
|
|
292
|
+
let res = target;
|
|
293
|
+
for (let i = 0; res && i < this.attribute.length - 1; i++) {
|
|
294
|
+
res[_a = this.attribute[i]] ?? (res[_a] = {});
|
|
295
|
+
res = res[this.attribute[i]];
|
|
296
|
+
}
|
|
297
|
+
res[this.attribute[this.attribute.length - 1]] = this.value;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* @override
|
|
302
|
+
*/
|
|
303
|
+
eval(target) {
|
|
304
|
+
const left = ComparisonExpression.getAttributeValue(target, this.attribute);
|
|
305
|
+
switch (this.operator) {
|
|
306
|
+
case "=":
|
|
307
|
+
// ignore strong type on purpose
|
|
308
|
+
return left == this.value;
|
|
309
|
+
case "<=":
|
|
310
|
+
return left <= this.value;
|
|
311
|
+
case ">=":
|
|
312
|
+
return left >= this.value;
|
|
313
|
+
case "<":
|
|
314
|
+
return left < this.value;
|
|
315
|
+
case ">":
|
|
316
|
+
return left > this.value;
|
|
317
|
+
case "!=":
|
|
318
|
+
return left != this.value;
|
|
319
|
+
case "LIKE":
|
|
320
|
+
if (typeof left === "string") {
|
|
321
|
+
// Grammar definie value as stringLiteral
|
|
322
|
+
return left.match(ComparisonExpression.likeToRegex(this.value)) !== null;
|
|
323
|
+
}
|
|
324
|
+
return left.toString().match(ComparisonExpression.likeToRegex(this.value)) !== null;
|
|
325
|
+
case "IN":
|
|
326
|
+
return this.value.includes(left);
|
|
327
|
+
case "CONTAINS":
|
|
328
|
+
if (Array.isArray(left)) {
|
|
329
|
+
return left.includes(this.value);
|
|
330
|
+
}
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Return a string represantation of a value
|
|
336
|
+
*/
|
|
337
|
+
toStringValue(value) {
|
|
338
|
+
if (Array.isArray(value)) {
|
|
339
|
+
return `[${value.map(v => this.toStringValue(v)).join(", ")}]`;
|
|
340
|
+
}
|
|
341
|
+
switch (typeof value) {
|
|
342
|
+
case "string":
|
|
343
|
+
return `"${value}"`;
|
|
344
|
+
case "boolean":
|
|
345
|
+
return value.toString().toUpperCase();
|
|
346
|
+
}
|
|
347
|
+
return value?.toString();
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Allow subclass to create different display
|
|
351
|
+
*/
|
|
352
|
+
toStringAttribute() {
|
|
353
|
+
return this.attribute.join(".");
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Allow subclass to create different display
|
|
357
|
+
*/
|
|
358
|
+
toStringOperator() {
|
|
359
|
+
return this.operator;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* @override
|
|
363
|
+
*/
|
|
364
|
+
toString() {
|
|
365
|
+
return `${this.toStringAttribute()} ${this.toStringOperator()} ${this.toStringValue(this.value)}`;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Abstract logic expression (AND|OR)
|
|
370
|
+
*
|
|
371
|
+
* Could add XOR in the future
|
|
372
|
+
*/
|
|
373
|
+
export class LogicalExpression extends Expression {
|
|
374
|
+
/**
|
|
375
|
+
*
|
|
376
|
+
* @param operator
|
|
377
|
+
* @param children
|
|
378
|
+
*/
|
|
379
|
+
constructor(operator, children) {
|
|
380
|
+
super(operator);
|
|
381
|
+
/**
|
|
382
|
+
* Contains the members of the logical expression
|
|
383
|
+
*/
|
|
384
|
+
this.children = [];
|
|
385
|
+
this.children = children;
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* @override
|
|
389
|
+
*/
|
|
390
|
+
toString(depth = 0) {
|
|
391
|
+
if (depth) {
|
|
392
|
+
return "( " + this.children.map(c => c.toString(depth + 1)).join(` ${this.operator} `) + " )";
|
|
393
|
+
}
|
|
394
|
+
return this.children.map(c => c.toString(depth + 1)).join(` ${this.operator} `);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* AND Expression implementation
|
|
399
|
+
*/
|
|
400
|
+
export class AndExpression extends LogicalExpression {
|
|
401
|
+
/**
|
|
402
|
+
* @param children Expressions to use for AND
|
|
403
|
+
*/
|
|
404
|
+
constructor(children) {
|
|
405
|
+
super("AND", children);
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* @override
|
|
409
|
+
*/
|
|
410
|
+
eval(target) {
|
|
411
|
+
for (let child of this.children) {
|
|
412
|
+
if (!child.eval(target)) {
|
|
413
|
+
return false;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return true;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* OR Expression implementation
|
|
421
|
+
*/
|
|
422
|
+
export class OrExpression extends LogicalExpression {
|
|
423
|
+
/**
|
|
424
|
+
* @param children Expressions to use for OR
|
|
425
|
+
*/
|
|
426
|
+
constructor(children) {
|
|
427
|
+
super("OR", children);
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* @override
|
|
431
|
+
*/
|
|
432
|
+
eval(target) {
|
|
433
|
+
for (let child of this.children) {
|
|
434
|
+
if (child.eval(target)) {
|
|
435
|
+
return true;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
return this.children.length === 0;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
*
|
|
443
|
+
*/
|
|
444
|
+
export class QueryValidator {
|
|
445
|
+
constructor(sql, builder = new ExpressionBuilder()) {
|
|
446
|
+
this.sql = sql;
|
|
447
|
+
this.lexer = new WebdaQLLexer(CharStreams.fromString(sql || ""));
|
|
448
|
+
let tokenStream = new CommonTokenStream(this.lexer);
|
|
449
|
+
let parser = new WebdaQLParserParser(tokenStream);
|
|
450
|
+
parser.removeErrorListeners();
|
|
451
|
+
parser.addErrorListener({
|
|
452
|
+
syntaxError: (_recognizer, _offendingSymbol, _line, _charPositionInLine, msg, _e) => {
|
|
453
|
+
throw new SyntaxError(`${msg} (Query: ${sql})`);
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
// Parse the input, where `compilationUnit` is whatever entry point you defined
|
|
457
|
+
this.tree = parser.webdaql();
|
|
458
|
+
this.builder = builder;
|
|
459
|
+
this.query = this.builder.visit(this.tree);
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Get offset
|
|
463
|
+
* @returns
|
|
464
|
+
*/
|
|
465
|
+
getOffset() {
|
|
466
|
+
return this.builder.getOffset() || "";
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Get limit
|
|
470
|
+
* @returns
|
|
471
|
+
*/
|
|
472
|
+
getLimit() {
|
|
473
|
+
return this.builder.getLimit() || 1000;
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Get the expression by itself
|
|
477
|
+
* @returns
|
|
478
|
+
*/
|
|
479
|
+
getExpression() {
|
|
480
|
+
return this.query.filter;
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Retrieve parsed query
|
|
484
|
+
* @returns
|
|
485
|
+
*/
|
|
486
|
+
getQuery() {
|
|
487
|
+
return {
|
|
488
|
+
...this.query,
|
|
489
|
+
// Use displayTree to get the truely executed query
|
|
490
|
+
toString: () => this.displayTree()
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Verify if a target fit the expression
|
|
495
|
+
* @param target
|
|
496
|
+
* @returns
|
|
497
|
+
*/
|
|
498
|
+
eval(target) {
|
|
499
|
+
return this.query.filter.eval(target);
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Display parse tree back as query
|
|
503
|
+
* @param tree
|
|
504
|
+
* @returns
|
|
505
|
+
*/
|
|
506
|
+
displayTree(tree = this.tree) {
|
|
507
|
+
let res = "";
|
|
508
|
+
for (let i = 0; i < tree.childCount; i++) {
|
|
509
|
+
const child = tree.getChild(i);
|
|
510
|
+
if (child instanceof TerminalNode) {
|
|
511
|
+
if (child.text === "<EOF>") {
|
|
512
|
+
continue;
|
|
513
|
+
}
|
|
514
|
+
res += child.text.trim() + " ";
|
|
515
|
+
}
|
|
516
|
+
else {
|
|
517
|
+
res += this.displayTree(child).trim() + " ";
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
return res;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* For now reuse same parser
|
|
525
|
+
*/
|
|
526
|
+
export class SetterValidator extends QueryValidator {
|
|
527
|
+
constructor(sql) {
|
|
528
|
+
super(sql);
|
|
529
|
+
// Do one empty run to raise any issue with disallowed expression
|
|
530
|
+
this.eval({});
|
|
531
|
+
}
|
|
532
|
+
eval(target) {
|
|
533
|
+
if (this.query.filter) {
|
|
534
|
+
this.assign(target, this.query.filter);
|
|
535
|
+
}
|
|
536
|
+
return true;
|
|
537
|
+
}
|
|
538
|
+
assign(target, expression) {
|
|
539
|
+
if (expression instanceof AndExpression) {
|
|
540
|
+
expression.children.forEach(c => this.assign(target, c));
|
|
541
|
+
}
|
|
542
|
+
else if (expression instanceof ComparisonExpression && expression.operator === "=") {
|
|
543
|
+
expression.setAttributeValue(target);
|
|
544
|
+
}
|
|
545
|
+
else {
|
|
546
|
+
throw new SyntaxError(`Set Expression can only contain And and assignment expression '='`);
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
export class PartialValidator extends QueryValidator {
|
|
551
|
+
constructor(query, builder = new PartialExpressionBuilder()) {
|
|
552
|
+
super(query, builder);
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Eval the query
|
|
556
|
+
* @param target
|
|
557
|
+
* @param partial
|
|
558
|
+
* @returns
|
|
559
|
+
*/
|
|
560
|
+
eval(target, partial = true) {
|
|
561
|
+
this.builder.setPartial(partial);
|
|
562
|
+
this.builder.setPartialMatch(false);
|
|
563
|
+
return this.query.filter.eval(target);
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Return if the result ignored some fields
|
|
567
|
+
* @returns
|
|
568
|
+
*/
|
|
569
|
+
wasPartialMatch() {
|
|
570
|
+
return this.builder.partialMatch;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
export class PartialComparisonExpression extends ComparisonExpression {
|
|
574
|
+
constructor(builder, op, attribute, value) {
|
|
575
|
+
super(op, attribute, value);
|
|
576
|
+
this.builder = builder;
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* Override the eval to check if the attribute is present
|
|
580
|
+
* if not and we are in partial mode, return true
|
|
581
|
+
*
|
|
582
|
+
* @param target
|
|
583
|
+
* @returns
|
|
584
|
+
*/
|
|
585
|
+
eval(target) {
|
|
586
|
+
if (this.builder.partial) {
|
|
587
|
+
const left = ComparisonExpression.getAttributeValue(target, this.attribute);
|
|
588
|
+
if (left === undefined) {
|
|
589
|
+
this.builder.setPartialMatch(true);
|
|
590
|
+
return true;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
return super.eval(target);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
export class PartialExpressionBuilder extends ExpressionBuilder {
|
|
597
|
+
setPartial(partial) {
|
|
598
|
+
this.partial = partial;
|
|
599
|
+
}
|
|
600
|
+
setPartialMatch(partial) {
|
|
601
|
+
this.partialMatch = partial;
|
|
602
|
+
}
|
|
603
|
+
/**
|
|
604
|
+
* a LIKE "%A?"
|
|
605
|
+
* @param ctx
|
|
606
|
+
* @returns
|
|
607
|
+
*/
|
|
608
|
+
visitLikeExpression(ctx) {
|
|
609
|
+
const [left, _, right] = ctx.children;
|
|
610
|
+
let value = this.visit(right);
|
|
611
|
+
return new PartialComparisonExpression(this, "LIKE", left.text, value);
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Implement the BinaryComparison with all methods managed
|
|
615
|
+
*/
|
|
616
|
+
visitBinaryComparisonExpression(ctx) {
|
|
617
|
+
const [left, op, right] = ctx.children;
|
|
618
|
+
// @ts-ignore
|
|
619
|
+
return new PartialComparisonExpression(this, op.text, left.text, this.visit(right));
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* Map the a IN ['b','c']
|
|
623
|
+
*/
|
|
624
|
+
visitInExpression(ctx) {
|
|
625
|
+
const [left, _, right] = ctx.children;
|
|
626
|
+
let value = this.visit(right);
|
|
627
|
+
return new PartialComparisonExpression(this, "IN", left.text, value);
|
|
628
|
+
}
|
|
629
|
+
/**
|
|
630
|
+
* Map the a CONTAINS 'b'
|
|
631
|
+
*/
|
|
632
|
+
visitContainsExpression(ctx) {
|
|
633
|
+
const [left, _, right] = ctx.children;
|
|
634
|
+
let value = this.visit(right);
|
|
635
|
+
return new PartialComparisonExpression(this, "CONTAINS", left.text, value);
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* Remove artifact from sanitize-html inside query
|
|
640
|
+
* @param query
|
|
641
|
+
* @returns
|
|
642
|
+
*/
|
|
643
|
+
export function unsanitize(query) {
|
|
644
|
+
return query.replace(/</g, "<").replace(/>/g, ">");
|
|
645
|
+
}
|
|
646
|
+
//# sourceMappingURL=query.js.map
|
package/lib/query.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|