@react-querybuilder/core 8.17.0 → 8.19.0
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/dist/cjs/react-querybuilder_core.cjs.development.d.ts +57 -16
- package/dist/cjs/react-querybuilder_core.cjs.development.js +212 -206
- package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +57 -16
- 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-BoMPXL7_.js → convertQuery-BJKNgecE.js} +2 -2
- package/dist/{convertQuery-BoMPXL7_.js.map → convertQuery-BJKNgecE.js.map} +1 -1
- package/dist/{convertQuery-CQwOrjQr.mjs → convertQuery-J1CaoDxe.mjs} +2 -2
- package/dist/{convertQuery-CQwOrjQr.mjs.map → convertQuery-J1CaoDxe.mjs.map} +1 -1
- package/dist/formatQuery.d.mts +5 -3
- package/dist/formatQuery.d.ts +5 -3
- package/dist/formatQuery.js +203 -203
- package/dist/formatQuery.js.map +1 -1
- package/dist/formatQuery.mjs +203 -203
- package/dist/formatQuery.mjs.map +1 -1
- package/dist/{import-CSHMjlid.d.ts → import-Qs1-kgv5.d.ts} +2 -2
- package/dist/{import-BQ5xaW6i.d.mts → import-ShTj5IdB.d.mts} +2 -2
- package/dist/{index-CREDWM32.d.ts → index-DlVg-QXo.d.mts} +32 -3
- package/dist/{index-CREDWM32.d.mts → index-DlVg-QXo.d.ts} +32 -3
- package/dist/{objectUtils-DxVaGCdg.js → objectUtils-DBJI82bl.js} +2 -2
- package/dist/objectUtils-DBJI82bl.js.map +1 -0
- package/dist/{objectUtils-D-w8MzpZ.mjs → objectUtils-ZvPkF6u6.mjs} +2 -2
- package/dist/objectUtils-ZvPkF6u6.mjs.map +1 -0
- package/dist/parseCEL.d.mts +7 -7
- package/dist/parseCEL.d.ts +7 -7
- package/dist/parseCEL.js +6 -6
- package/dist/parseCEL.js.map +1 -1
- package/dist/parseCEL.mjs +6 -6
- package/dist/parseCEL.mjs.map +1 -1
- package/dist/parseCypher.d.mts +1 -1
- package/dist/parseCypher.d.ts +1 -1
- package/dist/parseCypher.js.map +1 -1
- package/dist/parseCypher.mjs.map +1 -1
- package/dist/parseGremlin.d.mts +1 -1
- package/dist/parseGremlin.d.ts +1 -1
- package/dist/parseGremlin.js.map +1 -1
- package/dist/parseGremlin.mjs.map +1 -1
- package/dist/parseJSONata.d.mts +2 -2
- package/dist/parseJSONata.d.ts +2 -2
- package/dist/parseJSONata.js +2 -2
- package/dist/parseJSONata.js.map +1 -1
- package/dist/parseJSONata.mjs +2 -2
- 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 +11 -11
- package/dist/parseJsonLogic.js.map +1 -1
- package/dist/parseJsonLogic.mjs +11 -11
- 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 +4 -4
- package/dist/parseMongoDB.js.map +1 -1
- package/dist/parseMongoDB.mjs +4 -4
- package/dist/parseMongoDB.mjs.map +1 -1
- package/dist/parseSPARQL.d.mts +1 -1
- package/dist/parseSPARQL.d.ts +1 -1
- package/dist/parseSPARQL.js.map +1 -1
- package/dist/parseSPARQL.mjs.map +1 -1
- package/dist/parseSQL.d.mts +2 -2
- package/dist/parseSQL.d.ts +2 -2
- package/dist/parseSQL.js +3 -3
- package/dist/parseSQL.js.map +1 -1
- package/dist/parseSQL.mjs +3 -3
- 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 +3 -3
- package/dist/parseSpEL.js.map +1 -1
- package/dist/parseSpEL.mjs +3 -3
- package/dist/parseSpEL.mjs.map +1 -1
- package/dist/{prepareQueryObjects-BXf5aV-A.mjs → prepareQueryObjects-Cd_tt4oy.mjs} +3 -3
- package/dist/{prepareQueryObjects-BXf5aV-A.mjs.map → prepareQueryObjects-Cd_tt4oy.mjs.map} +1 -1
- package/dist/{prepareQueryObjects-gRQqiBPR.js → prepareQueryObjects-DaAXX792.js} +3 -3
- package/dist/{prepareQueryObjects-gRQqiBPR.js.map → prepareQueryObjects-DaAXX792.js.map} +1 -1
- package/dist/react-querybuilder_core.d.mts +57 -16
- package/dist/react-querybuilder_core.legacy-esm.d.ts +57 -16
- package/dist/react-querybuilder_core.legacy-esm.js +210 -204
- package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
- package/dist/react-querybuilder_core.mjs +212 -206
- package/dist/react-querybuilder_core.mjs.map +1 -1
- package/dist/react-querybuilder_core.production.d.mts +57 -16
- 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 +1 -1
- package/dist/transformQuery.mjs +1 -1
- package/dist/{utils-ZlKseh1X.js → utils-BpaOtylk.js} +3 -3
- package/dist/utils-BpaOtylk.js.map +1 -0
- package/dist/{utils-01WaTGBL.mjs → utils-CJRGiPb-.mjs} +3 -3
- package/dist/utils-CJRGiPb-.mjs.map +1 -0
- package/package.json +12 -12
- package/dist/objectUtils-D-w8MzpZ.mjs.map +0 -1
- package/dist/objectUtils-DxVaGCdg.js.map +0 -1
- package/dist/utils-01WaTGBL.mjs.map +0 -1
- package/dist/utils-ZlKseh1X.js.map +0 -1
package/dist/formatQuery.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { D as toArray, O as trimIfString, S as toFlatOptionArray, T as parseNumber, _ as shouldRenderAsNumber, a as getNLTranslataion, c as isValidValue, d as mapSQLOperator, f as mongoOperators, g as processMatchMode, h as prismaOperators, i as defaultNLTranslations, l as isValueProcessorLegacy, m as numerifyValues, n as bigIntJsonStringifyReplacer, o as getQuoteFieldNamesWithArray, p as normalizeConstituentWordOrder, r as celCombinatorMap, s as getQuotedFieldName, t as bigIntJsonParseReviver, u as jsonLogicAdditionalOperators, v as getParseNumberMethod, w as toFullOptionList, y as getOption } from "./utils-
|
|
2
|
-
import { a as isRuleGroupTypeIC, c as nullOrUndefinedOrEmpty, i as isRuleGroupType, l as numericRegex, o as isPojo, r as isRuleGroup, s as lc } from "./objectUtils-
|
|
1
|
+
import { D as toArray, O as trimIfString, S as toFlatOptionArray, T as parseNumber, _ as shouldRenderAsNumber, a as getNLTranslataion, c as isValidValue, d as mapSQLOperator, f as mongoOperators, g as processMatchMode, h as prismaOperators, i as defaultNLTranslations, l as isValueProcessorLegacy, m as numerifyValues, n as bigIntJsonStringifyReplacer, o as getQuoteFieldNamesWithArray, p as normalizeConstituentWordOrder, r as celCombinatorMap, s as getQuotedFieldName, t as bigIntJsonParseReviver, u as jsonLogicAdditionalOperators, v as getParseNumberMethod, w as toFullOptionList, y as getOption } from "./utils-CJRGiPb-.mjs";
|
|
2
|
+
import { a as isRuleGroupTypeIC, c as nullOrUndefinedOrEmpty, i as isRuleGroupType, l as numericRegex, o as isPojo, r as isRuleGroup, s as lc } from "./objectUtils-ZvPkF6u6.mjs";
|
|
3
3
|
import { transformQuery } from "./transformQuery.mjs";
|
|
4
|
-
import { t as convertFromIC } from "./convertQuery-
|
|
4
|
+
import { t as convertFromIC } from "./convertQuery-J1CaoDxe.mjs";
|
|
5
5
|
//#region src/utils/isRuleOrGroupValid.ts
|
|
6
6
|
/**
|
|
7
7
|
* Determines if an object is useful as a validation result.
|
|
@@ -113,7 +113,7 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
|
|
|
113
113
|
const totalCount = `double(${field}.size())`;
|
|
114
114
|
const filteredCount = `${field}.filter(${arrayElementAlias}, ${nestedArrayFilter}).size()`;
|
|
115
115
|
const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "==";
|
|
116
|
-
if (threshold > 0 && threshold < 1) return
|
|
116
|
+
if (threshold > 0 && threshold < 1) return `double(${filteredCount}) ${op} (${totalCount} * ${threshold})`;
|
|
117
117
|
return `${filteredCount} ${op} ${threshold}`;
|
|
118
118
|
}
|
|
119
119
|
}
|
|
@@ -600,106 +600,6 @@ const defaultRuleGroupProcessorCypher = (ruleGroup, options) => {
|
|
|
600
600
|
return processRuleGroup(ruleGroup, true);
|
|
601
601
|
};
|
|
602
602
|
//#endregion
|
|
603
|
-
//#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
|
|
604
|
-
/**
|
|
605
|
-
* Default rule processor used by {@link formatQuery} for the "drizzle" format.
|
|
606
|
-
*
|
|
607
|
-
* @group Export
|
|
608
|
-
*/
|
|
609
|
-
const defaultRuleProcessorDrizzle = (rule, _options) => {
|
|
610
|
-
const opts = _options ?? ( /* v8 ignore start -- @preserve */ {});
|
|
611
|
-
// v8 ignore next
|
|
612
|
-
const { parseNumbers, preserveValueOrder, context = {} } = opts;
|
|
613
|
-
const { columns, drizzleOperators, useRawFields } = context;
|
|
614
|
-
if (!columns || !drizzleOperators) return void 0;
|
|
615
|
-
const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
|
|
616
|
-
const { field, operator, value, valueSource } = rule;
|
|
617
|
-
const column = useRawFields && /[a-z][a-z0-9]*/i.test(field) ? sql.raw(field) : columns[field];
|
|
618
|
-
const operatorLC = lc(operator);
|
|
619
|
-
const valueIsField = valueSource === "field";
|
|
620
|
-
const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
|
|
621
|
-
const maybeParseNumber = (v) => {
|
|
622
|
-
if (valueIsField || !parseNumbers) return asFieldOrValue(v);
|
|
623
|
-
return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
|
|
624
|
-
};
|
|
625
|
-
if (!column) return void 0;
|
|
626
|
-
const matchEval = processMatchMode(rule);
|
|
627
|
-
if (matchEval === false) return;
|
|
628
|
-
else if (matchEval) {
|
|
629
|
-
if (opts.preset !== "postgresql") return void 0;
|
|
630
|
-
const { mode, threshold } = matchEval;
|
|
631
|
-
const arrayElementAlias = "elem_alias";
|
|
632
|
-
const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => ({
|
|
633
|
-
...r,
|
|
634
|
-
field: arrayElementAlias
|
|
635
|
-
}) }), {
|
|
636
|
-
...opts,
|
|
637
|
-
context: {
|
|
638
|
-
...opts.context,
|
|
639
|
-
useRawFields: true
|
|
640
|
-
}
|
|
641
|
-
});
|
|
642
|
-
switch (mode) {
|
|
643
|
-
case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
|
|
644
|
-
case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
|
|
645
|
-
case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
|
|
646
|
-
case "atleast":
|
|
647
|
-
case "atmost":
|
|
648
|
-
case "exactly": {
|
|
649
|
-
const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
|
|
650
|
-
return threshold > 0 && threshold < 1 ? sql`(select count(*) / array_length(${column}, 1) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}` : sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}`;
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
switch (operatorLC) {
|
|
655
|
-
case "=": return eq(column, maybeParseNumber(value));
|
|
656
|
-
case "!=": return ne(column, maybeParseNumber(value));
|
|
657
|
-
case ">": return gt(column, maybeParseNumber(value));
|
|
658
|
-
case "<": return lt(column, maybeParseNumber(value));
|
|
659
|
-
case ">=": return gte(column, maybeParseNumber(value));
|
|
660
|
-
case "<=": return lte(column, maybeParseNumber(value));
|
|
661
|
-
case "beginswith":
|
|
662
|
-
case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
|
|
663
|
-
case "contains":
|
|
664
|
-
case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
|
|
665
|
-
case "endswith":
|
|
666
|
-
case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
|
|
667
|
-
case "null": return isNull(column);
|
|
668
|
-
case "notnull": return isNotNull(column);
|
|
669
|
-
case "in":
|
|
670
|
-
case "notin": {
|
|
671
|
-
const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
|
|
672
|
-
return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
|
|
673
|
-
}
|
|
674
|
-
case "between":
|
|
675
|
-
case "notbetween": {
|
|
676
|
-
const valueAsArray = toArray(value);
|
|
677
|
-
if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
|
|
678
|
-
let [first, second] = valueAsArray;
|
|
679
|
-
const shouldParseNumbers = !(parseNumbers === false);
|
|
680
|
-
if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
|
|
681
|
-
const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
|
|
682
|
-
const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
|
|
683
|
-
if (!preserveValueOrder && secondNum < firstNum) {
|
|
684
|
-
const tempNum = secondNum;
|
|
685
|
-
second = firstNum;
|
|
686
|
-
first = tempNum;
|
|
687
|
-
} else {
|
|
688
|
-
first = firstNum;
|
|
689
|
-
second = secondNum;
|
|
690
|
-
}
|
|
691
|
-
} else if (valueIsField) {
|
|
692
|
-
first = asFieldOrValue(first);
|
|
693
|
-
second = asFieldOrValue(second);
|
|
694
|
-
}
|
|
695
|
-
return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
|
|
696
|
-
}
|
|
697
|
-
return;
|
|
698
|
-
}
|
|
699
|
-
default: return;
|
|
700
|
-
}
|
|
701
|
-
};
|
|
702
|
-
//#endregion
|
|
703
603
|
//#region src/utils/formatQuery/defaultRuleGroupProcessorDrizzle.ts
|
|
704
604
|
/**
|
|
705
605
|
* Default rule group processor used by {@link formatQuery} for the "drizzle" format. The returned
|
|
@@ -714,10 +614,9 @@ const defaultRuleProcessorDrizzle = (rule, _options) => {
|
|
|
714
614
|
* @group Export
|
|
715
615
|
*/
|
|
716
616
|
const defaultRuleGroupProcessorDrizzle = (ruleGroup, options, _meta) => (columns, drizzleOperators) => {
|
|
717
|
-
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap } = options;
|
|
617
|
+
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, ruleProcessor } = options;
|
|
718
618
|
if (!columns || !drizzleOperators) return void 0;
|
|
719
619
|
const { and, not, or } = drizzleOperators;
|
|
720
|
-
const ruleProcessor = defaultRuleProcessorDrizzle;
|
|
721
620
|
const processRuleGroup = (rg, _outermost) => {
|
|
722
621
|
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
|
|
723
622
|
const processedRules = rg.rules.map((rule) => {
|
|
@@ -995,7 +894,7 @@ const defaultRuleGroupProcessorMongoDB = (ruleGroup, options, meta) => {
|
|
|
995
894
|
const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
|
|
996
895
|
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, translations, validateRule, validationMap } = options;
|
|
997
896
|
const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
|
|
998
|
-
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression :
|
|
897
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
|
|
999
898
|
const rg2 = isRuleGroupTypeIC(rg) && rg.rules.some((r) => typeof r === "string" && lc(r) === "xor") ? convertFromIC(rg) : rg;
|
|
1000
899
|
const processedRules = [];
|
|
1001
900
|
let precedingCombinator = "";
|
|
@@ -1093,7 +992,7 @@ const defaultRuleGroupProcessorParameterized = (ruleGroup, options) => {
|
|
|
1093
992
|
return sql;
|
|
1094
993
|
};
|
|
1095
994
|
const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
|
|
1096
|
-
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression :
|
|
995
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
|
|
1097
996
|
const processedRules = [];
|
|
1098
997
|
let precedingCombinator = "";
|
|
1099
998
|
let firstRule = true;
|
|
@@ -1286,7 +1185,7 @@ const defaultRuleGroupProcessorSPARQL = (ruleGroup, options) => {
|
|
|
1286
1185
|
const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
|
|
1287
1186
|
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
|
|
1288
1187
|
const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
|
|
1289
|
-
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression :
|
|
1188
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
|
|
1290
1189
|
const processedRules = [];
|
|
1291
1190
|
let precedingCombinator = "";
|
|
1292
1191
|
let firstRule = true;
|
|
@@ -1333,96 +1232,6 @@ const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
|
|
|
1333
1232
|
return processRuleGroup(ruleGroup, true);
|
|
1334
1233
|
};
|
|
1335
1234
|
//#endregion
|
|
1336
|
-
//#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
|
|
1337
|
-
/**
|
|
1338
|
-
* Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
|
|
1339
|
-
*
|
|
1340
|
-
* @group Export
|
|
1341
|
-
*/
|
|
1342
|
-
const defaultRuleProcessorTanStackDB = (rule, _options) => {
|
|
1343
|
-
const { parseNumbers, preserveValueOrder, context = {} } = _options ?? ( /* v8 ignore start -- @preserve */ {});
|
|
1344
|
-
const ops = context.tanStackDbOperators;
|
|
1345
|
-
const refs = context._tanstackDbRefs;
|
|
1346
|
-
const primaryRef = context._tanstackDbPrimaryRef;
|
|
1347
|
-
if (!ops || !refs || !primaryRef) return void 0;
|
|
1348
|
-
const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
|
|
1349
|
-
const resolveField = (fieldName) => {
|
|
1350
|
-
const dotIdx = fieldName.indexOf(".");
|
|
1351
|
-
if (dotIdx > 0) {
|
|
1352
|
-
const prefix = fieldName.slice(0, dotIdx);
|
|
1353
|
-
const rest = fieldName.slice(dotIdx + 1);
|
|
1354
|
-
if (refs[prefix]) return refs[prefix][rest];
|
|
1355
|
-
}
|
|
1356
|
-
return refs[primaryRef][fieldName];
|
|
1357
|
-
};
|
|
1358
|
-
const { field, operator, value, valueSource } = rule;
|
|
1359
|
-
const column = resolveField(field);
|
|
1360
|
-
const operatorLC = lc(operator);
|
|
1361
|
-
const valueIsField = valueSource === "field";
|
|
1362
|
-
const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
|
|
1363
|
-
const maybeParseNumber = (v) => {
|
|
1364
|
-
if (valueIsField || !parseNumbers) return asFieldOrValue(v);
|
|
1365
|
-
return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
|
|
1366
|
-
};
|
|
1367
|
-
switch (operatorLC) {
|
|
1368
|
-
case "=": return eq(column, maybeParseNumber(value));
|
|
1369
|
-
case "!=": return not(eq(column, maybeParseNumber(value)));
|
|
1370
|
-
case ">": return gt(column, maybeParseNumber(value));
|
|
1371
|
-
case "<": return lt(column, maybeParseNumber(value));
|
|
1372
|
-
case ">=": return gte(column, maybeParseNumber(value));
|
|
1373
|
-
case "<=": return lte(column, maybeParseNumber(value));
|
|
1374
|
-
case "beginswith":
|
|
1375
|
-
case "doesnotbeginwith": {
|
|
1376
|
-
const expr = like(column, valueIsField ? void 0 : `${value}%`);
|
|
1377
|
-
return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
|
|
1378
|
-
}
|
|
1379
|
-
case "contains":
|
|
1380
|
-
case "doesnotcontain": {
|
|
1381
|
-
const expr = like(column, valueIsField ? void 0 : `%${value}%`);
|
|
1382
|
-
return operatorLC === "doesnotcontain" ? not(expr) : expr;
|
|
1383
|
-
}
|
|
1384
|
-
case "endswith":
|
|
1385
|
-
case "doesnotendwith": {
|
|
1386
|
-
const expr = like(column, valueIsField ? void 0 : `%${value}`);
|
|
1387
|
-
return operatorLC === "doesnotendwith" ? not(expr) : expr;
|
|
1388
|
-
}
|
|
1389
|
-
case "null": return isNull(column);
|
|
1390
|
-
case "notnull": return not(isNull(column));
|
|
1391
|
-
case "in":
|
|
1392
|
-
case "notin": {
|
|
1393
|
-
const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
|
|
1394
|
-
return operatorLC === "notin" ? not(expr) : expr;
|
|
1395
|
-
}
|
|
1396
|
-
case "between":
|
|
1397
|
-
case "notbetween": {
|
|
1398
|
-
const valueAsArray = toArray(value);
|
|
1399
|
-
if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
|
|
1400
|
-
let [first, second] = valueAsArray;
|
|
1401
|
-
const shouldParseNumbers = !(parseNumbers === false);
|
|
1402
|
-
if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
|
|
1403
|
-
const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
|
|
1404
|
-
const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
|
|
1405
|
-
if (!preserveValueOrder && secondNum < firstNum) {
|
|
1406
|
-
const tempNum = secondNum;
|
|
1407
|
-
second = firstNum;
|
|
1408
|
-
first = tempNum;
|
|
1409
|
-
} else {
|
|
1410
|
-
first = firstNum;
|
|
1411
|
-
second = secondNum;
|
|
1412
|
-
}
|
|
1413
|
-
} else if (valueIsField) {
|
|
1414
|
-
first = asFieldOrValue(first);
|
|
1415
|
-
second = asFieldOrValue(second);
|
|
1416
|
-
}
|
|
1417
|
-
const expr = and(gte(column, first), lte(column, second));
|
|
1418
|
-
return operatorLC === "notbetween" ? not(expr) : expr;
|
|
1419
|
-
}
|
|
1420
|
-
return;
|
|
1421
|
-
}
|
|
1422
|
-
default: return;
|
|
1423
|
-
}
|
|
1424
|
-
};
|
|
1425
|
-
//#endregion
|
|
1426
1235
|
//#region src/utils/formatQuery/defaultRuleGroupProcessorTanStackDB.ts
|
|
1427
1236
|
/**
|
|
1428
1237
|
* Default rule group processor used by {@link formatQuery} for the "tanstack_db" format.
|
|
@@ -1435,7 +1244,7 @@ const defaultRuleProcessorTanStackDB = (rule, _options) => {
|
|
|
1435
1244
|
* @group Export
|
|
1436
1245
|
*/
|
|
1437
1246
|
const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
|
|
1438
|
-
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {} } = options;
|
|
1247
|
+
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {}, ruleProcessor } = options;
|
|
1439
1248
|
const ops = context.tanStackDbOperators;
|
|
1440
1249
|
if (!ops) return void 0;
|
|
1441
1250
|
const { and, eq, not, or } = ops;
|
|
@@ -1443,7 +1252,6 @@ const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
|
|
|
1443
1252
|
const refKeys = Object.keys(refs);
|
|
1444
1253
|
/* v8 ignore next -- @preserve */
|
|
1445
1254
|
if (refKeys.length === 0) return fallback;
|
|
1446
|
-
const ruleProcessor = defaultRuleProcessorTanStackDB;
|
|
1447
1255
|
const processRuleGroup = (rg) => {
|
|
1448
1256
|
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
|
|
1449
1257
|
const processedRules = rg.rules.map((rule) => {
|
|
@@ -1841,6 +1649,106 @@ const defaultRuleProcessorCypher = (rule, opts = {}) => {
|
|
|
1841
1649
|
}
|
|
1842
1650
|
};
|
|
1843
1651
|
//#endregion
|
|
1652
|
+
//#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
|
|
1653
|
+
/**
|
|
1654
|
+
* Default rule processor used by {@link formatQuery} for the "drizzle" format.
|
|
1655
|
+
*
|
|
1656
|
+
* @group Export
|
|
1657
|
+
*/
|
|
1658
|
+
const defaultRuleProcessorDrizzle = (rule, _options) => {
|
|
1659
|
+
const opts = _options ?? ( /* v8 ignore start -- @preserve */ {});
|
|
1660
|
+
// v8 ignore next
|
|
1661
|
+
const { parseNumbers, preserveValueOrder, context = {} } = opts;
|
|
1662
|
+
const { columns, drizzleOperators, useRawFields } = context;
|
|
1663
|
+
if (!columns || !drizzleOperators) return void 0;
|
|
1664
|
+
const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
|
|
1665
|
+
const { field, operator, value, valueSource } = rule;
|
|
1666
|
+
const column = useRawFields && /^[a-z_][a-z0-9_.]*$/i.test(field) ? sql.raw(field) : columns[field];
|
|
1667
|
+
const operatorLC = lc(operator);
|
|
1668
|
+
const valueIsField = valueSource === "field";
|
|
1669
|
+
const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
|
|
1670
|
+
const maybeParseNumber = (v) => {
|
|
1671
|
+
if (valueIsField || !parseNumbers) return asFieldOrValue(v);
|
|
1672
|
+
return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
|
|
1673
|
+
};
|
|
1674
|
+
if (!column) return void 0;
|
|
1675
|
+
const matchEval = processMatchMode(rule);
|
|
1676
|
+
if (matchEval === false) return;
|
|
1677
|
+
else if (matchEval) {
|
|
1678
|
+
if (opts.preset !== "postgresql") return void 0;
|
|
1679
|
+
const { mode, threshold } = matchEval;
|
|
1680
|
+
const arrayElementAlias = "elem_alias";
|
|
1681
|
+
const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => ({
|
|
1682
|
+
...r,
|
|
1683
|
+
field: arrayElementAlias
|
|
1684
|
+
}) }), {
|
|
1685
|
+
...opts,
|
|
1686
|
+
context: {
|
|
1687
|
+
...opts.context,
|
|
1688
|
+
useRawFields: true
|
|
1689
|
+
}
|
|
1690
|
+
});
|
|
1691
|
+
switch (mode) {
|
|
1692
|
+
case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
|
|
1693
|
+
case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
|
|
1694
|
+
case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
|
|
1695
|
+
case "atleast":
|
|
1696
|
+
case "atmost":
|
|
1697
|
+
case "exactly": {
|
|
1698
|
+
const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
|
|
1699
|
+
return threshold > 0 && threshold < 1 ? sql`(select count(*)::float / array_length(${column}, 1) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}` : sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}`;
|
|
1700
|
+
}
|
|
1701
|
+
}
|
|
1702
|
+
}
|
|
1703
|
+
switch (operatorLC) {
|
|
1704
|
+
case "=": return eq(column, maybeParseNumber(value));
|
|
1705
|
+
case "!=": return ne(column, maybeParseNumber(value));
|
|
1706
|
+
case ">": return gt(column, maybeParseNumber(value));
|
|
1707
|
+
case "<": return lt(column, maybeParseNumber(value));
|
|
1708
|
+
case ">=": return gte(column, maybeParseNumber(value));
|
|
1709
|
+
case "<=": return lte(column, maybeParseNumber(value));
|
|
1710
|
+
case "beginswith":
|
|
1711
|
+
case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
|
|
1712
|
+
case "contains":
|
|
1713
|
+
case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
|
|
1714
|
+
case "endswith":
|
|
1715
|
+
case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
|
|
1716
|
+
case "null": return isNull(column);
|
|
1717
|
+
case "notnull": return isNotNull(column);
|
|
1718
|
+
case "in":
|
|
1719
|
+
case "notin": {
|
|
1720
|
+
const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
|
|
1721
|
+
return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
|
|
1722
|
+
}
|
|
1723
|
+
case "between":
|
|
1724
|
+
case "notbetween": {
|
|
1725
|
+
const valueAsArray = toArray(value);
|
|
1726
|
+
if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
|
|
1727
|
+
let [first, second] = valueAsArray;
|
|
1728
|
+
const shouldParseNumbers = !(parseNumbers === false);
|
|
1729
|
+
if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
|
|
1730
|
+
const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
|
|
1731
|
+
const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
|
|
1732
|
+
if (!preserveValueOrder && secondNum < firstNum) {
|
|
1733
|
+
const tempNum = secondNum;
|
|
1734
|
+
second = firstNum;
|
|
1735
|
+
first = tempNum;
|
|
1736
|
+
} else {
|
|
1737
|
+
first = firstNum;
|
|
1738
|
+
second = secondNum;
|
|
1739
|
+
}
|
|
1740
|
+
} else if (valueIsField) {
|
|
1741
|
+
first = asFieldOrValue(first);
|
|
1742
|
+
second = asFieldOrValue(second);
|
|
1743
|
+
}
|
|
1744
|
+
return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
|
|
1745
|
+
}
|
|
1746
|
+
return;
|
|
1747
|
+
}
|
|
1748
|
+
default: return;
|
|
1749
|
+
}
|
|
1750
|
+
};
|
|
1751
|
+
//#endregion
|
|
1844
1752
|
//#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
|
|
1845
1753
|
const rangeOperatorMap = {
|
|
1846
1754
|
"<": "lt",
|
|
@@ -2490,7 +2398,7 @@ const defaultRuleProcessorSQL = (rule, opts = {}) => {
|
|
|
2490
2398
|
case "atmost":
|
|
2491
2399
|
case "exactly": {
|
|
2492
2400
|
const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
|
|
2493
|
-
return `(select count(*)${threshold > 0 && threshold < 1 ?
|
|
2401
|
+
return `(select count(*)${threshold > 0 && threshold < 1 ? `::float / array_length(${ruleField}, 1)` : ""} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) ${op} ${threshold}`;
|
|
2494
2402
|
}
|
|
2495
2403
|
}
|
|
2496
2404
|
}
|
|
@@ -2557,7 +2465,7 @@ const defaultRuleProcessorParameterized = (rule, opts, meta) => {
|
|
|
2557
2465
|
case "atmost":
|
|
2558
2466
|
case "exactly": {
|
|
2559
2467
|
const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
|
|
2560
|
-
return finalize(`(select count(*)${threshold > 0 && threshold < 1 ?
|
|
2468
|
+
return finalize(`(select count(*)${threshold > 0 && threshold < 1 ? `::float / array_length(${ruleField}, 1)` : ""} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) ${op} ${threshold}`);
|
|
2561
2469
|
}
|
|
2562
2470
|
}
|
|
2563
2471
|
}
|
|
@@ -2810,6 +2718,96 @@ const defaultRuleProcessorSPARQL = (rule, opts = {}) => {
|
|
|
2810
2718
|
}
|
|
2811
2719
|
};
|
|
2812
2720
|
//#endregion
|
|
2721
|
+
//#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
|
|
2722
|
+
/**
|
|
2723
|
+
* Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
|
|
2724
|
+
*
|
|
2725
|
+
* @group Export
|
|
2726
|
+
*/
|
|
2727
|
+
const defaultRuleProcessorTanStackDB = (rule, _options) => {
|
|
2728
|
+
const { parseNumbers, preserveValueOrder, context = {} } = _options ?? ( /* v8 ignore start -- @preserve */ {});
|
|
2729
|
+
const ops = context.tanStackDbOperators;
|
|
2730
|
+
const refs = context._tanstackDbRefs;
|
|
2731
|
+
const primaryRef = context._tanstackDbPrimaryRef;
|
|
2732
|
+
if (!ops || !refs || !primaryRef) return void 0;
|
|
2733
|
+
const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
|
|
2734
|
+
const resolveField = (fieldName) => {
|
|
2735
|
+
const dotIdx = fieldName.indexOf(".");
|
|
2736
|
+
if (dotIdx > 0) {
|
|
2737
|
+
const prefix = fieldName.slice(0, dotIdx);
|
|
2738
|
+
const rest = fieldName.slice(dotIdx + 1);
|
|
2739
|
+
if (refs[prefix]) return refs[prefix][rest];
|
|
2740
|
+
}
|
|
2741
|
+
return refs[primaryRef][fieldName];
|
|
2742
|
+
};
|
|
2743
|
+
const { field, operator, value, valueSource } = rule;
|
|
2744
|
+
const column = resolveField(field);
|
|
2745
|
+
const operatorLC = lc(operator);
|
|
2746
|
+
const valueIsField = valueSource === "field";
|
|
2747
|
+
const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
|
|
2748
|
+
const maybeParseNumber = (v) => {
|
|
2749
|
+
if (valueIsField || !parseNumbers) return asFieldOrValue(v);
|
|
2750
|
+
return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
|
|
2751
|
+
};
|
|
2752
|
+
switch (operatorLC) {
|
|
2753
|
+
case "=": return eq(column, maybeParseNumber(value));
|
|
2754
|
+
case "!=": return not(eq(column, maybeParseNumber(value)));
|
|
2755
|
+
case ">": return gt(column, maybeParseNumber(value));
|
|
2756
|
+
case "<": return lt(column, maybeParseNumber(value));
|
|
2757
|
+
case ">=": return gte(column, maybeParseNumber(value));
|
|
2758
|
+
case "<=": return lte(column, maybeParseNumber(value));
|
|
2759
|
+
case "beginswith":
|
|
2760
|
+
case "doesnotbeginwith": {
|
|
2761
|
+
const expr = like(column, valueIsField ? void 0 : `${value}%`);
|
|
2762
|
+
return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
|
|
2763
|
+
}
|
|
2764
|
+
case "contains":
|
|
2765
|
+
case "doesnotcontain": {
|
|
2766
|
+
const expr = like(column, valueIsField ? void 0 : `%${value}%`);
|
|
2767
|
+
return operatorLC === "doesnotcontain" ? not(expr) : expr;
|
|
2768
|
+
}
|
|
2769
|
+
case "endswith":
|
|
2770
|
+
case "doesnotendwith": {
|
|
2771
|
+
const expr = like(column, valueIsField ? void 0 : `%${value}`);
|
|
2772
|
+
return operatorLC === "doesnotendwith" ? not(expr) : expr;
|
|
2773
|
+
}
|
|
2774
|
+
case "null": return isNull(column);
|
|
2775
|
+
case "notnull": return not(isNull(column));
|
|
2776
|
+
case "in":
|
|
2777
|
+
case "notin": {
|
|
2778
|
+
const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
|
|
2779
|
+
return operatorLC === "notin" ? not(expr) : expr;
|
|
2780
|
+
}
|
|
2781
|
+
case "between":
|
|
2782
|
+
case "notbetween": {
|
|
2783
|
+
const valueAsArray = toArray(value);
|
|
2784
|
+
if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
|
|
2785
|
+
let [first, second] = valueAsArray;
|
|
2786
|
+
const shouldParseNumbers = !(parseNumbers === false);
|
|
2787
|
+
if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
|
|
2788
|
+
const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
|
|
2789
|
+
const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
|
|
2790
|
+
if (!preserveValueOrder && secondNum < firstNum) {
|
|
2791
|
+
const tempNum = secondNum;
|
|
2792
|
+
second = firstNum;
|
|
2793
|
+
first = tempNum;
|
|
2794
|
+
} else {
|
|
2795
|
+
first = firstNum;
|
|
2796
|
+
second = secondNum;
|
|
2797
|
+
}
|
|
2798
|
+
} else if (valueIsField) {
|
|
2799
|
+
first = asFieldOrValue(first);
|
|
2800
|
+
second = asFieldOrValue(second);
|
|
2801
|
+
}
|
|
2802
|
+
const expr = and(gte(column, first), lte(column, second));
|
|
2803
|
+
return operatorLC === "notbetween" ? not(expr) : expr;
|
|
2804
|
+
}
|
|
2805
|
+
return;
|
|
2806
|
+
}
|
|
2807
|
+
default: return;
|
|
2808
|
+
}
|
|
2809
|
+
};
|
|
2810
|
+
//#endregion
|
|
2813
2811
|
//#region src/utils/formatQuery/formatQuery.ts
|
|
2814
2812
|
/**
|
|
2815
2813
|
* A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.
|
|
@@ -3059,6 +3057,8 @@ const generateValueProcessor = (vpbr) => (field, operator, value, valueSource) =
|
|
|
3059
3057
|
/**
|
|
3060
3058
|
* Default value processor used by {@link formatQuery} for "sql" format.
|
|
3061
3059
|
*
|
|
3060
|
+
* @deprecated Prefer {@link defaultValueProcessorByRule}.
|
|
3061
|
+
*
|
|
3062
3062
|
* @group Export
|
|
3063
3063
|
*/
|
|
3064
3064
|
const defaultValueProcessor = generateValueProcessor(defaultValueProcessorByRule);
|