sqlparser-devexpress 2.3.17 → 2.3.18
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 +2 -2
- package/src/core/converter.js +2 -2
- package/src/core/parser.js +18 -0
- package/tests/parser.test.js +20 -0
package/package.json
CHANGED
package/src/core/converter.js
CHANGED
|
@@ -139,9 +139,9 @@ function DevExpressConverter() {
|
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
const left = ast.left !== undefined ? processAstNode(ast.left) : convertValue(ast.field);
|
|
142
|
-
const leftDefault = ast.left?.args[1]?.value;
|
|
142
|
+
const leftDefault = ast.left?.args && ast.left?.args[1]?.value;
|
|
143
143
|
const right = ast.right !== undefined ? processAstNode(ast.right) : convertValue(ast.value);
|
|
144
|
-
const rightDefault = ast.right?.args[1]?.value;
|
|
144
|
+
const rightDefault = ast.right?.args && ast.right?.args[1]?.value;
|
|
145
145
|
let operatorToken = ast.operator.toLowerCase();
|
|
146
146
|
let includeExtradata = false;
|
|
147
147
|
|
package/src/core/parser.js
CHANGED
|
@@ -140,6 +140,19 @@ export function parse(input, variables = []) {
|
|
|
140
140
|
// Recursively parse the right-hand expression with adjusted precedence
|
|
141
141
|
const right = parseExpression(OPERATOR_PRECEDENCE[operator]);
|
|
142
142
|
left = { type: "logical", operator, left, right };
|
|
143
|
+
} else if (currentToken?.type == "identifier") {
|
|
144
|
+
const right = parseValue(operator);
|
|
145
|
+
let newOp = operator;
|
|
146
|
+
if (operator === '>') newOp = '<';
|
|
147
|
+
else if (operator === '<') newOp = '>';
|
|
148
|
+
else if (operator === '>=') newOp = '<=';
|
|
149
|
+
else if (operator === '<=') newOp = '>=';
|
|
150
|
+
left = {
|
|
151
|
+
type: "comparison",
|
|
152
|
+
right: left,
|
|
153
|
+
operator: newOp,
|
|
154
|
+
left: { type: "field", value: right }
|
|
155
|
+
};
|
|
143
156
|
}
|
|
144
157
|
}
|
|
145
158
|
|
|
@@ -218,6 +231,11 @@ export function parse(input, variables = []) {
|
|
|
218
231
|
throw new Error(`Invalid comparison: ${field} ${operator} ${value}`);
|
|
219
232
|
}
|
|
220
233
|
|
|
234
|
+
// Swap the field and value if the field is a placeholder and the value is an identifier
|
|
235
|
+
if (valueType == "identifier" && fieldType == "placeholder") {
|
|
236
|
+
return { type: "comparison", value: field, operator, field: value, originalOperator };
|
|
237
|
+
}
|
|
238
|
+
|
|
221
239
|
return { type: "comparison", field, operator, value, originalOperator };
|
|
222
240
|
}
|
|
223
241
|
|
package/tests/parser.test.js
CHANGED
|
@@ -268,6 +268,26 @@ describe("Parser SQL to dx Filter Builder", () => {
|
|
|
268
268
|
{
|
|
269
269
|
input: "ID IN ({SaleOrderStatusStmtGlobalRpt.RegionID})",
|
|
270
270
|
expected: []
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
input: "10 < ID AND ApplicableUoms IN ({WorkOrderLine.ApplicableUoms})",
|
|
274
|
+
expected: [
|
|
275
|
+
["ID", ">", 10],
|
|
276
|
+
"and",
|
|
277
|
+
[
|
|
278
|
+
["ApplicableUoms", "=", "UOM1"],
|
|
279
|
+
"or",
|
|
280
|
+
["ApplicableUoms", "=", "UOM2"],
|
|
281
|
+
"or",
|
|
282
|
+
["ApplicableUoms", "=", "UOM3"]
|
|
283
|
+
]
|
|
284
|
+
],
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
input: "{ServiceOrderDocument.SourceID} = ID",
|
|
288
|
+
expected: [
|
|
289
|
+
"ID", "=", 2
|
|
290
|
+
]
|
|
271
291
|
}
|
|
272
292
|
];
|
|
273
293
|
|