qast 1.1.0 → 2.0.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/README.md +312 -6
- package/README.zh-CN.md +520 -0
- package/dist/adapters/drizzle.d.ts +66 -0
- package/dist/adapters/drizzle.d.ts.map +1 -0
- package/dist/adapters/drizzle.js +222 -0
- package/dist/adapters/drizzle.js.map +1 -0
- package/dist/adapters/knex.d.ts +22 -0
- package/dist/adapters/knex.d.ts.map +1 -0
- package/dist/adapters/knex.js +158 -0
- package/dist/adapters/knex.js.map +1 -0
- package/dist/adapters/mongoose.d.ts +15 -0
- package/dist/adapters/mongoose.d.ts.map +1 -0
- package/dist/adapters/mongoose.js +152 -0
- package/dist/adapters/mongoose.js.map +1 -0
- package/dist/adapters/prisma.d.ts +5 -2
- package/dist/adapters/prisma.d.ts.map +1 -1
- package/dist/adapters/prisma.js +103 -4
- package/dist/adapters/prisma.js.map +1 -1
- package/dist/adapters/sequelize.d.ts +26 -8
- package/dist/adapters/sequelize.d.ts.map +1 -1
- package/dist/adapters/sequelize.js +168 -7
- package/dist/adapters/sequelize.js.map +1 -1
- package/dist/adapters/typeorm.d.ts +32 -2
- package/dist/adapters/typeorm.d.ts.map +1 -1
- package/dist/adapters/typeorm.js +169 -3
- package/dist/adapters/typeorm.js.map +1 -1
- package/dist/builder/query-builder.d.ts +139 -0
- package/dist/builder/query-builder.d.ts.map +1 -0
- package/dist/builder/query-builder.js +320 -0
- package/dist/builder/query-builder.js.map +1 -0
- package/dist/errors.d.ts +18 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +127 -9
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +90 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +142 -16
- package/dist/index.js.map +1 -1
- package/dist/integrations/express.d.ts +14 -0
- package/dist/integrations/express.d.ts.map +1 -0
- package/dist/integrations/express.js +33 -0
- package/dist/integrations/express.js.map +1 -0
- package/dist/integrations/fastify.d.ts +17 -0
- package/dist/integrations/fastify.d.ts.map +1 -0
- package/dist/integrations/fastify.js +35 -0
- package/dist/integrations/fastify.js.map +1 -0
- package/dist/integrations/hono.d.ts +14 -0
- package/dist/integrations/hono.d.ts.map +1 -0
- package/dist/integrations/hono.js +30 -0
- package/dist/integrations/hono.js.map +1 -0
- package/dist/integrations/nestjs.d.ts +23 -0
- package/dist/integrations/nestjs.d.ts.map +1 -0
- package/dist/integrations/nestjs.js +137 -0
- package/dist/integrations/nestjs.js.map +1 -0
- package/dist/parser/parser.d.ts +15 -7
- package/dist/parser/parser.d.ts.map +1 -1
- package/dist/parser/parser.js +117 -15
- package/dist/parser/parser.js.map +1 -1
- package/dist/parser/tokenizer.d.ts +11 -1
- package/dist/parser/tokenizer.d.ts.map +1 -1
- package/dist/parser/tokenizer.js +67 -10
- package/dist/parser/tokenizer.js.map +1 -1
- package/dist/parser/validator.d.ts +44 -1
- package/dist/parser/validator.d.ts.map +1 -1
- package/dist/parser/validator.js +210 -2
- package/dist/parser/validator.js.map +1 -1
- package/dist/types/ast.d.ts +102 -3
- package/dist/types/ast.d.ts.map +1 -1
- package/dist/types/ast.js +21 -0
- package/dist/types/ast.js.map +1 -1
- package/dist/utils/ast-utils.d.ts +43 -0
- package/dist/utils/ast-utils.d.ts.map +1 -0
- package/dist/utils/ast-utils.js +205 -0
- package/dist/utils/ast-utils.js.map +1 -0
- package/dist/utils/cache.d.ts +47 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +132 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/serializer.d.ts +6 -0
- package/dist/utils/serializer.d.ts.map +1 -0
- package/dist/utils/serializer.js +140 -0
- package/dist/utils/serializer.js.map +1 -0
- package/package.json +31 -8
package/dist/types/ast.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/types/ast.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/types/ast.ts"],"names":[],"mappings":"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"}
|
package/dist/types/ast.js
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.isComparisonNode = isComparisonNode;
|
|
4
4
|
exports.isLogicalNode = isLogicalNode;
|
|
5
|
+
exports.isNotNode = isNotNode;
|
|
6
|
+
exports.isBetweenNode = isBetweenNode;
|
|
7
|
+
exports.isNullCheckNode = isNullCheckNode;
|
|
5
8
|
/**
|
|
6
9
|
* Type guard to check if a node is a ComparisonNode
|
|
7
10
|
*/
|
|
@@ -14,4 +17,22 @@ function isComparisonNode(node) {
|
|
|
14
17
|
function isLogicalNode(node) {
|
|
15
18
|
return node.type === 'AND' || node.type === 'OR';
|
|
16
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Type guard to check if a node is a NotNode
|
|
22
|
+
*/
|
|
23
|
+
function isNotNode(node) {
|
|
24
|
+
return node.type === 'NOT';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Type guard to check if a node is a BetweenNode
|
|
28
|
+
*/
|
|
29
|
+
function isBetweenNode(node) {
|
|
30
|
+
return node.type === 'BETWEEN';
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Type guard to check if a node is a NullCheckNode
|
|
34
|
+
*/
|
|
35
|
+
function isNullCheckNode(node) {
|
|
36
|
+
return node.type === 'NULL_CHECK';
|
|
37
|
+
}
|
|
17
38
|
//# sourceMappingURL=ast.js.map
|
package/dist/types/ast.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/types/ast.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/types/ast.ts"],"names":[],"mappings":";;AA0GA,4CAEC;AAKD,sCAEC;AAKD,8BAEC;AAKD,sCAEC;AAKD,0CAEC;AAjCD;;GAEG;AACH,SAAgB,gBAAgB,CAAC,IAAc;IAC7C,OAAO,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,IAAc;IAC1C,OAAO,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,IAAc;IACtC,OAAO,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,IAAc;IAC1C,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,IAAc;IAC5C,OAAO,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { QastNode } from '../types/ast';
|
|
2
|
+
/**
|
|
3
|
+
* Deep clone an AST node
|
|
4
|
+
*/
|
|
5
|
+
export declare function cloneAST(node: QastNode): QastNode;
|
|
6
|
+
/**
|
|
7
|
+
* Merge two queries with a logical operator
|
|
8
|
+
*/
|
|
9
|
+
export declare function mergeQueries(left: QastNode, right: QastNode, op: 'AND' | 'OR'): QastNode;
|
|
10
|
+
/**
|
|
11
|
+
* Query statistics
|
|
12
|
+
*/
|
|
13
|
+
export interface QueryStats {
|
|
14
|
+
depth: number;
|
|
15
|
+
nodeCount: number;
|
|
16
|
+
comparisonCount: number;
|
|
17
|
+
logicalCount: number;
|
|
18
|
+
notCount: number;
|
|
19
|
+
betweenCount: number;
|
|
20
|
+
nullCheckCount: number;
|
|
21
|
+
fields: string[];
|
|
22
|
+
operators: string[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get statistics about a query AST
|
|
26
|
+
*/
|
|
27
|
+
export declare function getQueryStats(node: QastNode): QueryStats;
|
|
28
|
+
/**
|
|
29
|
+
* Query difference result
|
|
30
|
+
*/
|
|
31
|
+
export interface QueryDiff {
|
|
32
|
+
identical: boolean;
|
|
33
|
+
differences: string[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Compare two queries and return differences
|
|
37
|
+
*/
|
|
38
|
+
export declare function diffQueries(left: QastNode, right: QastNode): QueryDiff;
|
|
39
|
+
/**
|
|
40
|
+
* Optimize an AST by simplifying redundant expressions
|
|
41
|
+
*/
|
|
42
|
+
export declare function optimizeAST(node: QastNode): QastNode;
|
|
43
|
+
//# sourceMappingURL=ast-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-utils.d.ts","sourceRoot":"","sources":["../../src/utils/ast-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAQT,MAAM,cAAc,CAAC;AAEtB;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAkCjD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,QAAQ,EACf,EAAE,EAAE,KAAK,GAAG,IAAI,GACf,QAAQ,CAMV;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CA+CxD;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,SAAS,CA8CtE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CA6CpD"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cloneAST = cloneAST;
|
|
4
|
+
exports.mergeQueries = mergeQueries;
|
|
5
|
+
exports.getQueryStats = getQueryStats;
|
|
6
|
+
exports.diffQueries = diffQueries;
|
|
7
|
+
exports.optimizeAST = optimizeAST;
|
|
8
|
+
const ast_1 = require("../types/ast");
|
|
9
|
+
/**
|
|
10
|
+
* Deep clone an AST node
|
|
11
|
+
*/
|
|
12
|
+
function cloneAST(node) {
|
|
13
|
+
if ((0, ast_1.isComparisonNode)(node)) {
|
|
14
|
+
return {
|
|
15
|
+
type: 'COMPARISON',
|
|
16
|
+
field: node.field,
|
|
17
|
+
op: node.op,
|
|
18
|
+
value: Array.isArray(node.value) ? [...node.value] : node.value,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
else if ((0, ast_1.isLogicalNode)(node)) {
|
|
22
|
+
return {
|
|
23
|
+
type: node.type,
|
|
24
|
+
left: cloneAST(node.left),
|
|
25
|
+
right: cloneAST(node.right),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
else if ((0, ast_1.isNotNode)(node)) {
|
|
29
|
+
return {
|
|
30
|
+
type: 'NOT',
|
|
31
|
+
operand: cloneAST(node.operand),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
else if ((0, ast_1.isBetweenNode)(node)) {
|
|
35
|
+
return {
|
|
36
|
+
type: 'BETWEEN',
|
|
37
|
+
field: node.field,
|
|
38
|
+
min: node.min,
|
|
39
|
+
max: node.max,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
else if ((0, ast_1.isNullCheckNode)(node)) {
|
|
43
|
+
return {
|
|
44
|
+
type: 'NULL_CHECK',
|
|
45
|
+
field: node.field,
|
|
46
|
+
isNull: node.isNull,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
throw new Error(`Unknown node type: ${node.type}`);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Merge two queries with a logical operator
|
|
53
|
+
*/
|
|
54
|
+
function mergeQueries(left, right, op) {
|
|
55
|
+
return {
|
|
56
|
+
type: op,
|
|
57
|
+
left: cloneAST(left),
|
|
58
|
+
right: cloneAST(right),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get statistics about a query AST
|
|
63
|
+
*/
|
|
64
|
+
function getQueryStats(node) {
|
|
65
|
+
const stats = {
|
|
66
|
+
depth: 0,
|
|
67
|
+
nodeCount: 0,
|
|
68
|
+
comparisonCount: 0,
|
|
69
|
+
logicalCount: 0,
|
|
70
|
+
notCount: 0,
|
|
71
|
+
betweenCount: 0,
|
|
72
|
+
nullCheckCount: 0,
|
|
73
|
+
fields: [],
|
|
74
|
+
operators: [],
|
|
75
|
+
};
|
|
76
|
+
function traverse(n, depth) {
|
|
77
|
+
stats.nodeCount++;
|
|
78
|
+
stats.depth = Math.max(stats.depth, depth);
|
|
79
|
+
if ((0, ast_1.isComparisonNode)(n)) {
|
|
80
|
+
stats.comparisonCount++;
|
|
81
|
+
if (!stats.fields.includes(n.field)) {
|
|
82
|
+
stats.fields.push(n.field);
|
|
83
|
+
}
|
|
84
|
+
if (!stats.operators.includes(n.op)) {
|
|
85
|
+
stats.operators.push(n.op);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else if ((0, ast_1.isLogicalNode)(n)) {
|
|
89
|
+
stats.logicalCount++;
|
|
90
|
+
traverse(n.left, depth + 1);
|
|
91
|
+
traverse(n.right, depth + 1);
|
|
92
|
+
}
|
|
93
|
+
else if ((0, ast_1.isNotNode)(n)) {
|
|
94
|
+
stats.notCount++;
|
|
95
|
+
traverse(n.operand, depth + 1);
|
|
96
|
+
}
|
|
97
|
+
else if ((0, ast_1.isBetweenNode)(n)) {
|
|
98
|
+
stats.betweenCount++;
|
|
99
|
+
if (!stats.fields.includes(n.field)) {
|
|
100
|
+
stats.fields.push(n.field);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else if ((0, ast_1.isNullCheckNode)(n)) {
|
|
104
|
+
stats.nullCheckCount++;
|
|
105
|
+
if (!stats.fields.includes(n.field)) {
|
|
106
|
+
stats.fields.push(n.field);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
traverse(node, 1);
|
|
111
|
+
return stats;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Compare two queries and return differences
|
|
115
|
+
*/
|
|
116
|
+
function diffQueries(left, right) {
|
|
117
|
+
const differences = [];
|
|
118
|
+
function compare(l, r, path = 'root') {
|
|
119
|
+
if (l.type !== r.type) {
|
|
120
|
+
differences.push(`${path}: different types (${l.type} vs ${r.type})`);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if ((0, ast_1.isComparisonNode)(l) && (0, ast_1.isComparisonNode)(r)) {
|
|
124
|
+
if (l.field !== r.field) {
|
|
125
|
+
differences.push(`${path}: different fields (${l.field} vs ${r.field})`);
|
|
126
|
+
}
|
|
127
|
+
if (l.op !== r.op) {
|
|
128
|
+
differences.push(`${path}: different operators (${l.op} vs ${r.op})`);
|
|
129
|
+
}
|
|
130
|
+
if (JSON.stringify(l.value) !== JSON.stringify(r.value)) {
|
|
131
|
+
differences.push(`${path}: different values`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else if ((0, ast_1.isLogicalNode)(l) && (0, ast_1.isLogicalNode)(r)) {
|
|
135
|
+
compare(l.left, r.left, `${path}.left`);
|
|
136
|
+
compare(l.right, r.right, `${path}.right`);
|
|
137
|
+
}
|
|
138
|
+
else if ((0, ast_1.isNotNode)(l) && (0, ast_1.isNotNode)(r)) {
|
|
139
|
+
compare(l.operand, r.operand, `${path}.operand`);
|
|
140
|
+
}
|
|
141
|
+
else if ((0, ast_1.isBetweenNode)(l) && (0, ast_1.isBetweenNode)(r)) {
|
|
142
|
+
if (l.field !== r.field) {
|
|
143
|
+
differences.push(`${path}: different fields (${l.field} vs ${r.field})`);
|
|
144
|
+
}
|
|
145
|
+
if (l.min !== r.min || l.max !== r.max) {
|
|
146
|
+
differences.push(`${path}: different range values`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else if ((0, ast_1.isNullCheckNode)(l) && (0, ast_1.isNullCheckNode)(r)) {
|
|
150
|
+
if (l.field !== r.field) {
|
|
151
|
+
differences.push(`${path}: different fields (${l.field} vs ${r.field})`);
|
|
152
|
+
}
|
|
153
|
+
if (l.isNull !== r.isNull) {
|
|
154
|
+
differences.push(`${path}: different null check type`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
compare(left, right);
|
|
159
|
+
return {
|
|
160
|
+
identical: differences.length === 0,
|
|
161
|
+
differences,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Optimize an AST by simplifying redundant expressions
|
|
166
|
+
*/
|
|
167
|
+
function optimizeAST(node) {
|
|
168
|
+
if ((0, ast_1.isComparisonNode)(node) || (0, ast_1.isBetweenNode)(node) || (0, ast_1.isNullCheckNode)(node)) {
|
|
169
|
+
return node; // Leaf nodes can't be optimized
|
|
170
|
+
}
|
|
171
|
+
if ((0, ast_1.isLogicalNode)(node)) {
|
|
172
|
+
const left = optimizeAST(node.left);
|
|
173
|
+
const right = optimizeAST(node.right);
|
|
174
|
+
// If both sides are identical, simplify
|
|
175
|
+
const diff = diffQueries(left, right);
|
|
176
|
+
if (diff.identical && node.type === 'AND') {
|
|
177
|
+
return left; // A AND A = A
|
|
178
|
+
}
|
|
179
|
+
// If left is always true/false, simplify
|
|
180
|
+
if ((0, ast_1.isComparisonNode)(left) && left.op === 'eq' && left.value === true && node.type === 'AND') {
|
|
181
|
+
return right; // true AND X = X
|
|
182
|
+
}
|
|
183
|
+
if ((0, ast_1.isComparisonNode)(left) && left.op === 'eq' && left.value === false && node.type === 'OR') {
|
|
184
|
+
return right; // false OR X = X
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
type: node.type,
|
|
188
|
+
left,
|
|
189
|
+
right,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
if ((0, ast_1.isNotNode)(node)) {
|
|
193
|
+
const operand = optimizeAST(node.operand);
|
|
194
|
+
// Double negation: not (not X) = X
|
|
195
|
+
if ((0, ast_1.isNotNode)(operand)) {
|
|
196
|
+
return operand.operand;
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
type: 'NOT',
|
|
200
|
+
operand,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
return node;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=ast-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-utils.js","sourceRoot":"","sources":["../../src/utils/ast-utils.ts"],"names":[],"mappings":";;AAcA,4BAkCC;AAKD,oCAUC;AAoBD,sCA+CC;AAaD,kCA8CC;AAKD,kCA6CC;AA/OD,sCASsB;AAEtB;;GAEG;AACH,SAAgB,QAAQ,CAAC,IAAc;IACrC,IAAI,IAAA,sBAAgB,EAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK;SAC7E,CAAC;IACJ,CAAC;SAAM,IAAI,IAAA,mBAAa,EAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;SAC5B,CAAC;IACJ,CAAC;SAAM,IAAI,IAAA,eAAS,EAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;SAChC,CAAC;IACJ,CAAC;SAAM,IAAI,IAAA,mBAAa,EAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC;IACJ,CAAC;SAAM,IAAI,IAAA,qBAAe,EAAC,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,sBAAuB,IAAY,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAC1B,IAAc,EACd,KAAe,EACf,EAAgB;IAEhB,OAAO;QACL,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;QACpB,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC;KACR,CAAC;AACnB,CAAC;AAiBD;;GAEG;AACH,SAAgB,aAAa,CAAC,IAAc;IAC1C,MAAM,KAAK,GAAe;QACxB,KAAK,EAAE,CAAC;QACR,SAAS,EAAE,CAAC;QACZ,eAAe,EAAE,CAAC;QAClB,YAAY,EAAE,CAAC;QACf,QAAQ,EAAE,CAAC;QACX,YAAY,EAAE,CAAC;QACf,cAAc,EAAE,CAAC;QACjB,MAAM,EAAE,EAAE;QACV,SAAS,EAAE,EAAE;KACd,CAAC;IAEF,SAAS,QAAQ,CAAC,CAAW,EAAE,KAAa;QAC1C,KAAK,CAAC,SAAS,EAAE,CAAC;QAClB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAE3C,IAAI,IAAA,sBAAgB,EAAC,CAAC,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBACpC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;aAAM,IAAI,IAAA,mBAAa,EAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,YAAY,EAAE,CAAC;YACrB,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC5B,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,IAAA,eAAS,EAAC,CAAC,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjB,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACjC,CAAC;aAAM,IAAI,IAAA,mBAAa,EAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,YAAY,EAAE,CAAC;YACrB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;aAAM,IAAI,IAAA,qBAAe,EAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClB,OAAO,KAAK,CAAC;AACf,CAAC;AAUD;;GAEG;AACH,SAAgB,WAAW,CAAC,IAAc,EAAE,KAAe;IACzD,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,SAAS,OAAO,CAAC,CAAW,EAAE,CAAW,EAAE,OAAe,MAAM;QAC9D,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YACtB,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,sBAAsB,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,IAAI,IAAA,sBAAgB,EAAC,CAAC,CAAC,IAAI,IAAA,sBAAgB,EAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;gBACxB,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,uBAAuB,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;YAC3E,CAAC;YACD,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBAClB,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,0BAA0B,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACxE,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxD,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,oBAAoB,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;aAAM,IAAI,IAAA,mBAAa,EAAC,CAAC,CAAC,IAAI,IAAA,mBAAa,EAAC,CAAC,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;YACxC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,IAAA,eAAS,EAAC,CAAC,CAAC,IAAI,IAAA,eAAS,EAAC,CAAC,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,UAAU,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,IAAA,mBAAa,EAAC,CAAC,CAAC,IAAI,IAAA,mBAAa,EAAC,CAAC,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;gBACxB,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,uBAAuB,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;YAC3E,CAAC;YACD,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;gBACvC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,0BAA0B,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;aAAM,IAAI,IAAA,qBAAe,EAAC,CAAC,CAAC,IAAI,IAAA,qBAAe,EAAC,CAAC,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;gBACxB,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,uBAAuB,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;YAC3E,CAAC;YACD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;gBAC1B,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,6BAA6B,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,SAAS,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC;QACnC,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,IAAc;IACxC,IAAI,IAAA,sBAAgB,EAAC,IAAI,CAAC,IAAI,IAAA,mBAAa,EAAC,IAAI,CAAC,IAAI,IAAA,qBAAe,EAAC,IAAI,CAAC,EAAE,CAAC;QAC3E,OAAO,IAAI,CAAC,CAAC,gCAAgC;IAC/C,CAAC;IAED,IAAI,IAAA,mBAAa,EAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtC,wCAAwC;QACxC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC,CAAC,cAAc;QAC7B,CAAC;QAED,yCAAyC;QACzC,IAAI,IAAA,sBAAgB,EAAC,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC7F,OAAO,KAAK,CAAC,CAAC,iBAAiB;QACjC,CAAC;QACD,IAAI,IAAA,sBAAgB,EAAC,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC7F,OAAO,KAAK,CAAC,CAAC,iBAAiB;QACjC,CAAC;QAED,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI;YACJ,KAAK;SACN,CAAC;IACJ,CAAC;IAED,IAAI,IAAA,eAAS,EAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE1C,mCAAmC;QACnC,IAAI,IAAA,eAAS,EAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,OAAO,CAAC,OAAO,CAAC;QACzB,CAAC;QAED,OAAO;YACL,IAAI,EAAE,KAAK;YACX,OAAO;SACR,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { QastNode, QueryAST } from '../types/ast';
|
|
2
|
+
/**
|
|
3
|
+
* Simple LRU cache implementation for query results
|
|
4
|
+
*/
|
|
5
|
+
export declare class QueryCache<T> {
|
|
6
|
+
private cache;
|
|
7
|
+
private maxSize;
|
|
8
|
+
private ttl?;
|
|
9
|
+
constructor(maxSize?: number, ttl?: number);
|
|
10
|
+
/**
|
|
11
|
+
* Generate cache key from query string or AST
|
|
12
|
+
*/
|
|
13
|
+
private getKey;
|
|
14
|
+
/**
|
|
15
|
+
* Check if entry is expired
|
|
16
|
+
*/
|
|
17
|
+
private isExpired;
|
|
18
|
+
/**
|
|
19
|
+
* Get value from cache
|
|
20
|
+
*/
|
|
21
|
+
get(query: string | QastNode | QueryAST): T | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Set value in cache
|
|
24
|
+
*/
|
|
25
|
+
set(query: string | QastNode | QueryAST, value: T): void;
|
|
26
|
+
/**
|
|
27
|
+
* Clear cache
|
|
28
|
+
*/
|
|
29
|
+
clear(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Get cache size
|
|
32
|
+
*/
|
|
33
|
+
size(): number;
|
|
34
|
+
/**
|
|
35
|
+
* Remove expired entries
|
|
36
|
+
*/
|
|
37
|
+
cleanup(): void;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Memoize a function that takes a query and returns a result
|
|
41
|
+
*/
|
|
42
|
+
export declare function memoizeQuery<T>(fn: (query: string | QastNode | QueryAST) => T, maxSize?: number, ttl?: number): (query: string | QastNode | QueryAST) => T;
|
|
43
|
+
/**
|
|
44
|
+
* Create a cached query parser
|
|
45
|
+
*/
|
|
46
|
+
export declare function createCachedParser(parseFn: (query: string) => QastNode | QueryAST, maxSize?: number, ttl?: number): (query: string) => QastNode | QueryAST;
|
|
47
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAUlD;;GAEG;AACH,qBAAa,UAAU,CAAC,CAAC;IACvB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,GAAG,CAAC,CAAS;gBAET,OAAO,GAAE,MAAY,EAAE,GAAG,CAAC,EAAE,MAAM;IAM/C;;OAEG;IACH,OAAO,CAAC,MAAM;IASd;;OAEG;IACH,OAAO,CAAC,SAAS;IAOjB;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,GAAG,SAAS;IAoBvD;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAsBxD;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,OAAO,IAAI,IAAI;CAYhB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,KAAK,CAAC,EAC9C,OAAO,GAAE,MAAY,EACrB,GAAG,CAAC,EAAE,MAAM,GACX,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,KAAK,CAAC,CAa5C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,QAAQ,GAAG,QAAQ,EAC/C,OAAO,GAAE,MAAY,EACrB,GAAG,CAAC,EAAE,MAAM,GACX,CAAC,KAAK,EAAE,MAAM,KAAK,QAAQ,GAAG,QAAQ,CAaxC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QueryCache = void 0;
|
|
4
|
+
exports.memoizeQuery = memoizeQuery;
|
|
5
|
+
exports.createCachedParser = createCachedParser;
|
|
6
|
+
/**
|
|
7
|
+
* Simple LRU cache implementation for query results
|
|
8
|
+
*/
|
|
9
|
+
class QueryCache {
|
|
10
|
+
constructor(maxSize = 100, ttl) {
|
|
11
|
+
this.cache = new Map();
|
|
12
|
+
this.maxSize = maxSize;
|
|
13
|
+
this.ttl = ttl;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Generate cache key from query string or AST
|
|
17
|
+
*/
|
|
18
|
+
getKey(query) {
|
|
19
|
+
if (typeof query === 'string') {
|
|
20
|
+
return query;
|
|
21
|
+
}
|
|
22
|
+
// For AST nodes, use JSON stringification (simplified)
|
|
23
|
+
// In production, you might want a more sophisticated serialization
|
|
24
|
+
return JSON.stringify(query);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check if entry is expired
|
|
28
|
+
*/
|
|
29
|
+
isExpired(entry) {
|
|
30
|
+
if (!this.ttl) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
return Date.now() - entry.timestamp > this.ttl;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get value from cache
|
|
37
|
+
*/
|
|
38
|
+
get(query) {
|
|
39
|
+
const key = this.getKey(query);
|
|
40
|
+
const entry = this.cache.get(key);
|
|
41
|
+
if (!entry) {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
if (this.isExpired(entry)) {
|
|
45
|
+
this.cache.delete(key);
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
// Move to end (LRU)
|
|
49
|
+
this.cache.delete(key);
|
|
50
|
+
this.cache.set(key, entry);
|
|
51
|
+
return entry.value;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Set value in cache
|
|
55
|
+
*/
|
|
56
|
+
set(query, value) {
|
|
57
|
+
const key = this.getKey(query);
|
|
58
|
+
// Remove if exists to update position
|
|
59
|
+
if (this.cache.has(key)) {
|
|
60
|
+
this.cache.delete(key);
|
|
61
|
+
}
|
|
62
|
+
// Evict oldest if at capacity
|
|
63
|
+
if (this.cache.size >= this.maxSize) {
|
|
64
|
+
const firstKey = this.cache.keys().next().value;
|
|
65
|
+
if (firstKey !== undefined) {
|
|
66
|
+
this.cache.delete(firstKey);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
this.cache.set(key, {
|
|
70
|
+
value,
|
|
71
|
+
timestamp: Date.now(),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Clear cache
|
|
76
|
+
*/
|
|
77
|
+
clear() {
|
|
78
|
+
this.cache.clear();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get cache size
|
|
82
|
+
*/
|
|
83
|
+
size() {
|
|
84
|
+
return this.cache.size;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Remove expired entries
|
|
88
|
+
*/
|
|
89
|
+
cleanup() {
|
|
90
|
+
if (!this.ttl) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const now = Date.now();
|
|
94
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
95
|
+
if (now - entry.timestamp > this.ttl) {
|
|
96
|
+
this.cache.delete(key);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.QueryCache = QueryCache;
|
|
102
|
+
/**
|
|
103
|
+
* Memoize a function that takes a query and returns a result
|
|
104
|
+
*/
|
|
105
|
+
function memoizeQuery(fn, maxSize = 100, ttl) {
|
|
106
|
+
const cache = new QueryCache(maxSize, ttl);
|
|
107
|
+
return (query) => {
|
|
108
|
+
const cached = cache.get(query);
|
|
109
|
+
if (cached !== undefined) {
|
|
110
|
+
return cached;
|
|
111
|
+
}
|
|
112
|
+
const result = fn(query);
|
|
113
|
+
cache.set(query, result);
|
|
114
|
+
return result;
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create a cached query parser
|
|
119
|
+
*/
|
|
120
|
+
function createCachedParser(parseFn, maxSize = 100, ttl) {
|
|
121
|
+
const cache = new QueryCache(maxSize, ttl);
|
|
122
|
+
return (query) => {
|
|
123
|
+
const cached = cache.get(query);
|
|
124
|
+
if (cached !== undefined) {
|
|
125
|
+
return cached;
|
|
126
|
+
}
|
|
127
|
+
const result = parseFn(query);
|
|
128
|
+
cache.set(query, result);
|
|
129
|
+
return result;
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../src/utils/serializer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAMR,QAAQ,EAOT,MAAM,cAAc,CAAC;AA6GtB;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAsCjE"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serializeQuery = serializeQuery;
|
|
4
|
+
const ast_1 = require("../types/ast");
|
|
5
|
+
/**
|
|
6
|
+
* Serialize a value to a string representation
|
|
7
|
+
*/
|
|
8
|
+
function serializeValue(value) {
|
|
9
|
+
if (value === null) {
|
|
10
|
+
return 'null';
|
|
11
|
+
}
|
|
12
|
+
if (typeof value === 'boolean') {
|
|
13
|
+
return value.toString();
|
|
14
|
+
}
|
|
15
|
+
if (typeof value === 'number') {
|
|
16
|
+
return value.toString();
|
|
17
|
+
}
|
|
18
|
+
if (typeof value === 'string') {
|
|
19
|
+
// Escape quotes and wrap in quotes
|
|
20
|
+
const escaped = value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
21
|
+
return `"${escaped}"`;
|
|
22
|
+
}
|
|
23
|
+
if (Array.isArray(value)) {
|
|
24
|
+
const items = value.map(item => {
|
|
25
|
+
if (typeof item === 'string') {
|
|
26
|
+
const escaped = item.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
27
|
+
return `"${escaped}"`;
|
|
28
|
+
}
|
|
29
|
+
return item.toString();
|
|
30
|
+
});
|
|
31
|
+
return `[${items.join(',')}]`;
|
|
32
|
+
}
|
|
33
|
+
return String(value);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Serialize a QAST node to a query string
|
|
37
|
+
*/
|
|
38
|
+
function serializeNode(node, parentPrecedence = 0) {
|
|
39
|
+
if ((0, ast_1.isComparisonNode)(node)) {
|
|
40
|
+
return serializeComparisonNode(node);
|
|
41
|
+
}
|
|
42
|
+
else if ((0, ast_1.isLogicalNode)(node)) {
|
|
43
|
+
return serializeLogicalNode(node, parentPrecedence);
|
|
44
|
+
}
|
|
45
|
+
else if ((0, ast_1.isNotNode)(node)) {
|
|
46
|
+
return serializeNotNode(node, parentPrecedence);
|
|
47
|
+
}
|
|
48
|
+
else if ((0, ast_1.isBetweenNode)(node)) {
|
|
49
|
+
return serializeBetweenNode(node);
|
|
50
|
+
}
|
|
51
|
+
else if ((0, ast_1.isNullCheckNode)(node)) {
|
|
52
|
+
return serializeNullCheckNode(node);
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`Unknown node type: ${node.type}`);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Serialize a comparison node
|
|
58
|
+
*/
|
|
59
|
+
function serializeComparisonNode(node) {
|
|
60
|
+
return `${node.field} ${node.op} ${serializeValue(node.value)}`;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Serialize a logical node
|
|
64
|
+
*/
|
|
65
|
+
function serializeLogicalNode(node, parentPrecedence) {
|
|
66
|
+
const op = node.type.toLowerCase();
|
|
67
|
+
const precedence = op === 'and' ? 2 : 1; // AND has higher precedence than OR
|
|
68
|
+
const leftStr = serializeNode(node.left, precedence);
|
|
69
|
+
const rightStr = serializeNode(node.right, precedence);
|
|
70
|
+
const result = `${leftStr} ${op} ${rightStr}`;
|
|
71
|
+
// Add parentheses if needed
|
|
72
|
+
if (parentPrecedence > precedence) {
|
|
73
|
+
return `(${result})`;
|
|
74
|
+
}
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Serialize a NOT node
|
|
79
|
+
*/
|
|
80
|
+
function serializeNotNode(node, parentPrecedence) {
|
|
81
|
+
const operandStr = serializeNode(node.operand, 3); // NOT has highest precedence
|
|
82
|
+
const result = `not ${operandStr}`;
|
|
83
|
+
// Add parentheses if needed
|
|
84
|
+
if (parentPrecedence > 0) {
|
|
85
|
+
return `(${result})`;
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Serialize a BETWEEN node
|
|
91
|
+
*/
|
|
92
|
+
function serializeBetweenNode(node) {
|
|
93
|
+
const minStr = serializeValue(node.min);
|
|
94
|
+
const maxStr = serializeValue(node.max);
|
|
95
|
+
return `${node.field} between ${minStr} and ${maxStr}`;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Serialize a NULL_CHECK node
|
|
99
|
+
*/
|
|
100
|
+
function serializeNullCheckNode(node) {
|
|
101
|
+
return node.isNull ? `${node.field} isNull` : `${node.field} isNotNull`;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Serialize a QueryAST to a query string
|
|
105
|
+
*/
|
|
106
|
+
function serializeQuery(query) {
|
|
107
|
+
let filter;
|
|
108
|
+
let orderBy;
|
|
109
|
+
let limit;
|
|
110
|
+
let offset;
|
|
111
|
+
if ('filter' in query) {
|
|
112
|
+
// It's a QueryAST
|
|
113
|
+
filter = query.filter;
|
|
114
|
+
orderBy = query.orderBy;
|
|
115
|
+
limit = query.limit;
|
|
116
|
+
offset = query.offset;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// It's just a QastNode
|
|
120
|
+
filter = query;
|
|
121
|
+
}
|
|
122
|
+
let result = serializeNode(filter);
|
|
123
|
+
// Add orderBy clause
|
|
124
|
+
if (orderBy && orderBy.length > 0) {
|
|
125
|
+
const orderByStr = orderBy
|
|
126
|
+
.map(clause => `${clause.field} ${clause.direction}`)
|
|
127
|
+
.join(', ');
|
|
128
|
+
result += ` orderBy ${orderByStr}`;
|
|
129
|
+
}
|
|
130
|
+
// Add limit clause
|
|
131
|
+
if (limit !== undefined) {
|
|
132
|
+
result += ` limit ${limit}`;
|
|
133
|
+
}
|
|
134
|
+
// Add offset clause
|
|
135
|
+
if (offset !== undefined) {
|
|
136
|
+
result += ` offset ${offset}`;
|
|
137
|
+
}
|
|
138
|
+
return result;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=serializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../src/utils/serializer.ts"],"names":[],"mappings":"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"}
|