@react-querybuilder/core 8.15.0 → 8.16.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/README.md +114 -53
- package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +95 -17
- package/dist/cjs/react-querybuilder_core.cjs.development.js +425 -24
- package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +95 -17
- package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
- package/dist/convertQuery-BeJJH9BI.mjs.map +1 -1
- package/dist/convertQuery-Lx2HQa0m.js.map +1 -1
- package/dist/formatQuery.d.mts +72 -2
- package/dist/formatQuery.d.ts +72 -2
- package/dist/formatQuery.js +425 -24
- package/dist/formatQuery.js.map +1 -1
- package/dist/formatQuery.mjs +418 -25
- package/dist/formatQuery.mjs.map +1 -1
- package/dist/{import-0wp72lLT.d.mts → import-BC_bAKQ8.d.mts} +2 -2
- package/dist/{import-yRVJh7E1.d.ts → import-D1KnXhkQ.d.ts} +2 -2
- package/dist/{index-D5TXNIzF.d.ts → index-AAZg4Uh1.d.mts} +15 -8
- package/dist/{index-Lht_Wq3V.d.mts → index-Ds06V0zO.d.ts} +15 -8
- package/dist/objectUtils-Bzug_QfX.js.map +1 -1
- package/dist/objectUtils-D96eEEzL.mjs.map +1 -1
- package/dist/parseCEL.d.mts +2 -2
- package/dist/parseCEL.d.ts +2 -2
- package/dist/parseCEL.js.map +1 -1
- package/dist/parseCEL.mjs.map +1 -1
- package/dist/parseCypher.d.mts +49 -0
- package/dist/parseCypher.d.ts +49 -0
- package/dist/parseCypher.js +578 -0
- package/dist/parseCypher.js.map +1 -0
- package/dist/parseCypher.mjs +575 -0
- package/dist/parseCypher.mjs.map +1 -0
- package/dist/parseGremlin.d.mts +35 -0
- package/dist/parseGremlin.d.ts +35 -0
- package/dist/parseGremlin.js +192 -0
- package/dist/parseGremlin.js.map +1 -0
- package/dist/parseGremlin.mjs +191 -0
- package/dist/parseGremlin.mjs.map +1 -0
- package/dist/parseJSONata.d.mts +2 -2
- package/dist/parseJSONata.d.ts +2 -2
- package/dist/parseJSONata.js.map +1 -1
- package/dist/parseJSONata.mjs.map +1 -1
- package/dist/parseJsonLogic.d.mts +2 -2
- package/dist/parseJsonLogic.d.ts +2 -2
- package/dist/parseJsonLogic.js.map +1 -1
- package/dist/parseJsonLogic.mjs.map +1 -1
- package/dist/parseMongoDB.d.mts +2 -2
- package/dist/parseMongoDB.d.ts +2 -2
- package/dist/parseMongoDB.js.map +1 -1
- package/dist/parseMongoDB.mjs.map +1 -1
- package/dist/parseSPARQL.d.mts +34 -0
- package/dist/parseSPARQL.d.ts +34 -0
- package/dist/parseSPARQL.js +253 -0
- package/dist/parseSPARQL.js.map +1 -0
- package/dist/parseSPARQL.mjs +251 -0
- package/dist/parseSPARQL.mjs.map +1 -0
- package/dist/parseSQL.d.mts +2 -2
- package/dist/parseSQL.d.ts +2 -2
- package/dist/parseSQL.js.map +1 -1
- package/dist/parseSQL.mjs.map +1 -1
- package/dist/parseSpEL.d.mts +2 -2
- package/dist/parseSpEL.d.ts +2 -2
- package/dist/parseSpEL.js.map +1 -1
- package/dist/parseSpEL.mjs.map +1 -1
- package/dist/prepareQueryObjects-BoG5Rt8z.js.map +1 -1
- package/dist/prepareQueryObjects-uA10ZpZX.mjs.map +1 -1
- package/dist/react-querybuilder_core.d.mts +95 -17
- package/dist/react-querybuilder_core.legacy-esm.d.ts +95 -17
- package/dist/react-querybuilder_core.legacy-esm.js +435 -37
- package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
- package/dist/react-querybuilder_core.mjs +418 -25
- package/dist/react-querybuilder_core.mjs.map +1 -1
- package/dist/react-querybuilder_core.production.d.mts +95 -17
- package/dist/react-querybuilder_core.production.mjs +1 -1
- package/dist/react-querybuilder_core.production.mjs.map +1 -1
- package/dist/transformQuery.d.mts +1 -1
- package/dist/transformQuery.d.ts +1 -1
- package/dist/transformQuery.js.map +1 -1
- package/dist/transformQuery.mjs.map +1 -1
- package/dist/utils-ChLG90DP.mjs.map +1 -1
- package/dist/utils-Qwkq2Q0F.js.map +1 -1
- package/formatQuery/package.json +1 -1
- package/package.json +51 -7
- package/parseCEL/package.json +1 -1
- package/parseCypher/package.json +4 -0
- package/parseGremlin/package.json +4 -0
- package/parseJSONata/package.json +1 -1
- package/parseJsonLogic/package.json +1 -1
- package/parseMongoDB/package.json +1 -1
- package/parseSPARQL/package.json +4 -0
- package/parseSQL/package.json +1 -1
- package/parseSpEL/package.json +1 -1
- package/transformQuery/package.json +1 -1
package/dist/formatQuery.mjs
CHANGED
|
@@ -82,7 +82,7 @@ const defaultRuleGroupProcessorCEL = (ruleGroup, options) => {
|
|
|
82
82
|
//#endregion
|
|
83
83
|
//#region src/utils/formatQuery/defaultRuleProcessorCEL.ts
|
|
84
84
|
const shouldNegate$2 = (op) => op.startsWith("not") || op.startsWith("doesnot");
|
|
85
|
-
const escapeDoubleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
|
|
85
|
+
const escapeDoubleQuotes$1 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
|
|
86
86
|
/**
|
|
87
87
|
* Default rule processor used by {@link formatQuery} for "cel" format.
|
|
88
88
|
*
|
|
@@ -124,19 +124,19 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
|
|
|
124
124
|
case "==":
|
|
125
125
|
case "!=":
|
|
126
126
|
case ">":
|
|
127
|
-
case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`}`;
|
|
127
|
+
case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`}`;
|
|
128
128
|
case "contains":
|
|
129
|
-
case "doesnotcontain": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.contains(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
|
|
129
|
+
case "doesnotcontain": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.contains(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
|
|
130
130
|
case "beginswith":
|
|
131
|
-
case "doesnotbeginwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.startsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
|
|
131
|
+
case "doesnotbeginwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.startsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
|
|
132
132
|
case "endswith":
|
|
133
|
-
case "doesnotendwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.endsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
|
|
133
|
+
case "doesnotendwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.endsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
|
|
134
134
|
case "null": return `${field} == null`;
|
|
135
135
|
case "notnull": return `${field} != null`;
|
|
136
136
|
case "in":
|
|
137
137
|
case "notin": {
|
|
138
138
|
const [prefix, suffix] = shouldNegate$2(operatorTL) ? ["!(", ")"] : ["", ""];
|
|
139
|
-
return `${prefix}${field} in [${toArray(value).map((val) => valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `"${escapeDoubleQuotes(val, escapeQuotes)}"`).join(", ")}]${suffix}`;
|
|
139
|
+
return `${prefix}${field} in [${toArray(value).map((val) => valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `"${escapeDoubleQuotes$1(val, escapeQuotes)}"`).join(", ")}]${suffix}`;
|
|
140
140
|
}
|
|
141
141
|
case "between":
|
|
142
142
|
case "notbetween": {
|
|
@@ -146,8 +146,8 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
|
|
|
146
146
|
const shouldParseNumbers = !(parseNumbers === false);
|
|
147
147
|
const firstNum = shouldRenderAsNumber(first, shouldParseNumbers) ? parseNumber(first, { parseNumbers: shouldParseNumbers }) : NaN;
|
|
148
148
|
const secondNum = shouldRenderAsNumber(second, shouldParseNumbers) ? parseNumber(second, { parseNumbers: shouldParseNumbers }) : NaN;
|
|
149
|
-
let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `"${escapeDoubleQuotes(first, escapeQuotes)}"` : firstNum;
|
|
150
|
-
let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `"${escapeDoubleQuotes(second, escapeQuotes)}"` : secondNum;
|
|
149
|
+
let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `"${escapeDoubleQuotes$1(first, escapeQuotes)}"` : firstNum;
|
|
150
|
+
let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `"${escapeDoubleQuotes$1(second, escapeQuotes)}"` : secondNum;
|
|
151
151
|
if (!preserveValueOrder && firstValue === firstNum && secondValue === secondNum && secondNum < firstNum) {
|
|
152
152
|
const tempNum = secondNum;
|
|
153
153
|
secondValue = firstNum;
|
|
@@ -403,7 +403,7 @@ const defaultRuleGroupProcessorSpEL = (ruleGroup, options) => {
|
|
|
403
403
|
//#region src/utils/formatQuery/defaultRuleProcessorSpEL.ts
|
|
404
404
|
const shouldNegate$1 = (op) => op.startsWith("not") || op.startsWith("doesnot");
|
|
405
405
|
const wrapInNegation = (clause, negate) => negate ? `!(${clause})` : clause;
|
|
406
|
-
const escapeSingleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\'`);
|
|
406
|
+
const escapeSingleQuotes$2 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\'`);
|
|
407
407
|
/**
|
|
408
408
|
* Default rule processor used by {@link formatQuery} for "spel" format.
|
|
409
409
|
*
|
|
@@ -444,20 +444,20 @@ const defaultRuleProcessorSpEL = (rule, opts = {}) => {
|
|
|
444
444
|
case "==":
|
|
445
445
|
case "!=":
|
|
446
446
|
case ">":
|
|
447
|
-
case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes(value, escapeQuotes)}'`}`;
|
|
447
|
+
case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes$2(value, escapeQuotes)}'`}`;
|
|
448
448
|
case "contains":
|
|
449
|
-
case "doesnotcontain": return wrapInNegation(`${field} matches ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
|
|
449
|
+
case "doesnotcontain": return wrapInNegation(`${field} matches ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes$2(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
|
|
450
450
|
case "beginswith":
|
|
451
|
-
case "doesnotbeginwith": return wrapInNegation(`${field} matches ${valueIsField ? `'^'.concat(${trimIfString(value)})` : `'${typeof value === "string" && !value.startsWith("^") || useBareValue ? "^" : ""}${escapeSingleQuotes(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
|
|
451
|
+
case "doesnotbeginwith": return wrapInNegation(`${field} matches ${valueIsField ? `'^'.concat(${trimIfString(value)})` : `'${typeof value === "string" && !value.startsWith("^") || useBareValue ? "^" : ""}${escapeSingleQuotes$2(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
|
|
452
452
|
case "endswith":
|
|
453
|
-
case "doesnotendwith": return wrapInNegation(`${field} matches ${valueIsField ? `${trimIfString(value)}.concat('$')` : `'${escapeSingleQuotes(value, escapeQuotes)}${typeof value === "string" && !value.endsWith("$") || useBareValue ? "$" : ""}'`}`, shouldNegate$1(operatorTL));
|
|
453
|
+
case "doesnotendwith": return wrapInNegation(`${field} matches ${valueIsField ? `${trimIfString(value)}.concat('$')` : `'${escapeSingleQuotes$2(value, escapeQuotes)}${typeof value === "string" && !value.endsWith("$") || useBareValue ? "$" : ""}'`}`, shouldNegate$1(operatorTL));
|
|
454
454
|
case "null": return `${field} == null`;
|
|
455
455
|
case "notnull": return `${field} != null`;
|
|
456
456
|
case "in":
|
|
457
457
|
case "notin": {
|
|
458
458
|
const negate = shouldNegate$1(operatorTL) ? "!" : "";
|
|
459
459
|
const valueAsArray = toArray(value);
|
|
460
|
-
return valueAsArray.length > 0 ? `${negate}(${valueAsArray.map((val) => `${field} == ${valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `'${escapeSingleQuotes(val, escapeQuotes)}'`}`).join(" or ")})` : "";
|
|
460
|
+
return valueAsArray.length > 0 ? `${negate}(${valueAsArray.map((val) => `${field} == ${valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `'${escapeSingleQuotes$2(val, escapeQuotes)}'`}`).join(" or ")})` : "";
|
|
461
461
|
}
|
|
462
462
|
case "between":
|
|
463
463
|
case "notbetween": {
|
|
@@ -467,8 +467,8 @@ const defaultRuleProcessorSpEL = (rule, opts = {}) => {
|
|
|
467
467
|
const shouldParseNumbers = !(parseNumbers === false);
|
|
468
468
|
const firstNum = shouldRenderAsNumber(first, shouldParseNumbers) ? parseNumber(first, { parseNumbers: shouldParseNumbers }) : NaN;
|
|
469
469
|
const secondNum = shouldRenderAsNumber(second, shouldParseNumbers) ? parseNumber(second, { parseNumbers: shouldParseNumbers }) : NaN;
|
|
470
|
-
let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `'${escapeSingleQuotes(first, escapeQuotes)}'` : firstNum;
|
|
471
|
-
let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `'${escapeSingleQuotes(second, escapeQuotes)}'` : secondNum;
|
|
470
|
+
let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `'${escapeSingleQuotes$2(first, escapeQuotes)}'` : firstNum;
|
|
471
|
+
let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `'${escapeSingleQuotes$2(second, escapeQuotes)}'` : secondNum;
|
|
472
472
|
if (!preserveValueOrder && firstValue === firstNum && secondValue === secondNum && secondNum < firstNum) {
|
|
473
473
|
const tempNum = secondNum;
|
|
474
474
|
secondValue = firstNum;
|
|
@@ -523,7 +523,7 @@ const defaultValueProcessorByRule = ({ operator, value, valueSource }, { escapeQ
|
|
|
523
523
|
valsOneAndTwoOnly[0] = secondNum;
|
|
524
524
|
valsOneAndTwoOnly[1] = firstNum;
|
|
525
525
|
}
|
|
526
|
-
return (valueIsField ? valsOneAndTwoOnly.map((v) => wrapFieldName(v)) : valsOneAndTwoOnly.every((v) => shouldRenderAsNumber(v, parseNumbers)) ? valsOneAndTwoOnly.map((v) => parseNumber(v, { parseNumbers: "strict" })) : valsOneAndTwoOnly.map((v) => wrapAndEscape(v))).join(` ${translations?.and ?? "and"} `);
|
|
526
|
+
return (valueIsField ? valsOneAndTwoOnly.map((v) => wrapFieldName(v)) : valsOneAndTwoOnly.every((v) => shouldRenderAsNumber(v, parseNumbers)) ? valsOneAndTwoOnly.map((v) => parseNumber(v, { parseNumbers: "strict" })) : valsOneAndTwoOnly.map((v) => wrapAndEscape(v))).join(` ${translations?.betweenAnd ?? translations?.and ?? "and"} `);
|
|
527
527
|
}
|
|
528
528
|
case "contains":
|
|
529
529
|
case "doesnotcontain": return valueIsField ? concat(quoteValue("%"), wrapFieldName(value), quoteValue("%")) : quoteValue(`%${escapeValue(value)}%`);
|
|
@@ -536,6 +536,70 @@ const defaultValueProcessorByRule = ({ operator, value, valueSource }, { escapeQ
|
|
|
536
536
|
return valueIsField ? wrapFieldName(value) : shouldRenderAsNumber(value, parseNumbers) ? `${trimIfString(value)}` : `${wrapAndEscape(value)}`;
|
|
537
537
|
};
|
|
538
538
|
//#endregion
|
|
539
|
+
//#region src/utils/formatQuery/defaultRuleGroupProcessorCypher.ts
|
|
540
|
+
/**
|
|
541
|
+
* Maps a {@link DefaultCombinatorName} to a Cypher combinator keyword.
|
|
542
|
+
*
|
|
543
|
+
* @group Export
|
|
544
|
+
*/
|
|
545
|
+
const cypherCombinatorMap = {
|
|
546
|
+
and: "AND",
|
|
547
|
+
or: "OR"
|
|
548
|
+
};
|
|
549
|
+
/**
|
|
550
|
+
* Rule group processor used by {@link formatQuery} for "cypher" and "gql" formats.
|
|
551
|
+
*
|
|
552
|
+
* @group Export
|
|
553
|
+
*/
|
|
554
|
+
const defaultRuleGroupProcessorCypher = (ruleGroup, options) => {
|
|
555
|
+
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
|
|
556
|
+
const processRuleGroup = (rg, outermost) => {
|
|
557
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? fallbackExpression : "";
|
|
558
|
+
const processedRules = [];
|
|
559
|
+
let precedingCombinator = "";
|
|
560
|
+
let firstRule = true;
|
|
561
|
+
for (const rule of rg.rules) {
|
|
562
|
+
if (typeof rule === "string") {
|
|
563
|
+
precedingCombinator = cypherCombinatorMap[rule];
|
|
564
|
+
continue;
|
|
565
|
+
}
|
|
566
|
+
if (isRuleGroup(rule)) {
|
|
567
|
+
const processedGroup = processRuleGroup(rule);
|
|
568
|
+
if (processedGroup) {
|
|
569
|
+
if (!firstRule && precedingCombinator) {
|
|
570
|
+
processedRules.push(precedingCombinator);
|
|
571
|
+
precedingCombinator = "";
|
|
572
|
+
}
|
|
573
|
+
firstRule = false;
|
|
574
|
+
processedRules.push(processedGroup);
|
|
575
|
+
}
|
|
576
|
+
continue;
|
|
577
|
+
}
|
|
578
|
+
const [validationResult, fieldValidator] = validateRule(rule);
|
|
579
|
+
if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
|
|
580
|
+
const fieldData = getOption(fields, rule.field);
|
|
581
|
+
const processedRule = ruleProcessor(rule, {
|
|
582
|
+
...options,
|
|
583
|
+
parseNumbers: getParseNumberBoolean(fieldData?.inputType),
|
|
584
|
+
escapeQuotes: (rule.valueSource ?? "value") === "value",
|
|
585
|
+
fieldData
|
|
586
|
+
});
|
|
587
|
+
if (processedRule) {
|
|
588
|
+
if (!firstRule && precedingCombinator) {
|
|
589
|
+
processedRules.push(precedingCombinator);
|
|
590
|
+
precedingCombinator = "";
|
|
591
|
+
}
|
|
592
|
+
firstRule = false;
|
|
593
|
+
processedRules.push(processedRule);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
const expression = processedRules.join(isRuleGroupType(rg) ? ` ${cypherCombinatorMap[rg.combinator]} ` : " ");
|
|
597
|
+
const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? "NOT " : ""}(`, ")"] : ["", ""];
|
|
598
|
+
return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;
|
|
599
|
+
};
|
|
600
|
+
return processRuleGroup(ruleGroup, true);
|
|
601
|
+
};
|
|
602
|
+
//#endregion
|
|
539
603
|
//#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
|
|
540
604
|
/**
|
|
541
605
|
* Default rule processor used by {@link formatQuery} for the "drizzle" format.
|
|
@@ -703,6 +767,67 @@ const defaultRuleGroupProcessorElasticSearch = (ruleGroup, options) => {
|
|
|
703
767
|
return processedRuleGroup === false ? {} : processedRuleGroup;
|
|
704
768
|
};
|
|
705
769
|
//#endregion
|
|
770
|
+
//#region src/utils/formatQuery/defaultRuleGroupProcessorGremlin.ts
|
|
771
|
+
/**
|
|
772
|
+
* Rule group processor used by {@link formatQuery} for "gremlin" format.
|
|
773
|
+
*
|
|
774
|
+
* At the top level, filter rules produce chained `.has()` steps (implicit AND).
|
|
775
|
+
* Nested groups use `.and()` / `.or()` / `.not()` compound traversals with
|
|
776
|
+
* `__` anonymous traversal prefixes.
|
|
777
|
+
*
|
|
778
|
+
* @group Export
|
|
779
|
+
*/
|
|
780
|
+
const defaultRuleGroupProcessorGremlin = (ruleGroup, options) => {
|
|
781
|
+
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
|
|
782
|
+
const validateAndProcess = (rule) => {
|
|
783
|
+
// v8 ignore next -- @preserve
|
|
784
|
+
if (typeof rule === "string" || isRuleGroup(rule)) return void 0;
|
|
785
|
+
const [validationResult, fieldValidator] = validateRule(rule);
|
|
786
|
+
if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) return;
|
|
787
|
+
const fieldData = getOption(fields, rule.field);
|
|
788
|
+
return ruleProcessor(rule, {
|
|
789
|
+
...options,
|
|
790
|
+
parseNumbers: getParseNumberBoolean(fieldData?.inputType),
|
|
791
|
+
escapeQuotes: (rule.valueSource ?? "value") === "value",
|
|
792
|
+
fieldData
|
|
793
|
+
});
|
|
794
|
+
};
|
|
795
|
+
/** Recursively processes a nested group into `.and()`/`.or()`/`.not()` form. */
|
|
796
|
+
const processNested = (rg) => {
|
|
797
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return "";
|
|
798
|
+
const predicates = [];
|
|
799
|
+
for (const rule of rg.rules) {
|
|
800
|
+
if (typeof rule === "string") continue;
|
|
801
|
+
if (isRuleGroup(rule)) {
|
|
802
|
+
const nested = processNested(rule);
|
|
803
|
+
if (nested) predicates.push(nested);
|
|
804
|
+
continue;
|
|
805
|
+
}
|
|
806
|
+
const processed = validateAndProcess(rule);
|
|
807
|
+
if (processed) predicates.push(processed);
|
|
808
|
+
}
|
|
809
|
+
if (predicates.length === 0) return "";
|
|
810
|
+
const combinator = rg.combinator ?? "and";
|
|
811
|
+
const prefix = rg.not ? "not" : combinator;
|
|
812
|
+
if (predicates.length === 1 && !rg.not) return predicates[0];
|
|
813
|
+
return `.${prefix}(${predicates.map((p) => p.startsWith(".") ? `__${p}` : p).join(", ")})`;
|
|
814
|
+
};
|
|
815
|
+
if (!isRuleOrGroupValid(ruleGroup, validationMap[ruleGroup.id ?? ""])) return fallbackExpression;
|
|
816
|
+
const steps = [];
|
|
817
|
+
for (const rule of ruleGroup.rules) {
|
|
818
|
+
if (typeof rule === "string") continue;
|
|
819
|
+
if (isRuleGroup(rule)) {
|
|
820
|
+
const compound = processNested(rule);
|
|
821
|
+
if (compound) steps.push(compound);
|
|
822
|
+
continue;
|
|
823
|
+
}
|
|
824
|
+
const processed = validateAndProcess(rule);
|
|
825
|
+
if (processed) steps.push(processed);
|
|
826
|
+
}
|
|
827
|
+
if (steps.length === 0) return fallbackExpression;
|
|
828
|
+
return steps.join("");
|
|
829
|
+
};
|
|
830
|
+
//#endregion
|
|
706
831
|
//#region src/utils/formatQuery/defaultRuleGroupProcessorJSONata.ts
|
|
707
832
|
/**
|
|
708
833
|
* Rule group processor used by {@link formatQuery} for "jsonata" format.
|
|
@@ -873,7 +998,7 @@ const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
|
|
|
873
998
|
let firstRule = true;
|
|
874
999
|
for (const rule of rg2.rules) {
|
|
875
1000
|
if (typeof rule === "string") {
|
|
876
|
-
precedingCombinator =
|
|
1001
|
+
precedingCombinator = `${translations.ruleSeparator ?? ", "}${translations[rule] ?? rule} `;
|
|
877
1002
|
continue;
|
|
878
1003
|
}
|
|
879
1004
|
if (isRuleGroup(rule)) {
|
|
@@ -915,7 +1040,8 @@ const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
|
|
|
915
1040
|
const [prefixTL, suffixTL] = ["groupPrefix", "groupSuffix"].map((key) => rg2.not ? isXOR ? getNLTranslataion(key, translations, ["not", "xor"]) : getNLTranslataion(key, translations, ["not"]) : isXOR ? getNLTranslataion(key, translations, ["xor"]) : getNLTranslataion(key, translations));
|
|
916
1041
|
const prefix = mustWrap ? `${prefixTL} (`.trim() : "";
|
|
917
1042
|
const suffix = mustWrap ? `) ${suffixTL}`.trim() : "";
|
|
918
|
-
|
|
1043
|
+
const sep = translations.ruleSeparator ?? ", ";
|
|
1044
|
+
return `${prefix}${processedRules.join(isRuleGroupType(rg2) ? `${sep}${translations[combinator] ?? combinator} ` : "")}${suffix}`;
|
|
919
1045
|
};
|
|
920
1046
|
return processRuleGroup(ruleGroup, true);
|
|
921
1047
|
};
|
|
@@ -1090,6 +1216,63 @@ const defaultRuleGroupProcessorSequelize = (ruleGroup, options) => {
|
|
|
1090
1216
|
return processRuleGroup(convertFromIC(ruleGroup), true);
|
|
1091
1217
|
};
|
|
1092
1218
|
//#endregion
|
|
1219
|
+
//#region src/utils/formatQuery/defaultRuleGroupProcessorSPARQL.ts
|
|
1220
|
+
/**
|
|
1221
|
+
* Rule group processor used by {@link formatQuery} for "sparql" format.
|
|
1222
|
+
*
|
|
1223
|
+
* SPARQL uses the same combinators as CEL (`&&` / `||`) and `!()` for negation.
|
|
1224
|
+
*
|
|
1225
|
+
* @group Export
|
|
1226
|
+
*/
|
|
1227
|
+
const defaultRuleGroupProcessorSPARQL = (ruleGroup, options) => {
|
|
1228
|
+
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
|
|
1229
|
+
const processRuleGroup = (rg, outermost) => {
|
|
1230
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? fallbackExpression : "";
|
|
1231
|
+
const processedRules = [];
|
|
1232
|
+
let precedingCombinator = "";
|
|
1233
|
+
let firstRule = true;
|
|
1234
|
+
for (const rule of rg.rules) {
|
|
1235
|
+
if (typeof rule === "string") {
|
|
1236
|
+
precedingCombinator = celCombinatorMap[rule];
|
|
1237
|
+
continue;
|
|
1238
|
+
}
|
|
1239
|
+
if (isRuleGroup(rule)) {
|
|
1240
|
+
const processedGroup = processRuleGroup(rule);
|
|
1241
|
+
if (processedGroup) {
|
|
1242
|
+
if (!firstRule && precedingCombinator) {
|
|
1243
|
+
processedRules.push(precedingCombinator);
|
|
1244
|
+
precedingCombinator = "";
|
|
1245
|
+
}
|
|
1246
|
+
firstRule = false;
|
|
1247
|
+
processedRules.push(processedGroup);
|
|
1248
|
+
}
|
|
1249
|
+
continue;
|
|
1250
|
+
}
|
|
1251
|
+
const [validationResult, fieldValidator] = validateRule(rule);
|
|
1252
|
+
if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
|
|
1253
|
+
const fieldData = getOption(fields, rule.field);
|
|
1254
|
+
const processedRule = ruleProcessor(rule, {
|
|
1255
|
+
...options,
|
|
1256
|
+
parseNumbers: getParseNumberBoolean(fieldData?.inputType),
|
|
1257
|
+
escapeQuotes: (rule.valueSource ?? "value") === "value",
|
|
1258
|
+
fieldData
|
|
1259
|
+
});
|
|
1260
|
+
if (processedRule) {
|
|
1261
|
+
if (!firstRule && precedingCombinator) {
|
|
1262
|
+
processedRules.push(precedingCombinator);
|
|
1263
|
+
precedingCombinator = "";
|
|
1264
|
+
}
|
|
1265
|
+
firstRule = false;
|
|
1266
|
+
processedRules.push(processedRule);
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
const expression = processedRules.join(isRuleGroupType(rg) ? ` ${celCombinatorMap[rg.combinator]} ` : " ");
|
|
1270
|
+
const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? "!" : ""}(`, ")"] : ["", ""];
|
|
1271
|
+
return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;
|
|
1272
|
+
};
|
|
1273
|
+
return processRuleGroup(ruleGroup, true);
|
|
1274
|
+
};
|
|
1275
|
+
//#endregion
|
|
1093
1276
|
//#region src/utils/formatQuery/defaultRuleGroupProcessorSQL.ts
|
|
1094
1277
|
/**
|
|
1095
1278
|
* Default rule processor used by {@link formatQuery} for "sql" format.
|
|
@@ -1465,6 +1648,59 @@ const getFieldValidatorReasons = (rule, fieldValidator) => {
|
|
|
1465
1648
|
}
|
|
1466
1649
|
};
|
|
1467
1650
|
//#endregion
|
|
1651
|
+
//#region src/utils/formatQuery/defaultRuleProcessorCypher.ts
|
|
1652
|
+
const escapeSingleQuotes$1 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll("'", "\\'");
|
|
1653
|
+
/**
|
|
1654
|
+
* Default rule processor used by {@link formatQuery} for "cypher" and "gql" formats.
|
|
1655
|
+
*
|
|
1656
|
+
* @group Export
|
|
1657
|
+
*/
|
|
1658
|
+
const defaultRuleProcessorCypher = (rule, opts = {}) => {
|
|
1659
|
+
const { escapeQuotes, parseNumbers } = opts;
|
|
1660
|
+
const { field, operator, value, valueSource } = rule;
|
|
1661
|
+
const valueIsField = valueSource === "field";
|
|
1662
|
+
const operatorTL = operator.toLowerCase();
|
|
1663
|
+
const fmtVal = (v) => {
|
|
1664
|
+
if (v === null || v === void 0) return "null";
|
|
1665
|
+
if (typeof v === "boolean" || typeof v === "bigint") return String(v);
|
|
1666
|
+
if (valueIsField) return trimIfString(v);
|
|
1667
|
+
if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
|
|
1668
|
+
return `'${escapeSingleQuotes$1(v, escapeQuotes)}'`;
|
|
1669
|
+
};
|
|
1670
|
+
switch (operatorTL) {
|
|
1671
|
+
case "=": return `${field} = ${fmtVal(value)}`;
|
|
1672
|
+
case "!=":
|
|
1673
|
+
case "<>": return `${field} <> ${fmtVal(value)}`;
|
|
1674
|
+
case "<":
|
|
1675
|
+
case ">":
|
|
1676
|
+
case "<=":
|
|
1677
|
+
case ">=": return `${field} ${operatorTL} ${fmtVal(value)}`;
|
|
1678
|
+
case "contains": return `${field} CONTAINS ${fmtVal(value)}`;
|
|
1679
|
+
case "doesnotcontain": return `NOT ${field} CONTAINS ${fmtVal(value)}`;
|
|
1680
|
+
case "beginswith": return `${field} STARTS WITH ${fmtVal(value)}`;
|
|
1681
|
+
case "doesnotbeginwith": return `NOT ${field} STARTS WITH ${fmtVal(value)}`;
|
|
1682
|
+
case "endswith": return `${field} ENDS WITH ${fmtVal(value)}`;
|
|
1683
|
+
case "doesnotendwith": return `NOT ${field} ENDS WITH ${fmtVal(value)}`;
|
|
1684
|
+
case "null": return `${field} IS NULL`;
|
|
1685
|
+
case "notnull": return `${field} IS NOT NULL`;
|
|
1686
|
+
case "in":
|
|
1687
|
+
case "notin": {
|
|
1688
|
+
const values = toArray(value).map(fmtVal);
|
|
1689
|
+
if (!values.length) return "";
|
|
1690
|
+
return `${operatorTL === "notin" ? "NOT " : ""}${field} IN [${values.join(", ")}]`;
|
|
1691
|
+
}
|
|
1692
|
+
case "between":
|
|
1693
|
+
case "notbetween": {
|
|
1694
|
+
const arr = toArray(value);
|
|
1695
|
+
if (arr.length < 2) return "";
|
|
1696
|
+
const [low, high] = [fmtVal(arr[0]), fmtVal(arr[1])];
|
|
1697
|
+
const expr = `${low} <= ${field} AND ${field} <= ${high}`;
|
|
1698
|
+
return operatorTL === "notbetween" ? `NOT (${expr})` : expr;
|
|
1699
|
+
}
|
|
1700
|
+
default: return `${field} ${operator} ${fmtVal(value)}`;
|
|
1701
|
+
}
|
|
1702
|
+
};
|
|
1703
|
+
//#endregion
|
|
1468
1704
|
//#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
|
|
1469
1705
|
const rangeOperatorMap = {
|
|
1470
1706
|
"<": "lt",
|
|
@@ -1616,6 +1852,68 @@ const defaultRuleProcessorElasticSearch = (rule, options = {}) => {
|
|
|
1616
1852
|
return false;
|
|
1617
1853
|
};
|
|
1618
1854
|
//#endregion
|
|
1855
|
+
//#region src/utils/formatQuery/defaultRuleProcessorGremlin.ts
|
|
1856
|
+
const escapeSingleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll("'", "\\'");
|
|
1857
|
+
/**
|
|
1858
|
+
* Default rule processor used by {@link formatQuery} for "gremlin" format.
|
|
1859
|
+
*
|
|
1860
|
+
* Each rule becomes a `.has()` step (or `.hasNot()`/`.has()` for null checks).
|
|
1861
|
+
*
|
|
1862
|
+
* @group Export
|
|
1863
|
+
*/
|
|
1864
|
+
const defaultRuleProcessorGremlin = (rule, opts = {}) => {
|
|
1865
|
+
const { escapeQuotes, parseNumbers } = opts;
|
|
1866
|
+
const { field, operator, value, valueSource } = rule;
|
|
1867
|
+
const valueIsField = valueSource === "field";
|
|
1868
|
+
const operatorTL = operator.toLowerCase();
|
|
1869
|
+
const prop = field.includes(".") ? field.split(".").pop() : field;
|
|
1870
|
+
const fmtVal = (v) => {
|
|
1871
|
+
if (v === null || v === void 0) return "null";
|
|
1872
|
+
if (typeof v === "boolean" || typeof v === "bigint") return String(v);
|
|
1873
|
+
if (valueIsField) return trimIfString(v);
|
|
1874
|
+
if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
|
|
1875
|
+
return `'${escapeSingleQuotes(v, escapeQuotes)}'`;
|
|
1876
|
+
};
|
|
1877
|
+
switch (operatorTL) {
|
|
1878
|
+
case "=": return `.has('${prop}', ${fmtVal(value)})`;
|
|
1879
|
+
case "!=":
|
|
1880
|
+
case "<>": return `.has('${prop}', neq(${fmtVal(value)}))`;
|
|
1881
|
+
case "<": return `.has('${prop}', lt(${fmtVal(value)}))`;
|
|
1882
|
+
case ">": return `.has('${prop}', gt(${fmtVal(value)}))`;
|
|
1883
|
+
case "<=": return `.has('${prop}', lte(${fmtVal(value)}))`;
|
|
1884
|
+
case ">=": return `.has('${prop}', gte(${fmtVal(value)}))`;
|
|
1885
|
+
case "contains": return `.has('${prop}', containing(${fmtVal(value)}))`;
|
|
1886
|
+
case "doesnotcontain": return `.has('${prop}', notContaining(${fmtVal(value)}))`;
|
|
1887
|
+
case "beginswith": return `.has('${prop}', startingWith(${fmtVal(value)}))`;
|
|
1888
|
+
case "doesnotbeginwith": return `.has('${prop}', notStartingWith(${fmtVal(value)}))`;
|
|
1889
|
+
case "endswith": return `.has('${prop}', endingWith(${fmtVal(value)}))`;
|
|
1890
|
+
case "doesnotendwith": return `.has('${prop}', notEndingWith(${fmtVal(value)}))`;
|
|
1891
|
+
case "null": return `.hasNot('${prop}')`;
|
|
1892
|
+
case "notnull": return `.has('${prop}')`;
|
|
1893
|
+
case "in": {
|
|
1894
|
+
const items = toArray(value).map(fmtVal);
|
|
1895
|
+
if (!items.length) return "";
|
|
1896
|
+
return `.has('${prop}', within(${items.join(", ")}))`;
|
|
1897
|
+
}
|
|
1898
|
+
case "notin": {
|
|
1899
|
+
const items = toArray(value).map(fmtVal);
|
|
1900
|
+
if (!items.length) return "";
|
|
1901
|
+
return `.has('${prop}', without(${items.join(", ")}))`;
|
|
1902
|
+
}
|
|
1903
|
+
case "between": {
|
|
1904
|
+
const arr = toArray(value);
|
|
1905
|
+
if (arr.length < 2) return "";
|
|
1906
|
+
return `.has('${prop}', between(${fmtVal(arr[0])}, ${fmtVal(arr[1])}))`;
|
|
1907
|
+
}
|
|
1908
|
+
case "notbetween": {
|
|
1909
|
+
const arr = toArray(value);
|
|
1910
|
+
if (arr.length < 2) return "";
|
|
1911
|
+
return `.has('${prop}', outside(${fmtVal(arr[0])}, ${fmtVal(arr[1])}))`;
|
|
1912
|
+
}
|
|
1913
|
+
default: return `.has('${prop}', ${fmtVal(value)})`;
|
|
1914
|
+
}
|
|
1915
|
+
};
|
|
1916
|
+
//#endregion
|
|
1619
1917
|
//#region src/utils/formatQuery/defaultRuleProcessorJSONata.ts
|
|
1620
1918
|
const shouldNegate = (op) => op.startsWith("not") || op.startsWith("doesnot");
|
|
1621
1919
|
const quote = (v, escapeQuotes) => `"${typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`)}"`;
|
|
@@ -1870,6 +2168,8 @@ const defaultValueProcessorNL = (rule, opts = {}) => {
|
|
|
1870
2168
|
const orTL = t.or ?? "or";
|
|
1871
2169
|
const trueTL = t.true ?? "true";
|
|
1872
2170
|
const falseTL = t.false ?? "false";
|
|
2171
|
+
const listSep = t.listSeparator ?? ", ";
|
|
2172
|
+
const useOxfordComma = !t.listSeparator;
|
|
1873
2173
|
switch (operatorLowerCase) {
|
|
1874
2174
|
case "null":
|
|
1875
2175
|
case "notnull": return "";
|
|
@@ -1889,7 +2189,8 @@ const defaultValueProcessorNL = (rule, opts = {}) => {
|
|
|
1889
2189
|
if (valueAsArray.length === 0) return "";
|
|
1890
2190
|
const valStringArray = valueAsArray.map((v) => valueIsField ? wrapFieldName(getOption(fields ?? [], v)?.label ?? v) : shouldRenderAsNumber(v, parseNumbers) ? `${trimIfString(v)}` : `${wrapAndEscape(v)}`);
|
|
1891
2191
|
if (valStringArray.length === 1) return valStringArray[0];
|
|
1892
|
-
|
|
2192
|
+
const oxfordComma = useOxfordComma && valStringArray.length > 2 ? "," : "";
|
|
2193
|
+
return `(${`${valStringArray.slice(0, -1).join(listSep)}${oxfordComma} ${orTL} ${valStringArray.at(-1)}`})`;
|
|
1893
2194
|
}
|
|
1894
2195
|
}
|
|
1895
2196
|
if (typeof rule.value === "boolean") return rule.value ? trueTL : falseTL;
|
|
@@ -2002,7 +2303,14 @@ const defaultRuleProcessorNL = (rule, opts) => {
|
|
|
2002
2303
|
V: operatorProcessor(rule, opts),
|
|
2003
2304
|
O: value
|
|
2004
2305
|
};
|
|
2005
|
-
|
|
2306
|
+
const translations = opts?.translations ?? {};
|
|
2307
|
+
const suffixMap = {
|
|
2308
|
+
S: translations.afterSubject ?? " ",
|
|
2309
|
+
V: translations.afterVerb ?? " ",
|
|
2310
|
+
O: translations.afterObject ?? " "
|
|
2311
|
+
};
|
|
2312
|
+
const wordOrderTuple = normalizeConstituentWordOrder(wordOrder).filter((term) => wordOrderMap[term] !== "");
|
|
2313
|
+
return wordOrderTuple.map((term, i) => `${wordOrderMap[term]}${i < wordOrderTuple.length - 1 ? suffixMap[term] : ""}`).join("").trim();
|
|
2006
2314
|
};
|
|
2007
2315
|
//#endregion
|
|
2008
2316
|
//#region src/utils/formatQuery/defaultRuleProcessorSQL.ts
|
|
@@ -2238,8 +2546,11 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
|
|
|
2238
2546
|
const valueIsField = valueSource === "field";
|
|
2239
2547
|
const operatorLC = lc(operator);
|
|
2240
2548
|
if (!Op || valueIsField && (!col || !fn && [
|
|
2549
|
+
"contains",
|
|
2241
2550
|
"doesnotcontain",
|
|
2551
|
+
"beginswith",
|
|
2242
2552
|
"doesnotbeginwith",
|
|
2553
|
+
"endswith",
|
|
2243
2554
|
"doesnotendwith"
|
|
2244
2555
|
].includes(operatorLC))) return;
|
|
2245
2556
|
switch (operatorLC) {
|
|
@@ -2259,9 +2570,9 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
|
|
|
2259
2570
|
}[operatorLC];
|
|
2260
2571
|
return { [field]: valueIsField && operatorLC === "=" ? { [Op.col]: value } : { [sequelizeOperator]: valueIsField ? col(value) : shouldRenderAsNumber(value, parseNumbers) ? parseNumber(value, { parseNumbers: "strict" }) : value } };
|
|
2261
2572
|
}
|
|
2262
|
-
case "contains": return { [field]: { [Op.substring]: valueIsField ? col(value) : `${value}` } };
|
|
2263
|
-
case "beginswith": return { [field]: { [Op.startsWith]: valueIsField ? col(value) : `${value}` } };
|
|
2264
|
-
case "endswith": return { [field]: { [Op.endsWith]: valueIsField ? col(value) : `${value}` } };
|
|
2573
|
+
case "contains": return { [field]: { [valueIsField ? Op.like : Op.substring]: valueIsField ? fn("CONCAT", "%", col(value), "%") : `${value}` } };
|
|
2574
|
+
case "beginswith": return { [field]: { [valueIsField ? Op.like : Op.startsWith]: valueIsField ? fn("CONCAT", col(value), "%") : `${value}` } };
|
|
2575
|
+
case "endswith": return { [field]: { [valueIsField ? Op.like : Op.endsWith]: valueIsField ? fn("CONCAT", "%", col(value)) : `${value}` } };
|
|
2265
2576
|
case "doesnotcontain": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", "%", col(value), "%") : `%${value}%` } };
|
|
2266
2577
|
case "doesnotbeginwith": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", col(value), "%") : `${value}%` } };
|
|
2267
2578
|
case "doesnotendwith": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", "%", col(value)) : `%${value}` } };
|
|
@@ -2291,6 +2602,74 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
|
|
|
2291
2602
|
}
|
|
2292
2603
|
};
|
|
2293
2604
|
//#endregion
|
|
2605
|
+
//#region src/utils/formatQuery/defaultRuleProcessorSPARQL.ts
|
|
2606
|
+
const escapeDoubleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
|
|
2607
|
+
/** Auto-prefix a SPARQL variable name with `?` unless it's already prefixed, a URI, or a prefixed name.
|
|
2608
|
+
*
|
|
2609
|
+
* @group Export
|
|
2610
|
+
*/
|
|
2611
|
+
const sparqlVar = (name) => /^[?<]/.test(name) || name.includes(":") ? name : `?${name}`;
|
|
2612
|
+
/**
|
|
2613
|
+
* Default rule processor used by {@link formatQuery} for "sparql" format.
|
|
2614
|
+
*
|
|
2615
|
+
* @group Export
|
|
2616
|
+
*/
|
|
2617
|
+
const defaultRuleProcessorSPARQL = (rule, opts = {}) => {
|
|
2618
|
+
const { escapeQuotes, parseNumbers } = opts;
|
|
2619
|
+
const { field: rawField, operator, value, valueSource } = rule;
|
|
2620
|
+
const valueIsField = valueSource === "field";
|
|
2621
|
+
const operatorTL = operator.toLowerCase();
|
|
2622
|
+
const field = sparqlVar(rawField);
|
|
2623
|
+
const fmtVal = (v) => {
|
|
2624
|
+
if (v === null || v === void 0) return "\"\"";
|
|
2625
|
+
if (typeof v === "boolean") return `"${v}"^^xsd:boolean`;
|
|
2626
|
+
if (typeof v === "bigint") return String(v);
|
|
2627
|
+
if (valueIsField) return sparqlVar(trimIfString(v));
|
|
2628
|
+
if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
|
|
2629
|
+
const s = typeof v === "string" ? v : JSON.stringify(v) ?? "";
|
|
2630
|
+
if (s.startsWith("?") || s.startsWith("<") || s.includes(":")) return s;
|
|
2631
|
+
return `"${escapeDoubleQuotes(s, escapeQuotes)}"`;
|
|
2632
|
+
};
|
|
2633
|
+
switch (operatorTL) {
|
|
2634
|
+
case "=":
|
|
2635
|
+
case "!=":
|
|
2636
|
+
case "<":
|
|
2637
|
+
case ">":
|
|
2638
|
+
case "<=":
|
|
2639
|
+
case ">=": return `${field} ${operatorTL} ${fmtVal(value)}`;
|
|
2640
|
+
case "<>": return `${field} != ${fmtVal(value)}`;
|
|
2641
|
+
case "contains": return `CONTAINS(${field}, ${fmtVal(value)})`;
|
|
2642
|
+
case "doesnotcontain": return `!CONTAINS(${field}, ${fmtVal(value)})`;
|
|
2643
|
+
case "beginswith": return `STRSTARTS(${field}, ${fmtVal(value)})`;
|
|
2644
|
+
case "doesnotbeginwith": return `!STRSTARTS(${field}, ${fmtVal(value)})`;
|
|
2645
|
+
case "endswith": return `STRENDS(${field}, ${fmtVal(value)})`;
|
|
2646
|
+
case "doesnotendwith": return `!STRENDS(${field}, ${fmtVal(value)})`;
|
|
2647
|
+
case "null": return `!BOUND(${field})`;
|
|
2648
|
+
case "notnull": return `BOUND(${field})`;
|
|
2649
|
+
case "in": {
|
|
2650
|
+
const items = toArray(value).map(fmtVal);
|
|
2651
|
+
if (!items.length) return "";
|
|
2652
|
+
return `${field} IN (${items.join(", ")})`;
|
|
2653
|
+
}
|
|
2654
|
+
case "notin": {
|
|
2655
|
+
const items = toArray(value).map(fmtVal);
|
|
2656
|
+
if (!items.length) return "";
|
|
2657
|
+
return `${field} NOT IN (${items.join(", ")})`;
|
|
2658
|
+
}
|
|
2659
|
+
case "between": {
|
|
2660
|
+
const arr = toArray(value);
|
|
2661
|
+
if (arr.length < 2) return "";
|
|
2662
|
+
return `${field} >= ${fmtVal(arr[0])} && ${field} <= ${fmtVal(arr[1])}`;
|
|
2663
|
+
}
|
|
2664
|
+
case "notbetween": {
|
|
2665
|
+
const arr = toArray(value);
|
|
2666
|
+
if (arr.length < 2) return "";
|
|
2667
|
+
return `(${field} < ${fmtVal(arr[0])} || ${field} > ${fmtVal(arr[1])})`;
|
|
2668
|
+
}
|
|
2669
|
+
default: return `${field} ${operator} ${fmtVal(value)}`;
|
|
2670
|
+
}
|
|
2671
|
+
};
|
|
2672
|
+
//#endregion
|
|
2294
2673
|
//#region src/utils/formatQuery/formatQuery.ts
|
|
2295
2674
|
/**
|
|
2296
2675
|
* A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.
|
|
@@ -2338,6 +2717,10 @@ const defaultRuleProcessors = {
|
|
|
2338
2717
|
sequelize: defaultRuleProcessorSequelize,
|
|
2339
2718
|
spel: defaultRuleProcessorSpEL,
|
|
2340
2719
|
sql: defaultRuleProcessorSQL,
|
|
2720
|
+
cypher: defaultRuleProcessorCypher,
|
|
2721
|
+
gql: defaultRuleProcessorCypher,
|
|
2722
|
+
sparql: defaultRuleProcessorSPARQL,
|
|
2723
|
+
gremlin: defaultRuleProcessorGremlin,
|
|
2341
2724
|
diagnostics: defaultRuleProcessorSQL
|
|
2342
2725
|
};
|
|
2343
2726
|
/* v8 ignore next -- @preserve */
|
|
@@ -2360,6 +2743,10 @@ const defaultOperatorProcessors = {
|
|
|
2360
2743
|
sequelize: defaultOperatorProcessor,
|
|
2361
2744
|
spel: defaultOperatorProcessor,
|
|
2362
2745
|
sql: defaultOperatorProcessorSQL,
|
|
2746
|
+
cypher: defaultOperatorProcessor,
|
|
2747
|
+
gql: defaultOperatorProcessor,
|
|
2748
|
+
sparql: defaultOperatorProcessor,
|
|
2749
|
+
gremlin: defaultOperatorProcessor,
|
|
2363
2750
|
diagnostics: defaultOperatorProcessor
|
|
2364
2751
|
};
|
|
2365
2752
|
const defaultFallbackExpressions = {
|
|
@@ -2367,6 +2754,8 @@ const defaultFallbackExpressions = {
|
|
|
2367
2754
|
ldap: "",
|
|
2368
2755
|
mongodb: "\"$and\":[{\"$expr\":true}]",
|
|
2369
2756
|
natural_language: "1 is 1",
|
|
2757
|
+
sparql: "1 = 1",
|
|
2758
|
+
gremlin: "",
|
|
2370
2759
|
spel: "1 == 1",
|
|
2371
2760
|
sql: "(1 = 1)"
|
|
2372
2761
|
};
|
|
@@ -2507,6 +2896,10 @@ function formatQuery(ruleGroup, optionParam = {}) {
|
|
|
2507
2896
|
case "prisma": return defaultRuleGroupProcessorPrisma(ruleGroup, finalOptions);
|
|
2508
2897
|
case "drizzle": return defaultRuleGroupProcessorDrizzle(ruleGroup, finalOptions);
|
|
2509
2898
|
case "sequelize": return defaultRuleGroupProcessorSequelize(ruleGroup, finalOptions);
|
|
2899
|
+
case "cypher":
|
|
2900
|
+
case "gql": return defaultRuleGroupProcessorCypher(ruleGroup, finalOptions);
|
|
2901
|
+
case "sparql": return defaultRuleGroupProcessorSPARQL(ruleGroup, finalOptions);
|
|
2902
|
+
case "gremlin": return defaultRuleGroupProcessorGremlin(ruleGroup, finalOptions);
|
|
2510
2903
|
case "diagnostics": return defaultRuleGroupProcessorDiagnostics(ruleGroup, finalOptions);
|
|
2511
2904
|
default: return "";
|
|
2512
2905
|
}
|
|
@@ -2562,6 +2955,6 @@ const defaultValueProcessorMongoDBByRule = defaultRuleProcessorMongoDB;
|
|
|
2562
2955
|
*/
|
|
2563
2956
|
const defaultValueProcessorSpELByRule = defaultRuleProcessorSpEL;
|
|
2564
2957
|
//#endregion
|
|
2565
|
-
export { bigIntJsonParseReviver, bigIntJsonStringifyReplacer, celCombinatorMap, defaultCELValueProcessor, defaultExportOperatorMap, defaultMongoDBValueProcessor, defaultNLTranslations, defaultOperatorProcessorNL, defaultOperatorProcessorSQL, defaultRuleGroupProcessorCEL, defaultRuleGroupProcessorDiagnostics, defaultRuleGroupProcessorDrizzle, defaultRuleGroupProcessorElasticSearch, defaultRuleGroupProcessorJSONata, defaultRuleGroupProcessorJsonLogic, defaultRuleGroupProcessorLDAP, defaultRuleGroupProcessorMongoDB, defaultRuleGroupProcessorMongoDBQuery, defaultRuleGroupProcessorNL, defaultRuleGroupProcessorParameterized, defaultRuleGroupProcessorPrisma, defaultRuleGroupProcessorSQL, defaultRuleGroupProcessorSequelize, defaultRuleGroupProcessorSpEL, defaultRuleProcessorCEL, defaultRuleProcessorDrizzle, defaultRuleProcessorElasticSearch, defaultRuleProcessorJSONata, defaultRuleProcessorJsonLogic, defaultRuleProcessorLDAP, defaultRuleProcessorMongoDB, defaultRuleProcessorMongoDBQuery, defaultRuleProcessorNL, defaultRuleProcessorParameterized, defaultRuleProcessorPrisma, defaultRuleProcessorSQL, defaultRuleProcessorSequelize, defaultRuleProcessorSpEL, defaultSpELValueProcessor, defaultValueProcessor, defaultValueProcessorByRule, defaultValueProcessorCELByRule, defaultValueProcessorMongoDBByRule, defaultValueProcessorNL, defaultValueProcessorSpELByRule, formatQuery, formatQueryOptionPresets, getNLTranslataion, getQuoteFieldNamesWithArray, getQuotedFieldName, isValidValue, isValueProcessorLegacy, jsonLogicAdditionalOperators, mapSQLOperator, mongoDbFallback, mongoOperators, normalizeConstituentWordOrder, numerifyValues, prismaFallback, prismaOperators, processMatchMode, shouldRenderAsNumber, sqlDialectPresets };
|
|
2958
|
+
export { bigIntJsonParseReviver, bigIntJsonStringifyReplacer, celCombinatorMap, cypherCombinatorMap, defaultCELValueProcessor, defaultExportOperatorMap, defaultMongoDBValueProcessor, defaultNLTranslations, defaultOperatorProcessorNL, defaultOperatorProcessorSQL, defaultRuleGroupProcessorCEL, defaultRuleGroupProcessorCypher, defaultRuleGroupProcessorDiagnostics, defaultRuleGroupProcessorDrizzle, defaultRuleGroupProcessorElasticSearch, defaultRuleGroupProcessorGremlin, defaultRuleGroupProcessorJSONata, defaultRuleGroupProcessorJsonLogic, defaultRuleGroupProcessorLDAP, defaultRuleGroupProcessorMongoDB, defaultRuleGroupProcessorMongoDBQuery, defaultRuleGroupProcessorNL, defaultRuleGroupProcessorParameterized, defaultRuleGroupProcessorPrisma, defaultRuleGroupProcessorSPARQL, defaultRuleGroupProcessorSQL, defaultRuleGroupProcessorSequelize, defaultRuleGroupProcessorSpEL, defaultRuleProcessorCEL, defaultRuleProcessorCypher, defaultRuleProcessorDrizzle, defaultRuleProcessorElasticSearch, defaultRuleProcessorGremlin, defaultRuleProcessorJSONata, defaultRuleProcessorJsonLogic, defaultRuleProcessorLDAP, defaultRuleProcessorMongoDB, defaultRuleProcessorMongoDBQuery, defaultRuleProcessorNL, defaultRuleProcessorParameterized, defaultRuleProcessorPrisma, defaultRuleProcessorSPARQL, defaultRuleProcessorSQL, defaultRuleProcessorSequelize, defaultRuleProcessorSpEL, defaultSpELValueProcessor, defaultValueProcessor, defaultValueProcessorByRule, defaultValueProcessorCELByRule, defaultValueProcessorMongoDBByRule, defaultValueProcessorNL, defaultValueProcessorSpELByRule, formatQuery, formatQueryOptionPresets, getNLTranslataion, getQuoteFieldNamesWithArray, getQuotedFieldName, isValidValue, isValueProcessorLegacy, jsonLogicAdditionalOperators, mapSQLOperator, mongoDbFallback, mongoOperators, normalizeConstituentWordOrder, numerifyValues, prismaFallback, prismaOperators, processMatchMode, shouldRenderAsNumber, sparqlVar, sqlDialectPresets };
|
|
2566
2959
|
|
|
2567
2960
|
//# sourceMappingURL=formatQuery.mjs.map
|