@react-querybuilder/core 8.18.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.
Files changed (74) hide show
  1. package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +21 -13
  2. package/dist/cjs/react-querybuilder_core.cjs.development.js +200 -199
  3. package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
  4. package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +21 -13
  5. package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
  6. package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
  7. package/dist/{convertQuery-BoMPXL7_.js → convertQuery-BJKNgecE.js} +2 -2
  8. package/dist/{convertQuery-BoMPXL7_.js.map → convertQuery-BJKNgecE.js.map} +1 -1
  9. package/dist/{convertQuery-CQwOrjQr.mjs → convertQuery-J1CaoDxe.mjs} +2 -2
  10. package/dist/{convertQuery-CQwOrjQr.mjs.map → convertQuery-J1CaoDxe.mjs.map} +1 -1
  11. package/dist/formatQuery.d.mts +2 -2
  12. package/dist/formatQuery.d.ts +2 -2
  13. package/dist/formatQuery.js +195 -197
  14. package/dist/formatQuery.js.map +1 -1
  15. package/dist/formatQuery.mjs +195 -197
  16. package/dist/formatQuery.mjs.map +1 -1
  17. package/dist/{objectUtils-DxVaGCdg.js → objectUtils-DBJI82bl.js} +2 -2
  18. package/dist/objectUtils-DBJI82bl.js.map +1 -0
  19. package/dist/{objectUtils-D-w8MzpZ.mjs → objectUtils-ZvPkF6u6.mjs} +2 -2
  20. package/dist/objectUtils-ZvPkF6u6.mjs.map +1 -0
  21. package/dist/parseCEL.js +3 -3
  22. package/dist/parseCEL.js.map +1 -1
  23. package/dist/parseCEL.mjs +3 -3
  24. package/dist/parseCEL.mjs.map +1 -1
  25. package/dist/parseCypher.js.map +1 -1
  26. package/dist/parseCypher.mjs.map +1 -1
  27. package/dist/parseGremlin.js.map +1 -1
  28. package/dist/parseGremlin.mjs.map +1 -1
  29. package/dist/parseJSONata.js +2 -2
  30. package/dist/parseJSONata.js.map +1 -1
  31. package/dist/parseJSONata.mjs +2 -2
  32. package/dist/parseJSONata.mjs.map +1 -1
  33. package/dist/parseJsonLogic.js +4 -4
  34. package/dist/parseJsonLogic.js.map +1 -1
  35. package/dist/parseJsonLogic.mjs +4 -4
  36. package/dist/parseJsonLogic.mjs.map +1 -1
  37. package/dist/parseMongoDB.js +4 -4
  38. package/dist/parseMongoDB.js.map +1 -1
  39. package/dist/parseMongoDB.mjs +4 -4
  40. package/dist/parseMongoDB.mjs.map +1 -1
  41. package/dist/parseSPARQL.js.map +1 -1
  42. package/dist/parseSPARQL.mjs.map +1 -1
  43. package/dist/parseSQL.js +3 -3
  44. package/dist/parseSQL.js.map +1 -1
  45. package/dist/parseSQL.mjs +3 -3
  46. package/dist/parseSQL.mjs.map +1 -1
  47. package/dist/parseSpEL.js +3 -3
  48. package/dist/parseSpEL.js.map +1 -1
  49. package/dist/parseSpEL.mjs +3 -3
  50. package/dist/parseSpEL.mjs.map +1 -1
  51. package/dist/{prepareQueryObjects-BXf5aV-A.mjs → prepareQueryObjects-Cd_tt4oy.mjs} +3 -3
  52. package/dist/{prepareQueryObjects-BXf5aV-A.mjs.map → prepareQueryObjects-Cd_tt4oy.mjs.map} +1 -1
  53. package/dist/{prepareQueryObjects-gRQqiBPR.js → prepareQueryObjects-DaAXX792.js} +3 -3
  54. package/dist/{prepareQueryObjects-gRQqiBPR.js.map → prepareQueryObjects-DaAXX792.js.map} +1 -1
  55. package/dist/react-querybuilder_core.d.mts +21 -13
  56. package/dist/react-querybuilder_core.legacy-esm.d.ts +21 -13
  57. package/dist/react-querybuilder_core.legacy-esm.js +198 -197
  58. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  59. package/dist/react-querybuilder_core.mjs +200 -199
  60. package/dist/react-querybuilder_core.mjs.map +1 -1
  61. package/dist/react-querybuilder_core.production.d.mts +21 -13
  62. package/dist/react-querybuilder_core.production.mjs +1 -1
  63. package/dist/react-querybuilder_core.production.mjs.map +1 -1
  64. package/dist/transformQuery.js +1 -1
  65. package/dist/transformQuery.mjs +1 -1
  66. package/dist/{utils-ZlKseh1X.js → utils-BpaOtylk.js} +3 -3
  67. package/dist/utils-BpaOtylk.js.map +1 -0
  68. package/dist/{utils-01WaTGBL.mjs → utils-CJRGiPb-.mjs} +3 -3
  69. package/dist/utils-CJRGiPb-.mjs.map +1 -0
  70. package/package.json +8 -8
  71. package/dist/objectUtils-D-w8MzpZ.mjs.map +0 -1
  72. package/dist/objectUtils-DxVaGCdg.js.map +0 -1
  73. package/dist/utils-01WaTGBL.mjs.map +0 -1
  74. package/dist/utils-ZlKseh1X.js.map +0 -1
@@ -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-01WaTGBL.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-D-w8MzpZ.mjs";
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-CQwOrjQr.mjs";
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.
@@ -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(*)::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}`)}`;
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) => {
@@ -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",
@@ -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.