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