@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
|
@@ -1482,7 +1482,7 @@ const defaultRuleGroupProcessorCEL = (ruleGroup, options) => {
|
|
|
1482
1482
|
//#endregion
|
|
1483
1483
|
//#region src/utils/formatQuery/defaultRuleProcessorCEL.ts
|
|
1484
1484
|
const shouldNegate$2 = (op) => op.startsWith("not") || op.startsWith("doesnot");
|
|
1485
|
-
const escapeDoubleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
|
|
1485
|
+
const escapeDoubleQuotes$1 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
|
|
1486
1486
|
/**
|
|
1487
1487
|
* Default rule processor used by {@link formatQuery} for "cel" format.
|
|
1488
1488
|
*
|
|
@@ -1524,19 +1524,19 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
|
|
|
1524
1524
|
case "==":
|
|
1525
1525
|
case "!=":
|
|
1526
1526
|
case ">":
|
|
1527
|
-
case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`}`;
|
|
1527
|
+
case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`}`;
|
|
1528
1528
|
case "contains":
|
|
1529
|
-
case "doesnotcontain": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.contains(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
|
|
1529
|
+
case "doesnotcontain": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.contains(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
|
|
1530
1530
|
case "beginswith":
|
|
1531
|
-
case "doesnotbeginwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.startsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
|
|
1531
|
+
case "doesnotbeginwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.startsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
|
|
1532
1532
|
case "endswith":
|
|
1533
|
-
case "doesnotendwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.endsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
|
|
1533
|
+
case "doesnotendwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.endsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
|
|
1534
1534
|
case "null": return `${field} == null`;
|
|
1535
1535
|
case "notnull": return `${field} != null`;
|
|
1536
1536
|
case "in":
|
|
1537
1537
|
case "notin": {
|
|
1538
1538
|
const [prefix, suffix] = shouldNegate$2(operatorTL) ? ["!(", ")"] : ["", ""];
|
|
1539
|
-
return `${prefix}${field} in [${toArray(value).map((val) => valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `"${escapeDoubleQuotes(val, escapeQuotes)}"`).join(", ")}]${suffix}`;
|
|
1539
|
+
return `${prefix}${field} in [${toArray(value).map((val) => valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `"${escapeDoubleQuotes$1(val, escapeQuotes)}"`).join(", ")}]${suffix}`;
|
|
1540
1540
|
}
|
|
1541
1541
|
case "between":
|
|
1542
1542
|
case "notbetween": {
|
|
@@ -1546,8 +1546,8 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
|
|
|
1546
1546
|
const shouldParseNumbers = !(parseNumbers === false);
|
|
1547
1547
|
const firstNum = shouldRenderAsNumber(first, shouldParseNumbers) ? parseNumber(first, { parseNumbers: shouldParseNumbers }) : NaN;
|
|
1548
1548
|
const secondNum = shouldRenderAsNumber(second, shouldParseNumbers) ? parseNumber(second, { parseNumbers: shouldParseNumbers }) : NaN;
|
|
1549
|
-
let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `"${escapeDoubleQuotes(first, escapeQuotes)}"` : firstNum;
|
|
1550
|
-
let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `"${escapeDoubleQuotes(second, escapeQuotes)}"` : secondNum;
|
|
1549
|
+
let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `"${escapeDoubleQuotes$1(first, escapeQuotes)}"` : firstNum;
|
|
1550
|
+
let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `"${escapeDoubleQuotes$1(second, escapeQuotes)}"` : secondNum;
|
|
1551
1551
|
if (!preserveValueOrder && firstValue === firstNum && secondValue === secondNum && secondNum < firstNum) {
|
|
1552
1552
|
const tempNum = secondNum;
|
|
1553
1553
|
secondValue = firstNum;
|
|
@@ -1803,7 +1803,7 @@ const defaultRuleGroupProcessorSpEL = (ruleGroup, options) => {
|
|
|
1803
1803
|
//#region src/utils/formatQuery/defaultRuleProcessorSpEL.ts
|
|
1804
1804
|
const shouldNegate$1 = (op) => op.startsWith("not") || op.startsWith("doesnot");
|
|
1805
1805
|
const wrapInNegation = (clause, negate) => negate ? `!(${clause})` : clause;
|
|
1806
|
-
const escapeSingleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\'`);
|
|
1806
|
+
const escapeSingleQuotes$2 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\'`);
|
|
1807
1807
|
/**
|
|
1808
1808
|
* Default rule processor used by {@link formatQuery} for "spel" format.
|
|
1809
1809
|
*
|
|
@@ -1844,20 +1844,20 @@ const defaultRuleProcessorSpEL = (rule, opts = {}) => {
|
|
|
1844
1844
|
case "==":
|
|
1845
1845
|
case "!=":
|
|
1846
1846
|
case ">":
|
|
1847
|
-
case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes(value, escapeQuotes)}'`}`;
|
|
1847
|
+
case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes$2(value, escapeQuotes)}'`}`;
|
|
1848
1848
|
case "contains":
|
|
1849
|
-
case "doesnotcontain": return wrapInNegation(`${field} matches ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
|
|
1849
|
+
case "doesnotcontain": return wrapInNegation(`${field} matches ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes$2(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
|
|
1850
1850
|
case "beginswith":
|
|
1851
|
-
case "doesnotbeginwith": return wrapInNegation(`${field} matches ${valueIsField ? `'^'.concat(${trimIfString(value)})` : `'${typeof value === "string" && !value.startsWith("^") || useBareValue ? "^" : ""}${escapeSingleQuotes(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
|
|
1851
|
+
case "doesnotbeginwith": return wrapInNegation(`${field} matches ${valueIsField ? `'^'.concat(${trimIfString(value)})` : `'${typeof value === "string" && !value.startsWith("^") || useBareValue ? "^" : ""}${escapeSingleQuotes$2(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
|
|
1852
1852
|
case "endswith":
|
|
1853
|
-
case "doesnotendwith": return wrapInNegation(`${field} matches ${valueIsField ? `${trimIfString(value)}.concat('$')` : `'${escapeSingleQuotes(value, escapeQuotes)}${typeof value === "string" && !value.endsWith("$") || useBareValue ? "$" : ""}'`}`, shouldNegate$1(operatorTL));
|
|
1853
|
+
case "doesnotendwith": return wrapInNegation(`${field} matches ${valueIsField ? `${trimIfString(value)}.concat('$')` : `'${escapeSingleQuotes$2(value, escapeQuotes)}${typeof value === "string" && !value.endsWith("$") || useBareValue ? "$" : ""}'`}`, shouldNegate$1(operatorTL));
|
|
1854
1854
|
case "null": return `${field} == null`;
|
|
1855
1855
|
case "notnull": return `${field} != null`;
|
|
1856
1856
|
case "in":
|
|
1857
1857
|
case "notin": {
|
|
1858
1858
|
const negate = shouldNegate$1(operatorTL) ? "!" : "";
|
|
1859
1859
|
const valueAsArray = toArray(value);
|
|
1860
|
-
return valueAsArray.length > 0 ? `${negate}(${valueAsArray.map((val) => `${field} == ${valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `'${escapeSingleQuotes(val, escapeQuotes)}'`}`).join(" or ")})` : "";
|
|
1860
|
+
return valueAsArray.length > 0 ? `${negate}(${valueAsArray.map((val) => `${field} == ${valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `'${escapeSingleQuotes$2(val, escapeQuotes)}'`}`).join(" or ")})` : "";
|
|
1861
1861
|
}
|
|
1862
1862
|
case "between":
|
|
1863
1863
|
case "notbetween": {
|
|
@@ -1867,8 +1867,8 @@ const defaultRuleProcessorSpEL = (rule, opts = {}) => {
|
|
|
1867
1867
|
const shouldParseNumbers = !(parseNumbers === false);
|
|
1868
1868
|
const firstNum = shouldRenderAsNumber(first, shouldParseNumbers) ? parseNumber(first, { parseNumbers: shouldParseNumbers }) : NaN;
|
|
1869
1869
|
const secondNum = shouldRenderAsNumber(second, shouldParseNumbers) ? parseNumber(second, { parseNumbers: shouldParseNumbers }) : NaN;
|
|
1870
|
-
let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `'${escapeSingleQuotes(first, escapeQuotes)}'` : firstNum;
|
|
1871
|
-
let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `'${escapeSingleQuotes(second, escapeQuotes)}'` : secondNum;
|
|
1870
|
+
let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `'${escapeSingleQuotes$2(first, escapeQuotes)}'` : firstNum;
|
|
1871
|
+
let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `'${escapeSingleQuotes$2(second, escapeQuotes)}'` : secondNum;
|
|
1872
1872
|
if (!preserveValueOrder && firstValue === firstNum && secondValue === secondNum && secondNum < firstNum) {
|
|
1873
1873
|
const tempNum = secondNum;
|
|
1874
1874
|
secondValue = firstNum;
|
|
@@ -1923,7 +1923,7 @@ const defaultValueProcessorByRule = ({ operator, value, valueSource }, { escapeQ
|
|
|
1923
1923
|
valsOneAndTwoOnly[0] = secondNum;
|
|
1924
1924
|
valsOneAndTwoOnly[1] = firstNum;
|
|
1925
1925
|
}
|
|
1926
|
-
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"} `);
|
|
1926
|
+
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"} `);
|
|
1927
1927
|
}
|
|
1928
1928
|
case "contains":
|
|
1929
1929
|
case "doesnotcontain": return valueIsField ? concat(quoteValue("%"), wrapFieldName(value), quoteValue("%")) : quoteValue(`%${escapeValue(value)}%`);
|
|
@@ -1936,6 +1936,70 @@ const defaultValueProcessorByRule = ({ operator, value, valueSource }, { escapeQ
|
|
|
1936
1936
|
return valueIsField ? wrapFieldName(value) : shouldRenderAsNumber(value, parseNumbers) ? `${trimIfString(value)}` : `${wrapAndEscape(value)}`;
|
|
1937
1937
|
};
|
|
1938
1938
|
//#endregion
|
|
1939
|
+
//#region src/utils/formatQuery/defaultRuleGroupProcessorCypher.ts
|
|
1940
|
+
/**
|
|
1941
|
+
* Maps a {@link DefaultCombinatorName} to a Cypher combinator keyword.
|
|
1942
|
+
*
|
|
1943
|
+
* @group Export
|
|
1944
|
+
*/
|
|
1945
|
+
const cypherCombinatorMap = {
|
|
1946
|
+
and: "AND",
|
|
1947
|
+
or: "OR"
|
|
1948
|
+
};
|
|
1949
|
+
/**
|
|
1950
|
+
* Rule group processor used by {@link formatQuery} for "cypher" and "gql" formats.
|
|
1951
|
+
*
|
|
1952
|
+
* @group Export
|
|
1953
|
+
*/
|
|
1954
|
+
const defaultRuleGroupProcessorCypher = (ruleGroup, options) => {
|
|
1955
|
+
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
|
|
1956
|
+
const processRuleGroup = (rg, outermost) => {
|
|
1957
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? fallbackExpression : "";
|
|
1958
|
+
const processedRules = [];
|
|
1959
|
+
let precedingCombinator = "";
|
|
1960
|
+
let firstRule = true;
|
|
1961
|
+
for (const rule of rg.rules) {
|
|
1962
|
+
if (typeof rule === "string") {
|
|
1963
|
+
precedingCombinator = cypherCombinatorMap[rule];
|
|
1964
|
+
continue;
|
|
1965
|
+
}
|
|
1966
|
+
if (isRuleGroup(rule)) {
|
|
1967
|
+
const processedGroup = processRuleGroup(rule);
|
|
1968
|
+
if (processedGroup) {
|
|
1969
|
+
if (!firstRule && precedingCombinator) {
|
|
1970
|
+
processedRules.push(precedingCombinator);
|
|
1971
|
+
precedingCombinator = "";
|
|
1972
|
+
}
|
|
1973
|
+
firstRule = false;
|
|
1974
|
+
processedRules.push(processedGroup);
|
|
1975
|
+
}
|
|
1976
|
+
continue;
|
|
1977
|
+
}
|
|
1978
|
+
const [validationResult, fieldValidator] = validateRule(rule);
|
|
1979
|
+
if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
|
|
1980
|
+
const fieldData = getOption(fields, rule.field);
|
|
1981
|
+
const processedRule = ruleProcessor(rule, {
|
|
1982
|
+
...options,
|
|
1983
|
+
parseNumbers: getParseNumberBoolean(fieldData?.inputType),
|
|
1984
|
+
escapeQuotes: (rule.valueSource ?? "value") === "value",
|
|
1985
|
+
fieldData
|
|
1986
|
+
});
|
|
1987
|
+
if (processedRule) {
|
|
1988
|
+
if (!firstRule && precedingCombinator) {
|
|
1989
|
+
processedRules.push(precedingCombinator);
|
|
1990
|
+
precedingCombinator = "";
|
|
1991
|
+
}
|
|
1992
|
+
firstRule = false;
|
|
1993
|
+
processedRules.push(processedRule);
|
|
1994
|
+
}
|
|
1995
|
+
}
|
|
1996
|
+
const expression = processedRules.join(isRuleGroupType(rg) ? ` ${cypherCombinatorMap[rg.combinator]} ` : " ");
|
|
1997
|
+
const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? "NOT " : ""}(`, ")"] : ["", ""];
|
|
1998
|
+
return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;
|
|
1999
|
+
};
|
|
2000
|
+
return processRuleGroup(ruleGroup, true);
|
|
2001
|
+
};
|
|
2002
|
+
//#endregion
|
|
1939
2003
|
//#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
|
|
1940
2004
|
/**
|
|
1941
2005
|
* Default rule processor used by {@link formatQuery} for the "drizzle" format.
|
|
@@ -2103,6 +2167,67 @@ const defaultRuleGroupProcessorElasticSearch = (ruleGroup, options) => {
|
|
|
2103
2167
|
return processedRuleGroup === false ? {} : processedRuleGroup;
|
|
2104
2168
|
};
|
|
2105
2169
|
//#endregion
|
|
2170
|
+
//#region src/utils/formatQuery/defaultRuleGroupProcessorGremlin.ts
|
|
2171
|
+
/**
|
|
2172
|
+
* Rule group processor used by {@link formatQuery} for "gremlin" format.
|
|
2173
|
+
*
|
|
2174
|
+
* At the top level, filter rules produce chained `.has()` steps (implicit AND).
|
|
2175
|
+
* Nested groups use `.and()` / `.or()` / `.not()` compound traversals with
|
|
2176
|
+
* `__` anonymous traversal prefixes.
|
|
2177
|
+
*
|
|
2178
|
+
* @group Export
|
|
2179
|
+
*/
|
|
2180
|
+
const defaultRuleGroupProcessorGremlin = (ruleGroup, options) => {
|
|
2181
|
+
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
|
|
2182
|
+
const validateAndProcess = (rule) => {
|
|
2183
|
+
// v8 ignore next -- @preserve
|
|
2184
|
+
if (typeof rule === "string" || isRuleGroup(rule)) return void 0;
|
|
2185
|
+
const [validationResult, fieldValidator] = validateRule(rule);
|
|
2186
|
+
if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) return;
|
|
2187
|
+
const fieldData = getOption(fields, rule.field);
|
|
2188
|
+
return ruleProcessor(rule, {
|
|
2189
|
+
...options,
|
|
2190
|
+
parseNumbers: getParseNumberBoolean(fieldData?.inputType),
|
|
2191
|
+
escapeQuotes: (rule.valueSource ?? "value") === "value",
|
|
2192
|
+
fieldData
|
|
2193
|
+
});
|
|
2194
|
+
};
|
|
2195
|
+
/** Recursively processes a nested group into `.and()`/`.or()`/`.not()` form. */
|
|
2196
|
+
const processNested = (rg) => {
|
|
2197
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return "";
|
|
2198
|
+
const predicates = [];
|
|
2199
|
+
for (const rule of rg.rules) {
|
|
2200
|
+
if (typeof rule === "string") continue;
|
|
2201
|
+
if (isRuleGroup(rule)) {
|
|
2202
|
+
const nested = processNested(rule);
|
|
2203
|
+
if (nested) predicates.push(nested);
|
|
2204
|
+
continue;
|
|
2205
|
+
}
|
|
2206
|
+
const processed = validateAndProcess(rule);
|
|
2207
|
+
if (processed) predicates.push(processed);
|
|
2208
|
+
}
|
|
2209
|
+
if (predicates.length === 0) return "";
|
|
2210
|
+
const combinator = rg.combinator ?? "and";
|
|
2211
|
+
const prefix = rg.not ? "not" : combinator;
|
|
2212
|
+
if (predicates.length === 1 && !rg.not) return predicates[0];
|
|
2213
|
+
return `.${prefix}(${predicates.map((p) => p.startsWith(".") ? `__${p}` : p).join(", ")})`;
|
|
2214
|
+
};
|
|
2215
|
+
if (!isRuleOrGroupValid(ruleGroup, validationMap[ruleGroup.id ?? ""])) return fallbackExpression;
|
|
2216
|
+
const steps = [];
|
|
2217
|
+
for (const rule of ruleGroup.rules) {
|
|
2218
|
+
if (typeof rule === "string") continue;
|
|
2219
|
+
if (isRuleGroup(rule)) {
|
|
2220
|
+
const compound = processNested(rule);
|
|
2221
|
+
if (compound) steps.push(compound);
|
|
2222
|
+
continue;
|
|
2223
|
+
}
|
|
2224
|
+
const processed = validateAndProcess(rule);
|
|
2225
|
+
if (processed) steps.push(processed);
|
|
2226
|
+
}
|
|
2227
|
+
if (steps.length === 0) return fallbackExpression;
|
|
2228
|
+
return steps.join("");
|
|
2229
|
+
};
|
|
2230
|
+
//#endregion
|
|
2106
2231
|
//#region src/utils/formatQuery/defaultRuleGroupProcessorJSONata.ts
|
|
2107
2232
|
/**
|
|
2108
2233
|
* Rule group processor used by {@link formatQuery} for "jsonata" format.
|
|
@@ -2273,7 +2398,7 @@ const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
|
|
|
2273
2398
|
let firstRule = true;
|
|
2274
2399
|
for (const rule of rg2.rules) {
|
|
2275
2400
|
if (typeof rule === "string") {
|
|
2276
|
-
precedingCombinator =
|
|
2401
|
+
precedingCombinator = `${translations.ruleSeparator ?? ", "}${translations[rule] ?? rule} `;
|
|
2277
2402
|
continue;
|
|
2278
2403
|
}
|
|
2279
2404
|
if (isRuleGroup(rule)) {
|
|
@@ -2315,7 +2440,8 @@ const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
|
|
|
2315
2440
|
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));
|
|
2316
2441
|
const prefix = mustWrap ? `${prefixTL} (`.trim() : "";
|
|
2317
2442
|
const suffix = mustWrap ? `) ${suffixTL}`.trim() : "";
|
|
2318
|
-
|
|
2443
|
+
const sep = translations.ruleSeparator ?? ", ";
|
|
2444
|
+
return `${prefix}${processedRules.join(isRuleGroupType(rg2) ? `${sep}${translations[combinator] ?? combinator} ` : "")}${suffix}`;
|
|
2319
2445
|
};
|
|
2320
2446
|
return processRuleGroup(ruleGroup, true);
|
|
2321
2447
|
};
|
|
@@ -2490,6 +2616,63 @@ const defaultRuleGroupProcessorSequelize = (ruleGroup, options) => {
|
|
|
2490
2616
|
return processRuleGroup(convertFromIC(ruleGroup), true);
|
|
2491
2617
|
};
|
|
2492
2618
|
//#endregion
|
|
2619
|
+
//#region src/utils/formatQuery/defaultRuleGroupProcessorSPARQL.ts
|
|
2620
|
+
/**
|
|
2621
|
+
* Rule group processor used by {@link formatQuery} for "sparql" format.
|
|
2622
|
+
*
|
|
2623
|
+
* SPARQL uses the same combinators as CEL (`&&` / `||`) and `!()` for negation.
|
|
2624
|
+
*
|
|
2625
|
+
* @group Export
|
|
2626
|
+
*/
|
|
2627
|
+
const defaultRuleGroupProcessorSPARQL = (ruleGroup, options) => {
|
|
2628
|
+
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
|
|
2629
|
+
const processRuleGroup = (rg, outermost) => {
|
|
2630
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? fallbackExpression : "";
|
|
2631
|
+
const processedRules = [];
|
|
2632
|
+
let precedingCombinator = "";
|
|
2633
|
+
let firstRule = true;
|
|
2634
|
+
for (const rule of rg.rules) {
|
|
2635
|
+
if (typeof rule === "string") {
|
|
2636
|
+
precedingCombinator = celCombinatorMap[rule];
|
|
2637
|
+
continue;
|
|
2638
|
+
}
|
|
2639
|
+
if (isRuleGroup(rule)) {
|
|
2640
|
+
const processedGroup = processRuleGroup(rule);
|
|
2641
|
+
if (processedGroup) {
|
|
2642
|
+
if (!firstRule && precedingCombinator) {
|
|
2643
|
+
processedRules.push(precedingCombinator);
|
|
2644
|
+
precedingCombinator = "";
|
|
2645
|
+
}
|
|
2646
|
+
firstRule = false;
|
|
2647
|
+
processedRules.push(processedGroup);
|
|
2648
|
+
}
|
|
2649
|
+
continue;
|
|
2650
|
+
}
|
|
2651
|
+
const [validationResult, fieldValidator] = validateRule(rule);
|
|
2652
|
+
if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
|
|
2653
|
+
const fieldData = getOption(fields, rule.field);
|
|
2654
|
+
const processedRule = ruleProcessor(rule, {
|
|
2655
|
+
...options,
|
|
2656
|
+
parseNumbers: getParseNumberBoolean(fieldData?.inputType),
|
|
2657
|
+
escapeQuotes: (rule.valueSource ?? "value") === "value",
|
|
2658
|
+
fieldData
|
|
2659
|
+
});
|
|
2660
|
+
if (processedRule) {
|
|
2661
|
+
if (!firstRule && precedingCombinator) {
|
|
2662
|
+
processedRules.push(precedingCombinator);
|
|
2663
|
+
precedingCombinator = "";
|
|
2664
|
+
}
|
|
2665
|
+
firstRule = false;
|
|
2666
|
+
processedRules.push(processedRule);
|
|
2667
|
+
}
|
|
2668
|
+
}
|
|
2669
|
+
const expression = processedRules.join(isRuleGroupType(rg) ? ` ${celCombinatorMap[rg.combinator]} ` : " ");
|
|
2670
|
+
const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? "!" : ""}(`, ")"] : ["", ""];
|
|
2671
|
+
return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;
|
|
2672
|
+
};
|
|
2673
|
+
return processRuleGroup(ruleGroup, true);
|
|
2674
|
+
};
|
|
2675
|
+
//#endregion
|
|
2493
2676
|
//#region src/utils/formatQuery/defaultRuleGroupProcessorSQL.ts
|
|
2494
2677
|
/**
|
|
2495
2678
|
* Default rule processor used by {@link formatQuery} for "sql" format.
|
|
@@ -2865,6 +3048,59 @@ const getFieldValidatorReasons = (rule, fieldValidator) => {
|
|
|
2865
3048
|
}
|
|
2866
3049
|
};
|
|
2867
3050
|
//#endregion
|
|
3051
|
+
//#region src/utils/formatQuery/defaultRuleProcessorCypher.ts
|
|
3052
|
+
const escapeSingleQuotes$1 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll("'", "\\'");
|
|
3053
|
+
/**
|
|
3054
|
+
* Default rule processor used by {@link formatQuery} for "cypher" and "gql" formats.
|
|
3055
|
+
*
|
|
3056
|
+
* @group Export
|
|
3057
|
+
*/
|
|
3058
|
+
const defaultRuleProcessorCypher = (rule, opts = {}) => {
|
|
3059
|
+
const { escapeQuotes, parseNumbers } = opts;
|
|
3060
|
+
const { field, operator, value, valueSource } = rule;
|
|
3061
|
+
const valueIsField = valueSource === "field";
|
|
3062
|
+
const operatorTL = operator.toLowerCase();
|
|
3063
|
+
const fmtVal = (v) => {
|
|
3064
|
+
if (v === null || v === void 0) return "null";
|
|
3065
|
+
if (typeof v === "boolean" || typeof v === "bigint") return String(v);
|
|
3066
|
+
if (valueIsField) return trimIfString(v);
|
|
3067
|
+
if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
|
|
3068
|
+
return `'${escapeSingleQuotes$1(v, escapeQuotes)}'`;
|
|
3069
|
+
};
|
|
3070
|
+
switch (operatorTL) {
|
|
3071
|
+
case "=": return `${field} = ${fmtVal(value)}`;
|
|
3072
|
+
case "!=":
|
|
3073
|
+
case "<>": return `${field} <> ${fmtVal(value)}`;
|
|
3074
|
+
case "<":
|
|
3075
|
+
case ">":
|
|
3076
|
+
case "<=":
|
|
3077
|
+
case ">=": return `${field} ${operatorTL} ${fmtVal(value)}`;
|
|
3078
|
+
case "contains": return `${field} CONTAINS ${fmtVal(value)}`;
|
|
3079
|
+
case "doesnotcontain": return `NOT ${field} CONTAINS ${fmtVal(value)}`;
|
|
3080
|
+
case "beginswith": return `${field} STARTS WITH ${fmtVal(value)}`;
|
|
3081
|
+
case "doesnotbeginwith": return `NOT ${field} STARTS WITH ${fmtVal(value)}`;
|
|
3082
|
+
case "endswith": return `${field} ENDS WITH ${fmtVal(value)}`;
|
|
3083
|
+
case "doesnotendwith": return `NOT ${field} ENDS WITH ${fmtVal(value)}`;
|
|
3084
|
+
case "null": return `${field} IS NULL`;
|
|
3085
|
+
case "notnull": return `${field} IS NOT NULL`;
|
|
3086
|
+
case "in":
|
|
3087
|
+
case "notin": {
|
|
3088
|
+
const values = toArray(value).map(fmtVal);
|
|
3089
|
+
if (!values.length) return "";
|
|
3090
|
+
return `${operatorTL === "notin" ? "NOT " : ""}${field} IN [${values.join(", ")}]`;
|
|
3091
|
+
}
|
|
3092
|
+
case "between":
|
|
3093
|
+
case "notbetween": {
|
|
3094
|
+
const arr = toArray(value);
|
|
3095
|
+
if (arr.length < 2) return "";
|
|
3096
|
+
const [low, high] = [fmtVal(arr[0]), fmtVal(arr[1])];
|
|
3097
|
+
const expr = `${low} <= ${field} AND ${field} <= ${high}`;
|
|
3098
|
+
return operatorTL === "notbetween" ? `NOT (${expr})` : expr;
|
|
3099
|
+
}
|
|
3100
|
+
default: return `${field} ${operator} ${fmtVal(value)}`;
|
|
3101
|
+
}
|
|
3102
|
+
};
|
|
3103
|
+
//#endregion
|
|
2868
3104
|
//#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
|
|
2869
3105
|
const rangeOperatorMap = {
|
|
2870
3106
|
"<": "lt",
|
|
@@ -3016,6 +3252,68 @@ const defaultRuleProcessorElasticSearch = (rule, options = {}) => {
|
|
|
3016
3252
|
return false;
|
|
3017
3253
|
};
|
|
3018
3254
|
//#endregion
|
|
3255
|
+
//#region src/utils/formatQuery/defaultRuleProcessorGremlin.ts
|
|
3256
|
+
const escapeSingleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll("'", "\\'");
|
|
3257
|
+
/**
|
|
3258
|
+
* Default rule processor used by {@link formatQuery} for "gremlin" format.
|
|
3259
|
+
*
|
|
3260
|
+
* Each rule becomes a `.has()` step (or `.hasNot()`/`.has()` for null checks).
|
|
3261
|
+
*
|
|
3262
|
+
* @group Export
|
|
3263
|
+
*/
|
|
3264
|
+
const defaultRuleProcessorGremlin = (rule, opts = {}) => {
|
|
3265
|
+
const { escapeQuotes, parseNumbers } = opts;
|
|
3266
|
+
const { field, operator, value, valueSource } = rule;
|
|
3267
|
+
const valueIsField = valueSource === "field";
|
|
3268
|
+
const operatorTL = operator.toLowerCase();
|
|
3269
|
+
const prop = field.includes(".") ? field.split(".").pop() : field;
|
|
3270
|
+
const fmtVal = (v) => {
|
|
3271
|
+
if (v === null || v === void 0) return "null";
|
|
3272
|
+
if (typeof v === "boolean" || typeof v === "bigint") return String(v);
|
|
3273
|
+
if (valueIsField) return trimIfString(v);
|
|
3274
|
+
if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
|
|
3275
|
+
return `'${escapeSingleQuotes(v, escapeQuotes)}'`;
|
|
3276
|
+
};
|
|
3277
|
+
switch (operatorTL) {
|
|
3278
|
+
case "=": return `.has('${prop}', ${fmtVal(value)})`;
|
|
3279
|
+
case "!=":
|
|
3280
|
+
case "<>": return `.has('${prop}', neq(${fmtVal(value)}))`;
|
|
3281
|
+
case "<": return `.has('${prop}', lt(${fmtVal(value)}))`;
|
|
3282
|
+
case ">": return `.has('${prop}', gt(${fmtVal(value)}))`;
|
|
3283
|
+
case "<=": return `.has('${prop}', lte(${fmtVal(value)}))`;
|
|
3284
|
+
case ">=": return `.has('${prop}', gte(${fmtVal(value)}))`;
|
|
3285
|
+
case "contains": return `.has('${prop}', containing(${fmtVal(value)}))`;
|
|
3286
|
+
case "doesnotcontain": return `.has('${prop}', notContaining(${fmtVal(value)}))`;
|
|
3287
|
+
case "beginswith": return `.has('${prop}', startingWith(${fmtVal(value)}))`;
|
|
3288
|
+
case "doesnotbeginwith": return `.has('${prop}', notStartingWith(${fmtVal(value)}))`;
|
|
3289
|
+
case "endswith": return `.has('${prop}', endingWith(${fmtVal(value)}))`;
|
|
3290
|
+
case "doesnotendwith": return `.has('${prop}', notEndingWith(${fmtVal(value)}))`;
|
|
3291
|
+
case "null": return `.hasNot('${prop}')`;
|
|
3292
|
+
case "notnull": return `.has('${prop}')`;
|
|
3293
|
+
case "in": {
|
|
3294
|
+
const items = toArray(value).map(fmtVal);
|
|
3295
|
+
if (!items.length) return "";
|
|
3296
|
+
return `.has('${prop}', within(${items.join(", ")}))`;
|
|
3297
|
+
}
|
|
3298
|
+
case "notin": {
|
|
3299
|
+
const items = toArray(value).map(fmtVal);
|
|
3300
|
+
if (!items.length) return "";
|
|
3301
|
+
return `.has('${prop}', without(${items.join(", ")}))`;
|
|
3302
|
+
}
|
|
3303
|
+
case "between": {
|
|
3304
|
+
const arr = toArray(value);
|
|
3305
|
+
if (arr.length < 2) return "";
|
|
3306
|
+
return `.has('${prop}', between(${fmtVal(arr[0])}, ${fmtVal(arr[1])}))`;
|
|
3307
|
+
}
|
|
3308
|
+
case "notbetween": {
|
|
3309
|
+
const arr = toArray(value);
|
|
3310
|
+
if (arr.length < 2) return "";
|
|
3311
|
+
return `.has('${prop}', outside(${fmtVal(arr[0])}, ${fmtVal(arr[1])}))`;
|
|
3312
|
+
}
|
|
3313
|
+
default: return `.has('${prop}', ${fmtVal(value)})`;
|
|
3314
|
+
}
|
|
3315
|
+
};
|
|
3316
|
+
//#endregion
|
|
3019
3317
|
//#region src/utils/formatQuery/defaultRuleProcessorJSONata.ts
|
|
3020
3318
|
const shouldNegate = (op) => op.startsWith("not") || op.startsWith("doesnot");
|
|
3021
3319
|
const quote = (v, escapeQuotes) => `"${typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`)}"`;
|
|
@@ -3270,6 +3568,8 @@ const defaultValueProcessorNL = (rule, opts = {}) => {
|
|
|
3270
3568
|
const orTL = t.or ?? "or";
|
|
3271
3569
|
const trueTL = t.true ?? "true";
|
|
3272
3570
|
const falseTL = t.false ?? "false";
|
|
3571
|
+
const listSep = t.listSeparator ?? ", ";
|
|
3572
|
+
const useOxfordComma = !t.listSeparator;
|
|
3273
3573
|
switch (operatorLowerCase) {
|
|
3274
3574
|
case "null":
|
|
3275
3575
|
case "notnull": return "";
|
|
@@ -3289,7 +3589,8 @@ const defaultValueProcessorNL = (rule, opts = {}) => {
|
|
|
3289
3589
|
if (valueAsArray.length === 0) return "";
|
|
3290
3590
|
const valStringArray = valueAsArray.map((v) => valueIsField ? wrapFieldName(getOption(fields ?? [], v)?.label ?? v) : shouldRenderAsNumber(v, parseNumbers) ? `${trimIfString(v)}` : `${wrapAndEscape(v)}`);
|
|
3291
3591
|
if (valStringArray.length === 1) return valStringArray[0];
|
|
3292
|
-
|
|
3592
|
+
const oxfordComma = useOxfordComma && valStringArray.length > 2 ? "," : "";
|
|
3593
|
+
return `(${`${valStringArray.slice(0, -1).join(listSep)}${oxfordComma} ${orTL} ${valStringArray.at(-1)}`})`;
|
|
3293
3594
|
}
|
|
3294
3595
|
}
|
|
3295
3596
|
if (typeof rule.value === "boolean") return rule.value ? trueTL : falseTL;
|
|
@@ -3402,7 +3703,14 @@ const defaultRuleProcessorNL = (rule, opts) => {
|
|
|
3402
3703
|
V: operatorProcessor(rule, opts),
|
|
3403
3704
|
O: value
|
|
3404
3705
|
};
|
|
3405
|
-
|
|
3706
|
+
const translations = opts?.translations ?? {};
|
|
3707
|
+
const suffixMap = {
|
|
3708
|
+
S: translations.afterSubject ?? " ",
|
|
3709
|
+
V: translations.afterVerb ?? " ",
|
|
3710
|
+
O: translations.afterObject ?? " "
|
|
3711
|
+
};
|
|
3712
|
+
const wordOrderTuple = normalizeConstituentWordOrder(wordOrder).filter((term) => wordOrderMap[term] !== "");
|
|
3713
|
+
return wordOrderTuple.map((term, i) => `${wordOrderMap[term]}${i < wordOrderTuple.length - 1 ? suffixMap[term] : ""}`).join("").trim();
|
|
3406
3714
|
};
|
|
3407
3715
|
//#endregion
|
|
3408
3716
|
//#region src/utils/formatQuery/defaultRuleProcessorSQL.ts
|
|
@@ -3638,8 +3946,11 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
|
|
|
3638
3946
|
const valueIsField = valueSource === "field";
|
|
3639
3947
|
const operatorLC = lc(operator);
|
|
3640
3948
|
if (!Op || valueIsField && (!col || !fn && [
|
|
3949
|
+
"contains",
|
|
3641
3950
|
"doesnotcontain",
|
|
3951
|
+
"beginswith",
|
|
3642
3952
|
"doesnotbeginwith",
|
|
3953
|
+
"endswith",
|
|
3643
3954
|
"doesnotendwith"
|
|
3644
3955
|
].includes(operatorLC))) return;
|
|
3645
3956
|
switch (operatorLC) {
|
|
@@ -3659,9 +3970,9 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
|
|
|
3659
3970
|
}[operatorLC];
|
|
3660
3971
|
return { [field]: valueIsField && operatorLC === "=" ? { [Op.col]: value } : { [sequelizeOperator]: valueIsField ? col(value) : shouldRenderAsNumber(value, parseNumbers) ? parseNumber(value, { parseNumbers: "strict" }) : value } };
|
|
3661
3972
|
}
|
|
3662
|
-
case "contains": return { [field]: { [Op.substring]: valueIsField ? col(value) : `${value}` } };
|
|
3663
|
-
case "beginswith": return { [field]: { [Op.startsWith]: valueIsField ? col(value) : `${value}` } };
|
|
3664
|
-
case "endswith": return { [field]: { [Op.endsWith]: valueIsField ? col(value) : `${value}` } };
|
|
3973
|
+
case "contains": return { [field]: { [valueIsField ? Op.like : Op.substring]: valueIsField ? fn("CONCAT", "%", col(value), "%") : `${value}` } };
|
|
3974
|
+
case "beginswith": return { [field]: { [valueIsField ? Op.like : Op.startsWith]: valueIsField ? fn("CONCAT", col(value), "%") : `${value}` } };
|
|
3975
|
+
case "endswith": return { [field]: { [valueIsField ? Op.like : Op.endsWith]: valueIsField ? fn("CONCAT", "%", col(value)) : `${value}` } };
|
|
3665
3976
|
case "doesnotcontain": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", "%", col(value), "%") : `%${value}%` } };
|
|
3666
3977
|
case "doesnotbeginwith": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", col(value), "%") : `${value}%` } };
|
|
3667
3978
|
case "doesnotendwith": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", "%", col(value)) : `%${value}` } };
|
|
@@ -3691,6 +4002,74 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
|
|
|
3691
4002
|
}
|
|
3692
4003
|
};
|
|
3693
4004
|
//#endregion
|
|
4005
|
+
//#region src/utils/formatQuery/defaultRuleProcessorSPARQL.ts
|
|
4006
|
+
const escapeDoubleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
|
|
4007
|
+
/** Auto-prefix a SPARQL variable name with `?` unless it's already prefixed, a URI, or a prefixed name.
|
|
4008
|
+
*
|
|
4009
|
+
* @group Export
|
|
4010
|
+
*/
|
|
4011
|
+
const sparqlVar = (name) => /^[?<]/.test(name) || name.includes(":") ? name : `?${name}`;
|
|
4012
|
+
/**
|
|
4013
|
+
* Default rule processor used by {@link formatQuery} for "sparql" format.
|
|
4014
|
+
*
|
|
4015
|
+
* @group Export
|
|
4016
|
+
*/
|
|
4017
|
+
const defaultRuleProcessorSPARQL = (rule, opts = {}) => {
|
|
4018
|
+
const { escapeQuotes, parseNumbers } = opts;
|
|
4019
|
+
const { field: rawField, operator, value, valueSource } = rule;
|
|
4020
|
+
const valueIsField = valueSource === "field";
|
|
4021
|
+
const operatorTL = operator.toLowerCase();
|
|
4022
|
+
const field = sparqlVar(rawField);
|
|
4023
|
+
const fmtVal = (v) => {
|
|
4024
|
+
if (v === null || v === void 0) return "\"\"";
|
|
4025
|
+
if (typeof v === "boolean") return `"${v}"^^xsd:boolean`;
|
|
4026
|
+
if (typeof v === "bigint") return String(v);
|
|
4027
|
+
if (valueIsField) return sparqlVar(trimIfString(v));
|
|
4028
|
+
if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
|
|
4029
|
+
const s = typeof v === "string" ? v : JSON.stringify(v) ?? "";
|
|
4030
|
+
if (s.startsWith("?") || s.startsWith("<") || s.includes(":")) return s;
|
|
4031
|
+
return `"${escapeDoubleQuotes(s, escapeQuotes)}"`;
|
|
4032
|
+
};
|
|
4033
|
+
switch (operatorTL) {
|
|
4034
|
+
case "=":
|
|
4035
|
+
case "!=":
|
|
4036
|
+
case "<":
|
|
4037
|
+
case ">":
|
|
4038
|
+
case "<=":
|
|
4039
|
+
case ">=": return `${field} ${operatorTL} ${fmtVal(value)}`;
|
|
4040
|
+
case "<>": return `${field} != ${fmtVal(value)}`;
|
|
4041
|
+
case "contains": return `CONTAINS(${field}, ${fmtVal(value)})`;
|
|
4042
|
+
case "doesnotcontain": return `!CONTAINS(${field}, ${fmtVal(value)})`;
|
|
4043
|
+
case "beginswith": return `STRSTARTS(${field}, ${fmtVal(value)})`;
|
|
4044
|
+
case "doesnotbeginwith": return `!STRSTARTS(${field}, ${fmtVal(value)})`;
|
|
4045
|
+
case "endswith": return `STRENDS(${field}, ${fmtVal(value)})`;
|
|
4046
|
+
case "doesnotendwith": return `!STRENDS(${field}, ${fmtVal(value)})`;
|
|
4047
|
+
case "null": return `!BOUND(${field})`;
|
|
4048
|
+
case "notnull": return `BOUND(${field})`;
|
|
4049
|
+
case "in": {
|
|
4050
|
+
const items = toArray(value).map(fmtVal);
|
|
4051
|
+
if (!items.length) return "";
|
|
4052
|
+
return `${field} IN (${items.join(", ")})`;
|
|
4053
|
+
}
|
|
4054
|
+
case "notin": {
|
|
4055
|
+
const items = toArray(value).map(fmtVal);
|
|
4056
|
+
if (!items.length) return "";
|
|
4057
|
+
return `${field} NOT IN (${items.join(", ")})`;
|
|
4058
|
+
}
|
|
4059
|
+
case "between": {
|
|
4060
|
+
const arr = toArray(value);
|
|
4061
|
+
if (arr.length < 2) return "";
|
|
4062
|
+
return `${field} >= ${fmtVal(arr[0])} && ${field} <= ${fmtVal(arr[1])}`;
|
|
4063
|
+
}
|
|
4064
|
+
case "notbetween": {
|
|
4065
|
+
const arr = toArray(value);
|
|
4066
|
+
if (arr.length < 2) return "";
|
|
4067
|
+
return `(${field} < ${fmtVal(arr[0])} || ${field} > ${fmtVal(arr[1])})`;
|
|
4068
|
+
}
|
|
4069
|
+
default: return `${field} ${operator} ${fmtVal(value)}`;
|
|
4070
|
+
}
|
|
4071
|
+
};
|
|
4072
|
+
//#endregion
|
|
3694
4073
|
//#region src/utils/formatQuery/formatQuery.ts
|
|
3695
4074
|
/**
|
|
3696
4075
|
* A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.
|
|
@@ -3738,6 +4117,10 @@ const defaultRuleProcessors = {
|
|
|
3738
4117
|
sequelize: defaultRuleProcessorSequelize,
|
|
3739
4118
|
spel: defaultRuleProcessorSpEL,
|
|
3740
4119
|
sql: defaultRuleProcessorSQL,
|
|
4120
|
+
cypher: defaultRuleProcessorCypher,
|
|
4121
|
+
gql: defaultRuleProcessorCypher,
|
|
4122
|
+
sparql: defaultRuleProcessorSPARQL,
|
|
4123
|
+
gremlin: defaultRuleProcessorGremlin,
|
|
3741
4124
|
diagnostics: defaultRuleProcessorSQL
|
|
3742
4125
|
};
|
|
3743
4126
|
/* v8 ignore next -- @preserve */
|
|
@@ -3760,6 +4143,10 @@ const defaultOperatorProcessors = {
|
|
|
3760
4143
|
sequelize: defaultOperatorProcessor,
|
|
3761
4144
|
spel: defaultOperatorProcessor,
|
|
3762
4145
|
sql: defaultOperatorProcessorSQL,
|
|
4146
|
+
cypher: defaultOperatorProcessor,
|
|
4147
|
+
gql: defaultOperatorProcessor,
|
|
4148
|
+
sparql: defaultOperatorProcessor,
|
|
4149
|
+
gremlin: defaultOperatorProcessor,
|
|
3763
4150
|
diagnostics: defaultOperatorProcessor
|
|
3764
4151
|
};
|
|
3765
4152
|
const defaultFallbackExpressions = {
|
|
@@ -3767,6 +4154,8 @@ const defaultFallbackExpressions = {
|
|
|
3767
4154
|
ldap: "",
|
|
3768
4155
|
mongodb: "\"$and\":[{\"$expr\":true}]",
|
|
3769
4156
|
natural_language: "1 is 1",
|
|
4157
|
+
sparql: "1 = 1",
|
|
4158
|
+
gremlin: "",
|
|
3770
4159
|
spel: "1 == 1",
|
|
3771
4160
|
sql: "(1 = 1)"
|
|
3772
4161
|
};
|
|
@@ -3907,6 +4296,10 @@ function formatQuery(ruleGroup, optionParam = {}) {
|
|
|
3907
4296
|
case "prisma": return defaultRuleGroupProcessorPrisma(ruleGroup, finalOptions);
|
|
3908
4297
|
case "drizzle": return defaultRuleGroupProcessorDrizzle(ruleGroup, finalOptions);
|
|
3909
4298
|
case "sequelize": return defaultRuleGroupProcessorSequelize(ruleGroup, finalOptions);
|
|
4299
|
+
case "cypher":
|
|
4300
|
+
case "gql": return defaultRuleGroupProcessorCypher(ruleGroup, finalOptions);
|
|
4301
|
+
case "sparql": return defaultRuleGroupProcessorSPARQL(ruleGroup, finalOptions);
|
|
4302
|
+
case "gremlin": return defaultRuleGroupProcessorGremlin(ruleGroup, finalOptions);
|
|
3910
4303
|
case "diagnostics": return defaultRuleGroupProcessorDiagnostics(ruleGroup, finalOptions);
|
|
3911
4304
|
default: return "";
|
|
3912
4305
|
}
|
|
@@ -4630,6 +5023,7 @@ exports.clsx = clsx;
|
|
|
4630
5023
|
exports.convertFromIC = convertFromIC;
|
|
4631
5024
|
exports.convertQuery = convertQuery;
|
|
4632
5025
|
exports.convertToIC = convertToIC;
|
|
5026
|
+
exports.cypherCombinatorMap = cypherCombinatorMap;
|
|
4633
5027
|
exports.defaultCELValueProcessor = defaultCELValueProcessor;
|
|
4634
5028
|
exports.defaultCombinatorLabelMap = defaultCombinatorLabelMap;
|
|
4635
5029
|
exports.defaultCombinators = defaultCombinators;
|
|
@@ -4657,9 +5051,11 @@ exports.defaultPlaceholderValueGroupLabel = defaultPlaceholderValueGroupLabel;
|
|
|
4657
5051
|
exports.defaultPlaceholderValueLabel = defaultPlaceholderValueLabel;
|
|
4658
5052
|
exports.defaultPlaceholderValueName = defaultPlaceholderValueName;
|
|
4659
5053
|
exports.defaultRuleGroupProcessorCEL = defaultRuleGroupProcessorCEL;
|
|
5054
|
+
exports.defaultRuleGroupProcessorCypher = defaultRuleGroupProcessorCypher;
|
|
4660
5055
|
exports.defaultRuleGroupProcessorDiagnostics = defaultRuleGroupProcessorDiagnostics;
|
|
4661
5056
|
exports.defaultRuleGroupProcessorDrizzle = defaultRuleGroupProcessorDrizzle;
|
|
4662
5057
|
exports.defaultRuleGroupProcessorElasticSearch = defaultRuleGroupProcessorElasticSearch;
|
|
5058
|
+
exports.defaultRuleGroupProcessorGremlin = defaultRuleGroupProcessorGremlin;
|
|
4663
5059
|
exports.defaultRuleGroupProcessorJSONata = defaultRuleGroupProcessorJSONata;
|
|
4664
5060
|
exports.defaultRuleGroupProcessorJsonLogic = defaultRuleGroupProcessorJsonLogic;
|
|
4665
5061
|
exports.defaultRuleGroupProcessorLDAP = defaultRuleGroupProcessorLDAP;
|
|
@@ -4668,12 +5064,15 @@ exports.defaultRuleGroupProcessorMongoDBQuery = defaultRuleGroupProcessorMongoDB
|
|
|
4668
5064
|
exports.defaultRuleGroupProcessorNL = defaultRuleGroupProcessorNL;
|
|
4669
5065
|
exports.defaultRuleGroupProcessorParameterized = defaultRuleGroupProcessorParameterized;
|
|
4670
5066
|
exports.defaultRuleGroupProcessorPrisma = defaultRuleGroupProcessorPrisma;
|
|
5067
|
+
exports.defaultRuleGroupProcessorSPARQL = defaultRuleGroupProcessorSPARQL;
|
|
4671
5068
|
exports.defaultRuleGroupProcessorSQL = defaultRuleGroupProcessorSQL;
|
|
4672
5069
|
exports.defaultRuleGroupProcessorSequelize = defaultRuleGroupProcessorSequelize;
|
|
4673
5070
|
exports.defaultRuleGroupProcessorSpEL = defaultRuleGroupProcessorSpEL;
|
|
4674
5071
|
exports.defaultRuleProcessorCEL = defaultRuleProcessorCEL;
|
|
5072
|
+
exports.defaultRuleProcessorCypher = defaultRuleProcessorCypher;
|
|
4675
5073
|
exports.defaultRuleProcessorDrizzle = defaultRuleProcessorDrizzle;
|
|
4676
5074
|
exports.defaultRuleProcessorElasticSearch = defaultRuleProcessorElasticSearch;
|
|
5075
|
+
exports.defaultRuleProcessorGremlin = defaultRuleProcessorGremlin;
|
|
4677
5076
|
exports.defaultRuleProcessorJSONata = defaultRuleProcessorJSONata;
|
|
4678
5077
|
exports.defaultRuleProcessorJsonLogic = defaultRuleProcessorJsonLogic;
|
|
4679
5078
|
exports.defaultRuleProcessorLDAP = defaultRuleProcessorLDAP;
|
|
@@ -4682,6 +5081,7 @@ exports.defaultRuleProcessorMongoDBQuery = defaultRuleProcessorMongoDBQuery;
|
|
|
4682
5081
|
exports.defaultRuleProcessorNL = defaultRuleProcessorNL;
|
|
4683
5082
|
exports.defaultRuleProcessorParameterized = defaultRuleProcessorParameterized;
|
|
4684
5083
|
exports.defaultRuleProcessorPrisma = defaultRuleProcessorPrisma;
|
|
5084
|
+
exports.defaultRuleProcessorSPARQL = defaultRuleProcessorSPARQL;
|
|
4685
5085
|
exports.defaultRuleProcessorSQL = defaultRuleProcessorSQL;
|
|
4686
5086
|
exports.defaultRuleProcessorSequelize = defaultRuleProcessorSequelize;
|
|
4687
5087
|
exports.defaultRuleProcessorSpEL = defaultRuleProcessorSpEL;
|
|
@@ -4777,6 +5177,7 @@ exports.remove = remove;
|
|
|
4777
5177
|
exports.removeInPlace = removeInPlace;
|
|
4778
5178
|
exports.rootPath = rootPath;
|
|
4779
5179
|
exports.shouldRenderAsNumber = shouldRenderAsNumber;
|
|
5180
|
+
exports.sparqlVar = sparqlVar;
|
|
4780
5181
|
exports.splitBy = splitBy;
|
|
4781
5182
|
exports.sqlDialectPresets = sqlDialectPresets;
|
|
4782
5183
|
exports.standardClassnames = standardClassnames;
|