@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
|
@@ -1481,7 +1481,7 @@ const defaultRuleGroupProcessorCEL = (ruleGroup, options) => {
|
|
|
1481
1481
|
//#endregion
|
|
1482
1482
|
//#region src/utils/formatQuery/defaultRuleProcessorCEL.ts
|
|
1483
1483
|
const shouldNegate$2 = (op) => op.startsWith("not") || op.startsWith("doesnot");
|
|
1484
|
-
const escapeDoubleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
|
|
1484
|
+
const escapeDoubleQuotes$1 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
|
|
1485
1485
|
/**
|
|
1486
1486
|
* Default rule processor used by {@link formatQuery} for "cel" format.
|
|
1487
1487
|
*
|
|
@@ -1523,19 +1523,19 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
|
|
|
1523
1523
|
case "==":
|
|
1524
1524
|
case "!=":
|
|
1525
1525
|
case ">":
|
|
1526
|
-
case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`}`;
|
|
1526
|
+
case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`}`;
|
|
1527
1527
|
case "contains":
|
|
1528
|
-
case "doesnotcontain": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.contains(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
|
|
1528
|
+
case "doesnotcontain": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.contains(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
|
|
1529
1529
|
case "beginswith":
|
|
1530
|
-
case "doesnotbeginwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.startsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
|
|
1530
|
+
case "doesnotbeginwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.startsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
|
|
1531
1531
|
case "endswith":
|
|
1532
|
-
case "doesnotendwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.endsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
|
|
1532
|
+
case "doesnotendwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.endsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
|
|
1533
1533
|
case "null": return `${field} == null`;
|
|
1534
1534
|
case "notnull": return `${field} != null`;
|
|
1535
1535
|
case "in":
|
|
1536
1536
|
case "notin": {
|
|
1537
1537
|
const [prefix, suffix] = shouldNegate$2(operatorTL) ? ["!(", ")"] : ["", ""];
|
|
1538
|
-
return `${prefix}${field} in [${toArray(value).map((val) => valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `"${escapeDoubleQuotes(val, escapeQuotes)}"`).join(", ")}]${suffix}`;
|
|
1538
|
+
return `${prefix}${field} in [${toArray(value).map((val) => valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `"${escapeDoubleQuotes$1(val, escapeQuotes)}"`).join(", ")}]${suffix}`;
|
|
1539
1539
|
}
|
|
1540
1540
|
case "between":
|
|
1541
1541
|
case "notbetween": {
|
|
@@ -1545,8 +1545,8 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
|
|
|
1545
1545
|
const shouldParseNumbers = !(parseNumbers === false);
|
|
1546
1546
|
const firstNum = shouldRenderAsNumber(first, shouldParseNumbers) ? parseNumber(first, { parseNumbers: shouldParseNumbers }) : NaN;
|
|
1547
1547
|
const secondNum = shouldRenderAsNumber(second, shouldParseNumbers) ? parseNumber(second, { parseNumbers: shouldParseNumbers }) : NaN;
|
|
1548
|
-
let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `"${escapeDoubleQuotes(first, escapeQuotes)}"` : firstNum;
|
|
1549
|
-
let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `"${escapeDoubleQuotes(second, escapeQuotes)}"` : secondNum;
|
|
1548
|
+
let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `"${escapeDoubleQuotes$1(first, escapeQuotes)}"` : firstNum;
|
|
1549
|
+
let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `"${escapeDoubleQuotes$1(second, escapeQuotes)}"` : secondNum;
|
|
1550
1550
|
if (!preserveValueOrder && firstValue === firstNum && secondValue === secondNum && secondNum < firstNum) {
|
|
1551
1551
|
const tempNum = secondNum;
|
|
1552
1552
|
secondValue = firstNum;
|
|
@@ -1802,7 +1802,7 @@ const defaultRuleGroupProcessorSpEL = (ruleGroup, options) => {
|
|
|
1802
1802
|
//#region src/utils/formatQuery/defaultRuleProcessorSpEL.ts
|
|
1803
1803
|
const shouldNegate$1 = (op) => op.startsWith("not") || op.startsWith("doesnot");
|
|
1804
1804
|
const wrapInNegation = (clause, negate) => negate ? `!(${clause})` : clause;
|
|
1805
|
-
const escapeSingleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\'`);
|
|
1805
|
+
const escapeSingleQuotes$2 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\'`);
|
|
1806
1806
|
/**
|
|
1807
1807
|
* Default rule processor used by {@link formatQuery} for "spel" format.
|
|
1808
1808
|
*
|
|
@@ -1843,20 +1843,20 @@ const defaultRuleProcessorSpEL = (rule, opts = {}) => {
|
|
|
1843
1843
|
case "==":
|
|
1844
1844
|
case "!=":
|
|
1845
1845
|
case ">":
|
|
1846
|
-
case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes(value, escapeQuotes)}'`}`;
|
|
1846
|
+
case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes$2(value, escapeQuotes)}'`}`;
|
|
1847
1847
|
case "contains":
|
|
1848
|
-
case "doesnotcontain": return wrapInNegation(`${field} matches ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
|
|
1848
|
+
case "doesnotcontain": return wrapInNegation(`${field} matches ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes$2(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
|
|
1849
1849
|
case "beginswith":
|
|
1850
|
-
case "doesnotbeginwith": return wrapInNegation(`${field} matches ${valueIsField ? `'^'.concat(${trimIfString(value)})` : `'${typeof value === "string" && !value.startsWith("^") || useBareValue ? "^" : ""}${escapeSingleQuotes(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
|
|
1850
|
+
case "doesnotbeginwith": return wrapInNegation(`${field} matches ${valueIsField ? `'^'.concat(${trimIfString(value)})` : `'${typeof value === "string" && !value.startsWith("^") || useBareValue ? "^" : ""}${escapeSingleQuotes$2(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
|
|
1851
1851
|
case "endswith":
|
|
1852
|
-
case "doesnotendwith": return wrapInNegation(`${field} matches ${valueIsField ? `${trimIfString(value)}.concat('$')` : `'${escapeSingleQuotes(value, escapeQuotes)}${typeof value === "string" && !value.endsWith("$") || useBareValue ? "$" : ""}'`}`, shouldNegate$1(operatorTL));
|
|
1852
|
+
case "doesnotendwith": return wrapInNegation(`${field} matches ${valueIsField ? `${trimIfString(value)}.concat('$')` : `'${escapeSingleQuotes$2(value, escapeQuotes)}${typeof value === "string" && !value.endsWith("$") || useBareValue ? "$" : ""}'`}`, shouldNegate$1(operatorTL));
|
|
1853
1853
|
case "null": return `${field} == null`;
|
|
1854
1854
|
case "notnull": return `${field} != null`;
|
|
1855
1855
|
case "in":
|
|
1856
1856
|
case "notin": {
|
|
1857
1857
|
const negate = shouldNegate$1(operatorTL) ? "!" : "";
|
|
1858
1858
|
const valueAsArray = toArray(value);
|
|
1859
|
-
return valueAsArray.length > 0 ? `${negate}(${valueAsArray.map((val) => `${field} == ${valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `'${escapeSingleQuotes(val, escapeQuotes)}'`}`).join(" or ")})` : "";
|
|
1859
|
+
return valueAsArray.length > 0 ? `${negate}(${valueAsArray.map((val) => `${field} == ${valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `'${escapeSingleQuotes$2(val, escapeQuotes)}'`}`).join(" or ")})` : "";
|
|
1860
1860
|
}
|
|
1861
1861
|
case "between":
|
|
1862
1862
|
case "notbetween": {
|
|
@@ -1866,8 +1866,8 @@ const defaultRuleProcessorSpEL = (rule, opts = {}) => {
|
|
|
1866
1866
|
const shouldParseNumbers = !(parseNumbers === false);
|
|
1867
1867
|
const firstNum = shouldRenderAsNumber(first, shouldParseNumbers) ? parseNumber(first, { parseNumbers: shouldParseNumbers }) : NaN;
|
|
1868
1868
|
const secondNum = shouldRenderAsNumber(second, shouldParseNumbers) ? parseNumber(second, { parseNumbers: shouldParseNumbers }) : NaN;
|
|
1869
|
-
let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `'${escapeSingleQuotes(first, escapeQuotes)}'` : firstNum;
|
|
1870
|
-
let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `'${escapeSingleQuotes(second, escapeQuotes)}'` : secondNum;
|
|
1869
|
+
let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `'${escapeSingleQuotes$2(first, escapeQuotes)}'` : firstNum;
|
|
1870
|
+
let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `'${escapeSingleQuotes$2(second, escapeQuotes)}'` : secondNum;
|
|
1871
1871
|
if (!preserveValueOrder && firstValue === firstNum && secondValue === secondNum && secondNum < firstNum) {
|
|
1872
1872
|
const tempNum = secondNum;
|
|
1873
1873
|
secondValue = firstNum;
|
|
@@ -1922,7 +1922,7 @@ const defaultValueProcessorByRule = ({ operator, value, valueSource }, { escapeQ
|
|
|
1922
1922
|
valsOneAndTwoOnly[0] = secondNum;
|
|
1923
1923
|
valsOneAndTwoOnly[1] = firstNum;
|
|
1924
1924
|
}
|
|
1925
|
-
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"} `);
|
|
1925
|
+
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"} `);
|
|
1926
1926
|
}
|
|
1927
1927
|
case "contains":
|
|
1928
1928
|
case "doesnotcontain": return valueIsField ? concat(quoteValue("%"), wrapFieldName(value), quoteValue("%")) : quoteValue(`%${escapeValue(value)}%`);
|
|
@@ -1935,6 +1935,70 @@ const defaultValueProcessorByRule = ({ operator, value, valueSource }, { escapeQ
|
|
|
1935
1935
|
return valueIsField ? wrapFieldName(value) : shouldRenderAsNumber(value, parseNumbers) ? `${trimIfString(value)}` : `${wrapAndEscape(value)}`;
|
|
1936
1936
|
};
|
|
1937
1937
|
//#endregion
|
|
1938
|
+
//#region src/utils/formatQuery/defaultRuleGroupProcessorCypher.ts
|
|
1939
|
+
/**
|
|
1940
|
+
* Maps a {@link DefaultCombinatorName} to a Cypher combinator keyword.
|
|
1941
|
+
*
|
|
1942
|
+
* @group Export
|
|
1943
|
+
*/
|
|
1944
|
+
const cypherCombinatorMap = {
|
|
1945
|
+
and: "AND",
|
|
1946
|
+
or: "OR"
|
|
1947
|
+
};
|
|
1948
|
+
/**
|
|
1949
|
+
* Rule group processor used by {@link formatQuery} for "cypher" and "gql" formats.
|
|
1950
|
+
*
|
|
1951
|
+
* @group Export
|
|
1952
|
+
*/
|
|
1953
|
+
const defaultRuleGroupProcessorCypher = (ruleGroup, options) => {
|
|
1954
|
+
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
|
|
1955
|
+
const processRuleGroup = (rg, outermost) => {
|
|
1956
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? fallbackExpression : "";
|
|
1957
|
+
const processedRules = [];
|
|
1958
|
+
let precedingCombinator = "";
|
|
1959
|
+
let firstRule = true;
|
|
1960
|
+
for (const rule of rg.rules) {
|
|
1961
|
+
if (typeof rule === "string") {
|
|
1962
|
+
precedingCombinator = cypherCombinatorMap[rule];
|
|
1963
|
+
continue;
|
|
1964
|
+
}
|
|
1965
|
+
if (isRuleGroup(rule)) {
|
|
1966
|
+
const processedGroup = processRuleGroup(rule);
|
|
1967
|
+
if (processedGroup) {
|
|
1968
|
+
if (!firstRule && precedingCombinator) {
|
|
1969
|
+
processedRules.push(precedingCombinator);
|
|
1970
|
+
precedingCombinator = "";
|
|
1971
|
+
}
|
|
1972
|
+
firstRule = false;
|
|
1973
|
+
processedRules.push(processedGroup);
|
|
1974
|
+
}
|
|
1975
|
+
continue;
|
|
1976
|
+
}
|
|
1977
|
+
const [validationResult, fieldValidator] = validateRule(rule);
|
|
1978
|
+
if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
|
|
1979
|
+
const fieldData = getOption(fields, rule.field);
|
|
1980
|
+
const processedRule = ruleProcessor(rule, {
|
|
1981
|
+
...options,
|
|
1982
|
+
parseNumbers: getParseNumberBoolean(fieldData?.inputType),
|
|
1983
|
+
escapeQuotes: (rule.valueSource ?? "value") === "value",
|
|
1984
|
+
fieldData
|
|
1985
|
+
});
|
|
1986
|
+
if (processedRule) {
|
|
1987
|
+
if (!firstRule && precedingCombinator) {
|
|
1988
|
+
processedRules.push(precedingCombinator);
|
|
1989
|
+
precedingCombinator = "";
|
|
1990
|
+
}
|
|
1991
|
+
firstRule = false;
|
|
1992
|
+
processedRules.push(processedRule);
|
|
1993
|
+
}
|
|
1994
|
+
}
|
|
1995
|
+
const expression = processedRules.join(isRuleGroupType(rg) ? ` ${cypherCombinatorMap[rg.combinator]} ` : " ");
|
|
1996
|
+
const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? "NOT " : ""}(`, ")"] : ["", ""];
|
|
1997
|
+
return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;
|
|
1998
|
+
};
|
|
1999
|
+
return processRuleGroup(ruleGroup, true);
|
|
2000
|
+
};
|
|
2001
|
+
//#endregion
|
|
1938
2002
|
//#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
|
|
1939
2003
|
/**
|
|
1940
2004
|
* Default rule processor used by {@link formatQuery} for the "drizzle" format.
|
|
@@ -2102,6 +2166,67 @@ const defaultRuleGroupProcessorElasticSearch = (ruleGroup, options) => {
|
|
|
2102
2166
|
return processedRuleGroup === false ? {} : processedRuleGroup;
|
|
2103
2167
|
};
|
|
2104
2168
|
//#endregion
|
|
2169
|
+
//#region src/utils/formatQuery/defaultRuleGroupProcessorGremlin.ts
|
|
2170
|
+
/**
|
|
2171
|
+
* Rule group processor used by {@link formatQuery} for "gremlin" format.
|
|
2172
|
+
*
|
|
2173
|
+
* At the top level, filter rules produce chained `.has()` steps (implicit AND).
|
|
2174
|
+
* Nested groups use `.and()` / `.or()` / `.not()` compound traversals with
|
|
2175
|
+
* `__` anonymous traversal prefixes.
|
|
2176
|
+
*
|
|
2177
|
+
* @group Export
|
|
2178
|
+
*/
|
|
2179
|
+
const defaultRuleGroupProcessorGremlin = (ruleGroup, options) => {
|
|
2180
|
+
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
|
|
2181
|
+
const validateAndProcess = (rule) => {
|
|
2182
|
+
// v8 ignore next -- @preserve
|
|
2183
|
+
if (typeof rule === "string" || isRuleGroup(rule)) return void 0;
|
|
2184
|
+
const [validationResult, fieldValidator] = validateRule(rule);
|
|
2185
|
+
if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) return;
|
|
2186
|
+
const fieldData = getOption(fields, rule.field);
|
|
2187
|
+
return ruleProcessor(rule, {
|
|
2188
|
+
...options,
|
|
2189
|
+
parseNumbers: getParseNumberBoolean(fieldData?.inputType),
|
|
2190
|
+
escapeQuotes: (rule.valueSource ?? "value") === "value",
|
|
2191
|
+
fieldData
|
|
2192
|
+
});
|
|
2193
|
+
};
|
|
2194
|
+
/** Recursively processes a nested group into `.and()`/`.or()`/`.not()` form. */
|
|
2195
|
+
const processNested = (rg) => {
|
|
2196
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return "";
|
|
2197
|
+
const predicates = [];
|
|
2198
|
+
for (const rule of rg.rules) {
|
|
2199
|
+
if (typeof rule === "string") continue;
|
|
2200
|
+
if (isRuleGroup(rule)) {
|
|
2201
|
+
const nested = processNested(rule);
|
|
2202
|
+
if (nested) predicates.push(nested);
|
|
2203
|
+
continue;
|
|
2204
|
+
}
|
|
2205
|
+
const processed = validateAndProcess(rule);
|
|
2206
|
+
if (processed) predicates.push(processed);
|
|
2207
|
+
}
|
|
2208
|
+
if (predicates.length === 0) return "";
|
|
2209
|
+
const combinator = rg.combinator ?? "and";
|
|
2210
|
+
const prefix = rg.not ? "not" : combinator;
|
|
2211
|
+
if (predicates.length === 1 && !rg.not) return predicates[0];
|
|
2212
|
+
return `.${prefix}(${predicates.map((p) => p.startsWith(".") ? `__${p}` : p).join(", ")})`;
|
|
2213
|
+
};
|
|
2214
|
+
if (!isRuleOrGroupValid(ruleGroup, validationMap[ruleGroup.id ?? ""])) return fallbackExpression;
|
|
2215
|
+
const steps = [];
|
|
2216
|
+
for (const rule of ruleGroup.rules) {
|
|
2217
|
+
if (typeof rule === "string") continue;
|
|
2218
|
+
if (isRuleGroup(rule)) {
|
|
2219
|
+
const compound = processNested(rule);
|
|
2220
|
+
if (compound) steps.push(compound);
|
|
2221
|
+
continue;
|
|
2222
|
+
}
|
|
2223
|
+
const processed = validateAndProcess(rule);
|
|
2224
|
+
if (processed) steps.push(processed);
|
|
2225
|
+
}
|
|
2226
|
+
if (steps.length === 0) return fallbackExpression;
|
|
2227
|
+
return steps.join("");
|
|
2228
|
+
};
|
|
2229
|
+
//#endregion
|
|
2105
2230
|
//#region src/utils/formatQuery/defaultRuleGroupProcessorJSONata.ts
|
|
2106
2231
|
/**
|
|
2107
2232
|
* Rule group processor used by {@link formatQuery} for "jsonata" format.
|
|
@@ -2272,7 +2397,7 @@ const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
|
|
|
2272
2397
|
let firstRule = true;
|
|
2273
2398
|
for (const rule of rg2.rules) {
|
|
2274
2399
|
if (typeof rule === "string") {
|
|
2275
|
-
precedingCombinator =
|
|
2400
|
+
precedingCombinator = `${translations.ruleSeparator ?? ", "}${translations[rule] ?? rule} `;
|
|
2276
2401
|
continue;
|
|
2277
2402
|
}
|
|
2278
2403
|
if (isRuleGroup(rule)) {
|
|
@@ -2314,7 +2439,8 @@ const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
|
|
|
2314
2439
|
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));
|
|
2315
2440
|
const prefix = mustWrap ? `${prefixTL} (`.trim() : "";
|
|
2316
2441
|
const suffix = mustWrap ? `) ${suffixTL}`.trim() : "";
|
|
2317
|
-
|
|
2442
|
+
const sep = translations.ruleSeparator ?? ", ";
|
|
2443
|
+
return `${prefix}${processedRules.join(isRuleGroupType(rg2) ? `${sep}${translations[combinator] ?? combinator} ` : "")}${suffix}`;
|
|
2318
2444
|
};
|
|
2319
2445
|
return processRuleGroup(ruleGroup, true);
|
|
2320
2446
|
};
|
|
@@ -2489,6 +2615,63 @@ const defaultRuleGroupProcessorSequelize = (ruleGroup, options) => {
|
|
|
2489
2615
|
return processRuleGroup(convertFromIC(ruleGroup), true);
|
|
2490
2616
|
};
|
|
2491
2617
|
//#endregion
|
|
2618
|
+
//#region src/utils/formatQuery/defaultRuleGroupProcessorSPARQL.ts
|
|
2619
|
+
/**
|
|
2620
|
+
* Rule group processor used by {@link formatQuery} for "sparql" format.
|
|
2621
|
+
*
|
|
2622
|
+
* SPARQL uses the same combinators as CEL (`&&` / `||`) and `!()` for negation.
|
|
2623
|
+
*
|
|
2624
|
+
* @group Export
|
|
2625
|
+
*/
|
|
2626
|
+
const defaultRuleGroupProcessorSPARQL = (ruleGroup, options) => {
|
|
2627
|
+
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
|
|
2628
|
+
const processRuleGroup = (rg, outermost) => {
|
|
2629
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? fallbackExpression : "";
|
|
2630
|
+
const processedRules = [];
|
|
2631
|
+
let precedingCombinator = "";
|
|
2632
|
+
let firstRule = true;
|
|
2633
|
+
for (const rule of rg.rules) {
|
|
2634
|
+
if (typeof rule === "string") {
|
|
2635
|
+
precedingCombinator = celCombinatorMap[rule];
|
|
2636
|
+
continue;
|
|
2637
|
+
}
|
|
2638
|
+
if (isRuleGroup(rule)) {
|
|
2639
|
+
const processedGroup = processRuleGroup(rule);
|
|
2640
|
+
if (processedGroup) {
|
|
2641
|
+
if (!firstRule && precedingCombinator) {
|
|
2642
|
+
processedRules.push(precedingCombinator);
|
|
2643
|
+
precedingCombinator = "";
|
|
2644
|
+
}
|
|
2645
|
+
firstRule = false;
|
|
2646
|
+
processedRules.push(processedGroup);
|
|
2647
|
+
}
|
|
2648
|
+
continue;
|
|
2649
|
+
}
|
|
2650
|
+
const [validationResult, fieldValidator] = validateRule(rule);
|
|
2651
|
+
if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
|
|
2652
|
+
const fieldData = getOption(fields, rule.field);
|
|
2653
|
+
const processedRule = ruleProcessor(rule, {
|
|
2654
|
+
...options,
|
|
2655
|
+
parseNumbers: getParseNumberBoolean(fieldData?.inputType),
|
|
2656
|
+
escapeQuotes: (rule.valueSource ?? "value") === "value",
|
|
2657
|
+
fieldData
|
|
2658
|
+
});
|
|
2659
|
+
if (processedRule) {
|
|
2660
|
+
if (!firstRule && precedingCombinator) {
|
|
2661
|
+
processedRules.push(precedingCombinator);
|
|
2662
|
+
precedingCombinator = "";
|
|
2663
|
+
}
|
|
2664
|
+
firstRule = false;
|
|
2665
|
+
processedRules.push(processedRule);
|
|
2666
|
+
}
|
|
2667
|
+
}
|
|
2668
|
+
const expression = processedRules.join(isRuleGroupType(rg) ? ` ${celCombinatorMap[rg.combinator]} ` : " ");
|
|
2669
|
+
const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? "!" : ""}(`, ")"] : ["", ""];
|
|
2670
|
+
return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;
|
|
2671
|
+
};
|
|
2672
|
+
return processRuleGroup(ruleGroup, true);
|
|
2673
|
+
};
|
|
2674
|
+
//#endregion
|
|
2492
2675
|
//#region src/utils/formatQuery/defaultRuleGroupProcessorSQL.ts
|
|
2493
2676
|
/**
|
|
2494
2677
|
* Default rule processor used by {@link formatQuery} for "sql" format.
|
|
@@ -2864,6 +3047,59 @@ const getFieldValidatorReasons = (rule, fieldValidator) => {
|
|
|
2864
3047
|
}
|
|
2865
3048
|
};
|
|
2866
3049
|
//#endregion
|
|
3050
|
+
//#region src/utils/formatQuery/defaultRuleProcessorCypher.ts
|
|
3051
|
+
const escapeSingleQuotes$1 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll("'", "\\'");
|
|
3052
|
+
/**
|
|
3053
|
+
* Default rule processor used by {@link formatQuery} for "cypher" and "gql" formats.
|
|
3054
|
+
*
|
|
3055
|
+
* @group Export
|
|
3056
|
+
*/
|
|
3057
|
+
const defaultRuleProcessorCypher = (rule, opts = {}) => {
|
|
3058
|
+
const { escapeQuotes, parseNumbers } = opts;
|
|
3059
|
+
const { field, operator, value, valueSource } = rule;
|
|
3060
|
+
const valueIsField = valueSource === "field";
|
|
3061
|
+
const operatorTL = operator.toLowerCase();
|
|
3062
|
+
const fmtVal = (v) => {
|
|
3063
|
+
if (v === null || v === void 0) return "null";
|
|
3064
|
+
if (typeof v === "boolean" || typeof v === "bigint") return String(v);
|
|
3065
|
+
if (valueIsField) return trimIfString(v);
|
|
3066
|
+
if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
|
|
3067
|
+
return `'${escapeSingleQuotes$1(v, escapeQuotes)}'`;
|
|
3068
|
+
};
|
|
3069
|
+
switch (operatorTL) {
|
|
3070
|
+
case "=": return `${field} = ${fmtVal(value)}`;
|
|
3071
|
+
case "!=":
|
|
3072
|
+
case "<>": return `${field} <> ${fmtVal(value)}`;
|
|
3073
|
+
case "<":
|
|
3074
|
+
case ">":
|
|
3075
|
+
case "<=":
|
|
3076
|
+
case ">=": return `${field} ${operatorTL} ${fmtVal(value)}`;
|
|
3077
|
+
case "contains": return `${field} CONTAINS ${fmtVal(value)}`;
|
|
3078
|
+
case "doesnotcontain": return `NOT ${field} CONTAINS ${fmtVal(value)}`;
|
|
3079
|
+
case "beginswith": return `${field} STARTS WITH ${fmtVal(value)}`;
|
|
3080
|
+
case "doesnotbeginwith": return `NOT ${field} STARTS WITH ${fmtVal(value)}`;
|
|
3081
|
+
case "endswith": return `${field} ENDS WITH ${fmtVal(value)}`;
|
|
3082
|
+
case "doesnotendwith": return `NOT ${field} ENDS WITH ${fmtVal(value)}`;
|
|
3083
|
+
case "null": return `${field} IS NULL`;
|
|
3084
|
+
case "notnull": return `${field} IS NOT NULL`;
|
|
3085
|
+
case "in":
|
|
3086
|
+
case "notin": {
|
|
3087
|
+
const values = toArray(value).map(fmtVal);
|
|
3088
|
+
if (!values.length) return "";
|
|
3089
|
+
return `${operatorTL === "notin" ? "NOT " : ""}${field} IN [${values.join(", ")}]`;
|
|
3090
|
+
}
|
|
3091
|
+
case "between":
|
|
3092
|
+
case "notbetween": {
|
|
3093
|
+
const arr = toArray(value);
|
|
3094
|
+
if (arr.length < 2) return "";
|
|
3095
|
+
const [low, high] = [fmtVal(arr[0]), fmtVal(arr[1])];
|
|
3096
|
+
const expr = `${low} <= ${field} AND ${field} <= ${high}`;
|
|
3097
|
+
return operatorTL === "notbetween" ? `NOT (${expr})` : expr;
|
|
3098
|
+
}
|
|
3099
|
+
default: return `${field} ${operator} ${fmtVal(value)}`;
|
|
3100
|
+
}
|
|
3101
|
+
};
|
|
3102
|
+
//#endregion
|
|
2867
3103
|
//#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
|
|
2868
3104
|
const rangeOperatorMap = {
|
|
2869
3105
|
"<": "lt",
|
|
@@ -3015,6 +3251,68 @@ const defaultRuleProcessorElasticSearch = (rule, options = {}) => {
|
|
|
3015
3251
|
return false;
|
|
3016
3252
|
};
|
|
3017
3253
|
//#endregion
|
|
3254
|
+
//#region src/utils/formatQuery/defaultRuleProcessorGremlin.ts
|
|
3255
|
+
const escapeSingleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll("'", "\\'");
|
|
3256
|
+
/**
|
|
3257
|
+
* Default rule processor used by {@link formatQuery} for "gremlin" format.
|
|
3258
|
+
*
|
|
3259
|
+
* Each rule becomes a `.has()` step (or `.hasNot()`/`.has()` for null checks).
|
|
3260
|
+
*
|
|
3261
|
+
* @group Export
|
|
3262
|
+
*/
|
|
3263
|
+
const defaultRuleProcessorGremlin = (rule, opts = {}) => {
|
|
3264
|
+
const { escapeQuotes, parseNumbers } = opts;
|
|
3265
|
+
const { field, operator, value, valueSource } = rule;
|
|
3266
|
+
const valueIsField = valueSource === "field";
|
|
3267
|
+
const operatorTL = operator.toLowerCase();
|
|
3268
|
+
const prop = field.includes(".") ? field.split(".").pop() : field;
|
|
3269
|
+
const fmtVal = (v) => {
|
|
3270
|
+
if (v === null || v === void 0) return "null";
|
|
3271
|
+
if (typeof v === "boolean" || typeof v === "bigint") return String(v);
|
|
3272
|
+
if (valueIsField) return trimIfString(v);
|
|
3273
|
+
if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
|
|
3274
|
+
return `'${escapeSingleQuotes(v, escapeQuotes)}'`;
|
|
3275
|
+
};
|
|
3276
|
+
switch (operatorTL) {
|
|
3277
|
+
case "=": return `.has('${prop}', ${fmtVal(value)})`;
|
|
3278
|
+
case "!=":
|
|
3279
|
+
case "<>": return `.has('${prop}', neq(${fmtVal(value)}))`;
|
|
3280
|
+
case "<": return `.has('${prop}', lt(${fmtVal(value)}))`;
|
|
3281
|
+
case ">": return `.has('${prop}', gt(${fmtVal(value)}))`;
|
|
3282
|
+
case "<=": return `.has('${prop}', lte(${fmtVal(value)}))`;
|
|
3283
|
+
case ">=": return `.has('${prop}', gte(${fmtVal(value)}))`;
|
|
3284
|
+
case "contains": return `.has('${prop}', containing(${fmtVal(value)}))`;
|
|
3285
|
+
case "doesnotcontain": return `.has('${prop}', notContaining(${fmtVal(value)}))`;
|
|
3286
|
+
case "beginswith": return `.has('${prop}', startingWith(${fmtVal(value)}))`;
|
|
3287
|
+
case "doesnotbeginwith": return `.has('${prop}', notStartingWith(${fmtVal(value)}))`;
|
|
3288
|
+
case "endswith": return `.has('${prop}', endingWith(${fmtVal(value)}))`;
|
|
3289
|
+
case "doesnotendwith": return `.has('${prop}', notEndingWith(${fmtVal(value)}))`;
|
|
3290
|
+
case "null": return `.hasNot('${prop}')`;
|
|
3291
|
+
case "notnull": return `.has('${prop}')`;
|
|
3292
|
+
case "in": {
|
|
3293
|
+
const items = toArray(value).map(fmtVal);
|
|
3294
|
+
if (!items.length) return "";
|
|
3295
|
+
return `.has('${prop}', within(${items.join(", ")}))`;
|
|
3296
|
+
}
|
|
3297
|
+
case "notin": {
|
|
3298
|
+
const items = toArray(value).map(fmtVal);
|
|
3299
|
+
if (!items.length) return "";
|
|
3300
|
+
return `.has('${prop}', without(${items.join(", ")}))`;
|
|
3301
|
+
}
|
|
3302
|
+
case "between": {
|
|
3303
|
+
const arr = toArray(value);
|
|
3304
|
+
if (arr.length < 2) return "";
|
|
3305
|
+
return `.has('${prop}', between(${fmtVal(arr[0])}, ${fmtVal(arr[1])}))`;
|
|
3306
|
+
}
|
|
3307
|
+
case "notbetween": {
|
|
3308
|
+
const arr = toArray(value);
|
|
3309
|
+
if (arr.length < 2) return "";
|
|
3310
|
+
return `.has('${prop}', outside(${fmtVal(arr[0])}, ${fmtVal(arr[1])}))`;
|
|
3311
|
+
}
|
|
3312
|
+
default: return `.has('${prop}', ${fmtVal(value)})`;
|
|
3313
|
+
}
|
|
3314
|
+
};
|
|
3315
|
+
//#endregion
|
|
3018
3316
|
//#region src/utils/formatQuery/defaultRuleProcessorJSONata.ts
|
|
3019
3317
|
const shouldNegate = (op) => op.startsWith("not") || op.startsWith("doesnot");
|
|
3020
3318
|
const quote = (v, escapeQuotes) => `"${typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`)}"`;
|
|
@@ -3269,6 +3567,8 @@ const defaultValueProcessorNL = (rule, opts = {}) => {
|
|
|
3269
3567
|
const orTL = t.or ?? "or";
|
|
3270
3568
|
const trueTL = t.true ?? "true";
|
|
3271
3569
|
const falseTL = t.false ?? "false";
|
|
3570
|
+
const listSep = t.listSeparator ?? ", ";
|
|
3571
|
+
const useOxfordComma = !t.listSeparator;
|
|
3272
3572
|
switch (operatorLowerCase) {
|
|
3273
3573
|
case "null":
|
|
3274
3574
|
case "notnull": return "";
|
|
@@ -3288,7 +3588,8 @@ const defaultValueProcessorNL = (rule, opts = {}) => {
|
|
|
3288
3588
|
if (valueAsArray.length === 0) return "";
|
|
3289
3589
|
const valStringArray = valueAsArray.map((v) => valueIsField ? wrapFieldName(getOption(fields ?? [], v)?.label ?? v) : shouldRenderAsNumber(v, parseNumbers) ? `${trimIfString(v)}` : `${wrapAndEscape(v)}`);
|
|
3290
3590
|
if (valStringArray.length === 1) return valStringArray[0];
|
|
3291
|
-
|
|
3591
|
+
const oxfordComma = useOxfordComma && valStringArray.length > 2 ? "," : "";
|
|
3592
|
+
return `(${`${valStringArray.slice(0, -1).join(listSep)}${oxfordComma} ${orTL} ${valStringArray.at(-1)}`})`;
|
|
3292
3593
|
}
|
|
3293
3594
|
}
|
|
3294
3595
|
if (typeof rule.value === "boolean") return rule.value ? trueTL : falseTL;
|
|
@@ -3401,7 +3702,14 @@ const defaultRuleProcessorNL = (rule, opts) => {
|
|
|
3401
3702
|
V: operatorProcessor(rule, opts),
|
|
3402
3703
|
O: value
|
|
3403
3704
|
};
|
|
3404
|
-
|
|
3705
|
+
const translations = opts?.translations ?? {};
|
|
3706
|
+
const suffixMap = {
|
|
3707
|
+
S: translations.afterSubject ?? " ",
|
|
3708
|
+
V: translations.afterVerb ?? " ",
|
|
3709
|
+
O: translations.afterObject ?? " "
|
|
3710
|
+
};
|
|
3711
|
+
const wordOrderTuple = normalizeConstituentWordOrder(wordOrder).filter((term) => wordOrderMap[term] !== "");
|
|
3712
|
+
return wordOrderTuple.map((term, i) => `${wordOrderMap[term]}${i < wordOrderTuple.length - 1 ? suffixMap[term] : ""}`).join("").trim();
|
|
3405
3713
|
};
|
|
3406
3714
|
//#endregion
|
|
3407
3715
|
//#region src/utils/formatQuery/defaultRuleProcessorSQL.ts
|
|
@@ -3637,8 +3945,11 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
|
|
|
3637
3945
|
const valueIsField = valueSource === "field";
|
|
3638
3946
|
const operatorLC = lc(operator);
|
|
3639
3947
|
if (!Op || valueIsField && (!col || !fn && [
|
|
3948
|
+
"contains",
|
|
3640
3949
|
"doesnotcontain",
|
|
3950
|
+
"beginswith",
|
|
3641
3951
|
"doesnotbeginwith",
|
|
3952
|
+
"endswith",
|
|
3642
3953
|
"doesnotendwith"
|
|
3643
3954
|
].includes(operatorLC))) return;
|
|
3644
3955
|
switch (operatorLC) {
|
|
@@ -3658,9 +3969,9 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
|
|
|
3658
3969
|
}[operatorLC];
|
|
3659
3970
|
return { [field]: valueIsField && operatorLC === "=" ? { [Op.col]: value } : { [sequelizeOperator]: valueIsField ? col(value) : shouldRenderAsNumber(value, parseNumbers) ? parseNumber(value, { parseNumbers: "strict" }) : value } };
|
|
3660
3971
|
}
|
|
3661
|
-
case "contains": return { [field]: { [Op.substring]: valueIsField ? col(value) : `${value}` } };
|
|
3662
|
-
case "beginswith": return { [field]: { [Op.startsWith]: valueIsField ? col(value) : `${value}` } };
|
|
3663
|
-
case "endswith": return { [field]: { [Op.endsWith]: valueIsField ? col(value) : `${value}` } };
|
|
3972
|
+
case "contains": return { [field]: { [valueIsField ? Op.like : Op.substring]: valueIsField ? fn("CONCAT", "%", col(value), "%") : `${value}` } };
|
|
3973
|
+
case "beginswith": return { [field]: { [valueIsField ? Op.like : Op.startsWith]: valueIsField ? fn("CONCAT", col(value), "%") : `${value}` } };
|
|
3974
|
+
case "endswith": return { [field]: { [valueIsField ? Op.like : Op.endsWith]: valueIsField ? fn("CONCAT", "%", col(value)) : `${value}` } };
|
|
3664
3975
|
case "doesnotcontain": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", "%", col(value), "%") : `%${value}%` } };
|
|
3665
3976
|
case "doesnotbeginwith": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", col(value), "%") : `${value}%` } };
|
|
3666
3977
|
case "doesnotendwith": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", "%", col(value)) : `%${value}` } };
|
|
@@ -3690,6 +4001,74 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
|
|
|
3690
4001
|
}
|
|
3691
4002
|
};
|
|
3692
4003
|
//#endregion
|
|
4004
|
+
//#region src/utils/formatQuery/defaultRuleProcessorSPARQL.ts
|
|
4005
|
+
const escapeDoubleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
|
|
4006
|
+
/** Auto-prefix a SPARQL variable name with `?` unless it's already prefixed, a URI, or a prefixed name.
|
|
4007
|
+
*
|
|
4008
|
+
* @group Export
|
|
4009
|
+
*/
|
|
4010
|
+
const sparqlVar = (name) => /^[?<]/.test(name) || name.includes(":") ? name : `?${name}`;
|
|
4011
|
+
/**
|
|
4012
|
+
* Default rule processor used by {@link formatQuery} for "sparql" format.
|
|
4013
|
+
*
|
|
4014
|
+
* @group Export
|
|
4015
|
+
*/
|
|
4016
|
+
const defaultRuleProcessorSPARQL = (rule, opts = {}) => {
|
|
4017
|
+
const { escapeQuotes, parseNumbers } = opts;
|
|
4018
|
+
const { field: rawField, operator, value, valueSource } = rule;
|
|
4019
|
+
const valueIsField = valueSource === "field";
|
|
4020
|
+
const operatorTL = operator.toLowerCase();
|
|
4021
|
+
const field = sparqlVar(rawField);
|
|
4022
|
+
const fmtVal = (v) => {
|
|
4023
|
+
if (v === null || v === void 0) return "\"\"";
|
|
4024
|
+
if (typeof v === "boolean") return `"${v}"^^xsd:boolean`;
|
|
4025
|
+
if (typeof v === "bigint") return String(v);
|
|
4026
|
+
if (valueIsField) return sparqlVar(trimIfString(v));
|
|
4027
|
+
if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
|
|
4028
|
+
const s = typeof v === "string" ? v : JSON.stringify(v) ?? "";
|
|
4029
|
+
if (s.startsWith("?") || s.startsWith("<") || s.includes(":")) return s;
|
|
4030
|
+
return `"${escapeDoubleQuotes(s, escapeQuotes)}"`;
|
|
4031
|
+
};
|
|
4032
|
+
switch (operatorTL) {
|
|
4033
|
+
case "=":
|
|
4034
|
+
case "!=":
|
|
4035
|
+
case "<":
|
|
4036
|
+
case ">":
|
|
4037
|
+
case "<=":
|
|
4038
|
+
case ">=": return `${field} ${operatorTL} ${fmtVal(value)}`;
|
|
4039
|
+
case "<>": return `${field} != ${fmtVal(value)}`;
|
|
4040
|
+
case "contains": return `CONTAINS(${field}, ${fmtVal(value)})`;
|
|
4041
|
+
case "doesnotcontain": return `!CONTAINS(${field}, ${fmtVal(value)})`;
|
|
4042
|
+
case "beginswith": return `STRSTARTS(${field}, ${fmtVal(value)})`;
|
|
4043
|
+
case "doesnotbeginwith": return `!STRSTARTS(${field}, ${fmtVal(value)})`;
|
|
4044
|
+
case "endswith": return `STRENDS(${field}, ${fmtVal(value)})`;
|
|
4045
|
+
case "doesnotendwith": return `!STRENDS(${field}, ${fmtVal(value)})`;
|
|
4046
|
+
case "null": return `!BOUND(${field})`;
|
|
4047
|
+
case "notnull": return `BOUND(${field})`;
|
|
4048
|
+
case "in": {
|
|
4049
|
+
const items = toArray(value).map(fmtVal);
|
|
4050
|
+
if (!items.length) return "";
|
|
4051
|
+
return `${field} IN (${items.join(", ")})`;
|
|
4052
|
+
}
|
|
4053
|
+
case "notin": {
|
|
4054
|
+
const items = toArray(value).map(fmtVal);
|
|
4055
|
+
if (!items.length) return "";
|
|
4056
|
+
return `${field} NOT IN (${items.join(", ")})`;
|
|
4057
|
+
}
|
|
4058
|
+
case "between": {
|
|
4059
|
+
const arr = toArray(value);
|
|
4060
|
+
if (arr.length < 2) return "";
|
|
4061
|
+
return `${field} >= ${fmtVal(arr[0])} && ${field} <= ${fmtVal(arr[1])}`;
|
|
4062
|
+
}
|
|
4063
|
+
case "notbetween": {
|
|
4064
|
+
const arr = toArray(value);
|
|
4065
|
+
if (arr.length < 2) return "";
|
|
4066
|
+
return `(${field} < ${fmtVal(arr[0])} || ${field} > ${fmtVal(arr[1])})`;
|
|
4067
|
+
}
|
|
4068
|
+
default: return `${field} ${operator} ${fmtVal(value)}`;
|
|
4069
|
+
}
|
|
4070
|
+
};
|
|
4071
|
+
//#endregion
|
|
3693
4072
|
//#region src/utils/formatQuery/formatQuery.ts
|
|
3694
4073
|
/**
|
|
3695
4074
|
* A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.
|
|
@@ -3737,6 +4116,10 @@ const defaultRuleProcessors = {
|
|
|
3737
4116
|
sequelize: defaultRuleProcessorSequelize,
|
|
3738
4117
|
spel: defaultRuleProcessorSpEL,
|
|
3739
4118
|
sql: defaultRuleProcessorSQL,
|
|
4119
|
+
cypher: defaultRuleProcessorCypher,
|
|
4120
|
+
gql: defaultRuleProcessorCypher,
|
|
4121
|
+
sparql: defaultRuleProcessorSPARQL,
|
|
4122
|
+
gremlin: defaultRuleProcessorGremlin,
|
|
3740
4123
|
diagnostics: defaultRuleProcessorSQL
|
|
3741
4124
|
};
|
|
3742
4125
|
/* v8 ignore next -- @preserve */
|
|
@@ -3759,6 +4142,10 @@ const defaultOperatorProcessors = {
|
|
|
3759
4142
|
sequelize: defaultOperatorProcessor,
|
|
3760
4143
|
spel: defaultOperatorProcessor,
|
|
3761
4144
|
sql: defaultOperatorProcessorSQL,
|
|
4145
|
+
cypher: defaultOperatorProcessor,
|
|
4146
|
+
gql: defaultOperatorProcessor,
|
|
4147
|
+
sparql: defaultOperatorProcessor,
|
|
4148
|
+
gremlin: defaultOperatorProcessor,
|
|
3762
4149
|
diagnostics: defaultOperatorProcessor
|
|
3763
4150
|
};
|
|
3764
4151
|
const defaultFallbackExpressions = {
|
|
@@ -3766,6 +4153,8 @@ const defaultFallbackExpressions = {
|
|
|
3766
4153
|
ldap: "",
|
|
3767
4154
|
mongodb: "\"$and\":[{\"$expr\":true}]",
|
|
3768
4155
|
natural_language: "1 is 1",
|
|
4156
|
+
sparql: "1 = 1",
|
|
4157
|
+
gremlin: "",
|
|
3769
4158
|
spel: "1 == 1",
|
|
3770
4159
|
sql: "(1 = 1)"
|
|
3771
4160
|
};
|
|
@@ -3906,6 +4295,10 @@ function formatQuery(ruleGroup, optionParam = {}) {
|
|
|
3906
4295
|
case "prisma": return defaultRuleGroupProcessorPrisma(ruleGroup, finalOptions);
|
|
3907
4296
|
case "drizzle": return defaultRuleGroupProcessorDrizzle(ruleGroup, finalOptions);
|
|
3908
4297
|
case "sequelize": return defaultRuleGroupProcessorSequelize(ruleGroup, finalOptions);
|
|
4298
|
+
case "cypher":
|
|
4299
|
+
case "gql": return defaultRuleGroupProcessorCypher(ruleGroup, finalOptions);
|
|
4300
|
+
case "sparql": return defaultRuleGroupProcessorSPARQL(ruleGroup, finalOptions);
|
|
4301
|
+
case "gremlin": return defaultRuleGroupProcessorGremlin(ruleGroup, finalOptions);
|
|
3909
4302
|
case "diagnostics": return defaultRuleGroupProcessorDiagnostics(ruleGroup, finalOptions);
|
|
3910
4303
|
default: return "";
|
|
3911
4304
|
}
|
|
@@ -4618,6 +5011,6 @@ const groupInPlace = (query, sourcePathOrID, targetPathOrID, options = {}) => {
|
|
|
4618
5011
|
return query;
|
|
4619
5012
|
};
|
|
4620
5013
|
//#endregion
|
|
4621
|
-
export { LogType, TestID, add, addInPlace, bigIntJsonParseReviver, bigIntJsonStringifyReplacer, celCombinatorMap, clsx, convertFromIC, convertQuery, convertToIC, defaultCELValueProcessor, defaultCombinatorLabelMap, defaultCombinators, defaultCombinatorsExtended, defaultControlClassnames, defaultExportOperatorMap, defaultJoinChar, defaultMatchModes, defaultMongoDBValueProcessor, defaultNLTranslations, defaultOperatorLabelMap, defaultOperatorNegationMap, defaultOperatorProcessorNL, defaultOperatorProcessorSQL, defaultOperators, defaultPlaceholderFieldGroupLabel, defaultPlaceholderFieldLabel, defaultPlaceholderFieldName, defaultPlaceholderLabel, defaultPlaceholderName, defaultPlaceholderOperatorGroupLabel, defaultPlaceholderOperatorLabel, defaultPlaceholderOperatorName, defaultPlaceholderValueGroupLabel, defaultPlaceholderValueLabel, defaultPlaceholderValueName, defaultRuleGroupProcessorCEL, defaultRuleGroupProcessorDiagnostics, defaultRuleGroupProcessorDrizzle, defaultRuleGroupProcessorElasticSearch, defaultRuleGroupProcessorJSONata, defaultRuleGroupProcessorJsonLogic, defaultRuleGroupProcessorLDAP, defaultRuleGroupProcessorMongoDB, defaultRuleGroupProcessorMongoDBQuery, defaultRuleGroupProcessorNL, defaultRuleGroupProcessorParameterized, defaultRuleGroupProcessorPrisma, defaultRuleGroupProcessorSQL, defaultRuleGroupProcessorSequelize, defaultRuleGroupProcessorSpEL, defaultRuleProcessorCEL, defaultRuleProcessorDrizzle, defaultRuleProcessorElasticSearch, defaultRuleProcessorJSONata, defaultRuleProcessorJsonLogic, defaultRuleProcessorLDAP, defaultRuleProcessorMongoDB, defaultRuleProcessorMongoDBQuery, defaultRuleProcessorNL, defaultRuleProcessorParameterized, defaultRuleProcessorPrisma, defaultRuleProcessorSQL, defaultRuleProcessorSequelize, defaultRuleProcessorSpEL, defaultSpELValueProcessor, defaultTranslations, defaultValidator, defaultValueProcessor, defaultValueProcessorByRule, defaultValueProcessorCELByRule, defaultValueProcessorMongoDBByRule, defaultValueProcessorNL, defaultValueProcessorSpELByRule, filterFieldsByComparator, findID, findPath, formatQuery, formatQueryOptionPresets, generateAccessibleDescription, generateID, getCommonAncestorPath, getFirstOption, getMatchModesUtil, getNLTranslataion, getOption, getParentPath, getParseNumberMethod, getPathOfID, getQuoteFieldNamesWithArray, getQuotedFieldName, getValidationClassNames, getValueSourcesUtil, group, groupInPlace, groupInvalidReasons, insert, insertInPlace, isAncestor, isFlexibleOptionArray, isFlexibleOptionGroupArray, isFullOptionArray, isFullOptionGroupArray, isOptionGroupArray, isPojo, isRuleGroup, isRuleGroupType, isRuleGroupTypeIC, isRuleOrGroupValid, isRuleType, isUnsafeKey, isValidValue, isValidationResult, isValueProcessorLegacy, joinWith, jsonLogicAdditionalOperators, lc, mapSQLOperator, mergeAnyTranslation, mergeAnyTranslations, mergeClassnames, mongoDbFallback, mongoOperators, move, moveInPlace, normalizeConstituentWordOrder, nullFreeArray, nullOrUndefinedOrEmpty, numericRegex, numerifyValues, objectEntries, objectKeys, parseNumber, pathIsDisabled, pathsAreEqual, preferAnyProp, preferFlagProps, preferProp, prepareOptionList, prepareRule, prepareRuleGroup, prepareRuleOrGroup, prismaFallback, prismaOperators, processMatchMode, queryBuilderFlagDefaults, regenerateID, regenerateIDs, remove, removeInPlace, rootPath, shouldRenderAsNumber, splitBy, sqlDialectPresets, standardClassnames, toArray, toFlatOptionArray, toFullOption, toFullOptionList, toFullOptionMap, transformQuery, trimIfString, uniqByIdentifier, uniqByName, uniqOptGroups, uniqOptList, update, updateInPlace, uuidV4regex };
|
|
5014
|
+
export { LogType, TestID, add, addInPlace, bigIntJsonParseReviver, bigIntJsonStringifyReplacer, celCombinatorMap, clsx, convertFromIC, convertQuery, convertToIC, cypherCombinatorMap, defaultCELValueProcessor, defaultCombinatorLabelMap, defaultCombinators, defaultCombinatorsExtended, defaultControlClassnames, defaultExportOperatorMap, defaultJoinChar, defaultMatchModes, defaultMongoDBValueProcessor, defaultNLTranslations, defaultOperatorLabelMap, defaultOperatorNegationMap, defaultOperatorProcessorNL, defaultOperatorProcessorSQL, defaultOperators, defaultPlaceholderFieldGroupLabel, defaultPlaceholderFieldLabel, defaultPlaceholderFieldName, defaultPlaceholderLabel, defaultPlaceholderName, defaultPlaceholderOperatorGroupLabel, defaultPlaceholderOperatorLabel, defaultPlaceholderOperatorName, defaultPlaceholderValueGroupLabel, defaultPlaceholderValueLabel, defaultPlaceholderValueName, defaultRuleGroupProcessorCEL, defaultRuleGroupProcessorCypher, defaultRuleGroupProcessorDiagnostics, defaultRuleGroupProcessorDrizzle, defaultRuleGroupProcessorElasticSearch, defaultRuleGroupProcessorGremlin, defaultRuleGroupProcessorJSONata, defaultRuleGroupProcessorJsonLogic, defaultRuleGroupProcessorLDAP, defaultRuleGroupProcessorMongoDB, defaultRuleGroupProcessorMongoDBQuery, defaultRuleGroupProcessorNL, defaultRuleGroupProcessorParameterized, defaultRuleGroupProcessorPrisma, defaultRuleGroupProcessorSPARQL, defaultRuleGroupProcessorSQL, defaultRuleGroupProcessorSequelize, defaultRuleGroupProcessorSpEL, defaultRuleProcessorCEL, defaultRuleProcessorCypher, defaultRuleProcessorDrizzle, defaultRuleProcessorElasticSearch, defaultRuleProcessorGremlin, defaultRuleProcessorJSONata, defaultRuleProcessorJsonLogic, defaultRuleProcessorLDAP, defaultRuleProcessorMongoDB, defaultRuleProcessorMongoDBQuery, defaultRuleProcessorNL, defaultRuleProcessorParameterized, defaultRuleProcessorPrisma, defaultRuleProcessorSPARQL, defaultRuleProcessorSQL, defaultRuleProcessorSequelize, defaultRuleProcessorSpEL, defaultSpELValueProcessor, defaultTranslations, defaultValidator, defaultValueProcessor, defaultValueProcessorByRule, defaultValueProcessorCELByRule, defaultValueProcessorMongoDBByRule, defaultValueProcessorNL, defaultValueProcessorSpELByRule, filterFieldsByComparator, findID, findPath, formatQuery, formatQueryOptionPresets, generateAccessibleDescription, generateID, getCommonAncestorPath, getFirstOption, getMatchModesUtil, getNLTranslataion, getOption, getParentPath, getParseNumberMethod, getPathOfID, getQuoteFieldNamesWithArray, getQuotedFieldName, getValidationClassNames, getValueSourcesUtil, group, groupInPlace, groupInvalidReasons, insert, insertInPlace, isAncestor, isFlexibleOptionArray, isFlexibleOptionGroupArray, isFullOptionArray, isFullOptionGroupArray, isOptionGroupArray, isPojo, isRuleGroup, isRuleGroupType, isRuleGroupTypeIC, isRuleOrGroupValid, isRuleType, isUnsafeKey, isValidValue, isValidationResult, isValueProcessorLegacy, joinWith, jsonLogicAdditionalOperators, lc, mapSQLOperator, mergeAnyTranslation, mergeAnyTranslations, mergeClassnames, mongoDbFallback, mongoOperators, move, moveInPlace, normalizeConstituentWordOrder, nullFreeArray, nullOrUndefinedOrEmpty, numericRegex, numerifyValues, objectEntries, objectKeys, parseNumber, pathIsDisabled, pathsAreEqual, preferAnyProp, preferFlagProps, preferProp, prepareOptionList, prepareRule, prepareRuleGroup, prepareRuleOrGroup, prismaFallback, prismaOperators, processMatchMode, queryBuilderFlagDefaults, regenerateID, regenerateIDs, remove, removeInPlace, rootPath, shouldRenderAsNumber, sparqlVar, splitBy, sqlDialectPresets, standardClassnames, toArray, toFlatOptionArray, toFullOption, toFullOptionList, toFullOptionMap, transformQuery, trimIfString, uniqByIdentifier, uniqByName, uniqOptGroups, uniqOptList, update, updateInPlace, uuidV4regex };
|
|
4622
5015
|
|
|
4623
5016
|
//# sourceMappingURL=react-querybuilder_core.mjs.map
|