@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.
- package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +21 -13
- package/dist/cjs/react-querybuilder_core.cjs.development.js +200 -199
- package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +21 -13
- 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 +2 -2
- package/dist/formatQuery.d.ts +2 -2
- package/dist/formatQuery.js +195 -197
- package/dist/formatQuery.js.map +1 -1
- package/dist/formatQuery.mjs +195 -197
- package/dist/formatQuery.mjs.map +1 -1
- 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.js +3 -3
- package/dist/parseCEL.js.map +1 -1
- package/dist/parseCEL.mjs +3 -3
- package/dist/parseCEL.mjs.map +1 -1
- package/dist/parseCypher.js.map +1 -1
- package/dist/parseCypher.mjs.map +1 -1
- package/dist/parseGremlin.js.map +1 -1
- package/dist/parseGremlin.mjs.map +1 -1
- 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.js +4 -4
- package/dist/parseJsonLogic.js.map +1 -1
- package/dist/parseJsonLogic.mjs +4 -4
- package/dist/parseJsonLogic.mjs.map +1 -1
- 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.js.map +1 -1
- package/dist/parseSPARQL.mjs.map +1 -1
- 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.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 +21 -13
- package/dist/react-querybuilder_core.legacy-esm.d.ts +21 -13
- package/dist/react-querybuilder_core.legacy-esm.js +198 -197
- package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
- package/dist/react-querybuilder_core.mjs +200 -199
- package/dist/react-querybuilder_core.mjs.map +1 -1
- package/dist/react-querybuilder_core.production.d.mts +21 -13
- package/dist/react-querybuilder_core.production.mjs +1 -1
- package/dist/react-querybuilder_core.production.mjs.map +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 +8 -8
- 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
|
@@ -429,7 +429,8 @@ const standardClassnames = {
|
|
|
429
429
|
branches: "queryBuilder-branches",
|
|
430
430
|
justified: "queryBuilder-justified",
|
|
431
431
|
hasSubQuery: "rule-hasSubQuery",
|
|
432
|
-
loading: "queryBuilder-loading"
|
|
432
|
+
loading: "queryBuilder-loading",
|
|
433
|
+
valueDateTimeRelative: "rule-value-dateTimeRelative"
|
|
433
434
|
};
|
|
434
435
|
/**
|
|
435
436
|
* Default classnames for each component.
|
|
@@ -479,7 +480,8 @@ const defaultControlClassnames = {
|
|
|
479
480
|
valueListItem: "",
|
|
480
481
|
branches: "",
|
|
481
482
|
hasSubQuery: "",
|
|
482
|
-
loading: ""
|
|
483
|
+
loading: "",
|
|
484
|
+
valueDateTimeRelative: ""
|
|
483
485
|
};
|
|
484
486
|
/**
|
|
485
487
|
* Default reason codes for a group being invalid.
|
|
@@ -612,7 +614,7 @@ const trimIfString = (val) => typeof val === "string" ? val.trim() : val;
|
|
|
612
614
|
* Splits a string by comma then trims each element. Arrays are returned as is except
|
|
613
615
|
* any string elements are trimmed.
|
|
614
616
|
*/
|
|
615
|
-
const toArray = (a, { retainEmptyStrings } = {}) => Array.isArray(a) ? a.map(
|
|
617
|
+
const toArray = (a, { retainEmptyStrings } = {}) => Array.isArray(a) ? a.map(trimIfString) : typeof a === "string" ? splitBy(a, ",").filter(retainEmptyStrings ? () => true : (s) => !/^\s*$/.test(s)).map((s) => s.trim()) : typeof a === "number" ? [a] : [];
|
|
616
618
|
/**
|
|
617
619
|
* Determines if an array is free of `null`/`undefined`.
|
|
618
620
|
*/
|
|
@@ -673,7 +675,7 @@ const numericRegex = new RegExp(numericRegex$1.source.replace(/^\^/, String.raw`
|
|
|
673
675
|
/**
|
|
674
676
|
* Determines if a variable is a plain old JavaScript object, aka POJO.
|
|
675
677
|
*/
|
|
676
|
-
const isPojo = (obj) => obj
|
|
678
|
+
const isPojo = (obj) => obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype;
|
|
677
679
|
/**
|
|
678
680
|
* Simple helper to determine whether a value is null, undefined, or an empty string.
|
|
679
681
|
*/
|
|
@@ -2002,106 +2004,6 @@ const defaultRuleGroupProcessorCypher = (ruleGroup, options) => {
|
|
|
2002
2004
|
return processRuleGroup(ruleGroup, true);
|
|
2003
2005
|
};
|
|
2004
2006
|
//#endregion
|
|
2005
|
-
//#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
|
|
2006
|
-
/**
|
|
2007
|
-
* Default rule processor used by {@link formatQuery} for the "drizzle" format.
|
|
2008
|
-
*
|
|
2009
|
-
* @group Export
|
|
2010
|
-
*/
|
|
2011
|
-
const defaultRuleProcessorDrizzle = (rule, _options) => {
|
|
2012
|
-
const opts = _options ?? ( /* v8 ignore start -- @preserve */ {});
|
|
2013
|
-
// v8 ignore next
|
|
2014
|
-
const { parseNumbers, preserveValueOrder, context = {} } = opts;
|
|
2015
|
-
const { columns, drizzleOperators, useRawFields } = context;
|
|
2016
|
-
if (!columns || !drizzleOperators) return void 0;
|
|
2017
|
-
const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
|
|
2018
|
-
const { field, operator, value, valueSource } = rule;
|
|
2019
|
-
const column = useRawFields && /^[a-z_][a-z0-9_.]*$/i.test(field) ? sql.raw(field) : columns[field];
|
|
2020
|
-
const operatorLC = lc(operator);
|
|
2021
|
-
const valueIsField = valueSource === "field";
|
|
2022
|
-
const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
|
|
2023
|
-
const maybeParseNumber = (v) => {
|
|
2024
|
-
if (valueIsField || !parseNumbers) return asFieldOrValue(v);
|
|
2025
|
-
return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
|
|
2026
|
-
};
|
|
2027
|
-
if (!column) return void 0;
|
|
2028
|
-
const matchEval = processMatchMode(rule);
|
|
2029
|
-
if (matchEval === false) return;
|
|
2030
|
-
else if (matchEval) {
|
|
2031
|
-
if (opts.preset !== "postgresql") return void 0;
|
|
2032
|
-
const { mode, threshold } = matchEval;
|
|
2033
|
-
const arrayElementAlias = "elem_alias";
|
|
2034
|
-
const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => ({
|
|
2035
|
-
...r,
|
|
2036
|
-
field: arrayElementAlias
|
|
2037
|
-
}) }), {
|
|
2038
|
-
...opts,
|
|
2039
|
-
context: {
|
|
2040
|
-
...opts.context,
|
|
2041
|
-
useRawFields: true
|
|
2042
|
-
}
|
|
2043
|
-
});
|
|
2044
|
-
switch (mode) {
|
|
2045
|
-
case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
|
|
2046
|
-
case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
|
|
2047
|
-
case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
|
|
2048
|
-
case "atleast":
|
|
2049
|
-
case "atmost":
|
|
2050
|
-
case "exactly": {
|
|
2051
|
-
const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
|
|
2052
|
-
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}`)}`;
|
|
2053
|
-
}
|
|
2054
|
-
}
|
|
2055
|
-
}
|
|
2056
|
-
switch (operatorLC) {
|
|
2057
|
-
case "=": return eq(column, maybeParseNumber(value));
|
|
2058
|
-
case "!=": return ne(column, maybeParseNumber(value));
|
|
2059
|
-
case ">": return gt(column, maybeParseNumber(value));
|
|
2060
|
-
case "<": return lt(column, maybeParseNumber(value));
|
|
2061
|
-
case ">=": return gte(column, maybeParseNumber(value));
|
|
2062
|
-
case "<=": return lte(column, maybeParseNumber(value));
|
|
2063
|
-
case "beginswith":
|
|
2064
|
-
case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
|
|
2065
|
-
case "contains":
|
|
2066
|
-
case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
|
|
2067
|
-
case "endswith":
|
|
2068
|
-
case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
|
|
2069
|
-
case "null": return isNull(column);
|
|
2070
|
-
case "notnull": return isNotNull(column);
|
|
2071
|
-
case "in":
|
|
2072
|
-
case "notin": {
|
|
2073
|
-
const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
|
|
2074
|
-
return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
|
|
2075
|
-
}
|
|
2076
|
-
case "between":
|
|
2077
|
-
case "notbetween": {
|
|
2078
|
-
const valueAsArray = toArray(value);
|
|
2079
|
-
if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
|
|
2080
|
-
let [first, second] = valueAsArray;
|
|
2081
|
-
const shouldParseNumbers = !(parseNumbers === false);
|
|
2082
|
-
if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
|
|
2083
|
-
const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
|
|
2084
|
-
const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
|
|
2085
|
-
if (!preserveValueOrder && secondNum < firstNum) {
|
|
2086
|
-
const tempNum = secondNum;
|
|
2087
|
-
second = firstNum;
|
|
2088
|
-
first = tempNum;
|
|
2089
|
-
} else {
|
|
2090
|
-
first = firstNum;
|
|
2091
|
-
second = secondNum;
|
|
2092
|
-
}
|
|
2093
|
-
} else if (valueIsField) {
|
|
2094
|
-
first = asFieldOrValue(first);
|
|
2095
|
-
second = asFieldOrValue(second);
|
|
2096
|
-
}
|
|
2097
|
-
return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
|
|
2098
|
-
}
|
|
2099
|
-
return;
|
|
2100
|
-
}
|
|
2101
|
-
default: return;
|
|
2102
|
-
}
|
|
2103
|
-
};
|
|
2104
|
-
//#endregion
|
|
2105
2007
|
//#region src/utils/formatQuery/defaultRuleGroupProcessorDrizzle.ts
|
|
2106
2008
|
/**
|
|
2107
2009
|
* Default rule group processor used by {@link formatQuery} for the "drizzle" format. The returned
|
|
@@ -2116,10 +2018,9 @@ const defaultRuleProcessorDrizzle = (rule, _options) => {
|
|
|
2116
2018
|
* @group Export
|
|
2117
2019
|
*/
|
|
2118
2020
|
const defaultRuleGroupProcessorDrizzle = (ruleGroup, options, _meta) => (columns, drizzleOperators) => {
|
|
2119
|
-
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap } = options;
|
|
2021
|
+
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, ruleProcessor } = options;
|
|
2120
2022
|
if (!columns || !drizzleOperators) return void 0;
|
|
2121
2023
|
const { and, not, or } = drizzleOperators;
|
|
2122
|
-
const ruleProcessor = defaultRuleProcessorDrizzle;
|
|
2123
2024
|
const processRuleGroup = (rg, _outermost) => {
|
|
2124
2025
|
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
|
|
2125
2026
|
const processedRules = rg.rules.map((rule) => {
|
|
@@ -2735,96 +2636,6 @@ const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
|
|
|
2735
2636
|
return processRuleGroup(ruleGroup, true);
|
|
2736
2637
|
};
|
|
2737
2638
|
//#endregion
|
|
2738
|
-
//#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
|
|
2739
|
-
/**
|
|
2740
|
-
* Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
|
|
2741
|
-
*
|
|
2742
|
-
* @group Export
|
|
2743
|
-
*/
|
|
2744
|
-
const defaultRuleProcessorTanStackDB = (rule, _options) => {
|
|
2745
|
-
const { parseNumbers, preserveValueOrder, context = {} } = _options ?? ( /* v8 ignore start -- @preserve */ {});
|
|
2746
|
-
const ops = context.tanStackDbOperators;
|
|
2747
|
-
const refs = context._tanstackDbRefs;
|
|
2748
|
-
const primaryRef = context._tanstackDbPrimaryRef;
|
|
2749
|
-
if (!ops || !refs || !primaryRef) return void 0;
|
|
2750
|
-
const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
|
|
2751
|
-
const resolveField = (fieldName) => {
|
|
2752
|
-
const dotIdx = fieldName.indexOf(".");
|
|
2753
|
-
if (dotIdx > 0) {
|
|
2754
|
-
const prefix = fieldName.slice(0, dotIdx);
|
|
2755
|
-
const rest = fieldName.slice(dotIdx + 1);
|
|
2756
|
-
if (refs[prefix]) return refs[prefix][rest];
|
|
2757
|
-
}
|
|
2758
|
-
return refs[primaryRef][fieldName];
|
|
2759
|
-
};
|
|
2760
|
-
const { field, operator, value, valueSource } = rule;
|
|
2761
|
-
const column = resolveField(field);
|
|
2762
|
-
const operatorLC = lc(operator);
|
|
2763
|
-
const valueIsField = valueSource === "field";
|
|
2764
|
-
const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
|
|
2765
|
-
const maybeParseNumber = (v) => {
|
|
2766
|
-
if (valueIsField || !parseNumbers) return asFieldOrValue(v);
|
|
2767
|
-
return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
|
|
2768
|
-
};
|
|
2769
|
-
switch (operatorLC) {
|
|
2770
|
-
case "=": return eq(column, maybeParseNumber(value));
|
|
2771
|
-
case "!=": return not(eq(column, maybeParseNumber(value)));
|
|
2772
|
-
case ">": return gt(column, maybeParseNumber(value));
|
|
2773
|
-
case "<": return lt(column, maybeParseNumber(value));
|
|
2774
|
-
case ">=": return gte(column, maybeParseNumber(value));
|
|
2775
|
-
case "<=": return lte(column, maybeParseNumber(value));
|
|
2776
|
-
case "beginswith":
|
|
2777
|
-
case "doesnotbeginwith": {
|
|
2778
|
-
const expr = like(column, valueIsField ? void 0 : `${value}%`);
|
|
2779
|
-
return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
|
|
2780
|
-
}
|
|
2781
|
-
case "contains":
|
|
2782
|
-
case "doesnotcontain": {
|
|
2783
|
-
const expr = like(column, valueIsField ? void 0 : `%${value}%`);
|
|
2784
|
-
return operatorLC === "doesnotcontain" ? not(expr) : expr;
|
|
2785
|
-
}
|
|
2786
|
-
case "endswith":
|
|
2787
|
-
case "doesnotendwith": {
|
|
2788
|
-
const expr = like(column, valueIsField ? void 0 : `%${value}`);
|
|
2789
|
-
return operatorLC === "doesnotendwith" ? not(expr) : expr;
|
|
2790
|
-
}
|
|
2791
|
-
case "null": return isNull(column);
|
|
2792
|
-
case "notnull": return not(isNull(column));
|
|
2793
|
-
case "in":
|
|
2794
|
-
case "notin": {
|
|
2795
|
-
const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
|
|
2796
|
-
return operatorLC === "notin" ? not(expr) : expr;
|
|
2797
|
-
}
|
|
2798
|
-
case "between":
|
|
2799
|
-
case "notbetween": {
|
|
2800
|
-
const valueAsArray = toArray(value);
|
|
2801
|
-
if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
|
|
2802
|
-
let [first, second] = valueAsArray;
|
|
2803
|
-
const shouldParseNumbers = !(parseNumbers === false);
|
|
2804
|
-
if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
|
|
2805
|
-
const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
|
|
2806
|
-
const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
|
|
2807
|
-
if (!preserveValueOrder && secondNum < firstNum) {
|
|
2808
|
-
const tempNum = secondNum;
|
|
2809
|
-
second = firstNum;
|
|
2810
|
-
first = tempNum;
|
|
2811
|
-
} else {
|
|
2812
|
-
first = firstNum;
|
|
2813
|
-
second = secondNum;
|
|
2814
|
-
}
|
|
2815
|
-
} else if (valueIsField) {
|
|
2816
|
-
first = asFieldOrValue(first);
|
|
2817
|
-
second = asFieldOrValue(second);
|
|
2818
|
-
}
|
|
2819
|
-
const expr = and(gte(column, first), lte(column, second));
|
|
2820
|
-
return operatorLC === "notbetween" ? not(expr) : expr;
|
|
2821
|
-
}
|
|
2822
|
-
return;
|
|
2823
|
-
}
|
|
2824
|
-
default: return;
|
|
2825
|
-
}
|
|
2826
|
-
};
|
|
2827
|
-
//#endregion
|
|
2828
2639
|
//#region src/utils/formatQuery/defaultRuleGroupProcessorTanStackDB.ts
|
|
2829
2640
|
/**
|
|
2830
2641
|
* Default rule group processor used by {@link formatQuery} for the "tanstack_db" format.
|
|
@@ -2837,7 +2648,7 @@ const defaultRuleProcessorTanStackDB = (rule, _options) => {
|
|
|
2837
2648
|
* @group Export
|
|
2838
2649
|
*/
|
|
2839
2650
|
const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
|
|
2840
|
-
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {} } = options;
|
|
2651
|
+
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {}, ruleProcessor } = options;
|
|
2841
2652
|
const ops = context.tanStackDbOperators;
|
|
2842
2653
|
if (!ops) return void 0;
|
|
2843
2654
|
const { and, eq, not, or } = ops;
|
|
@@ -2845,7 +2656,6 @@ const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
|
|
|
2845
2656
|
const refKeys = Object.keys(refs);
|
|
2846
2657
|
/* v8 ignore next -- @preserve */
|
|
2847
2658
|
if (refKeys.length === 0) return fallback;
|
|
2848
|
-
const ruleProcessor = defaultRuleProcessorTanStackDB;
|
|
2849
2659
|
const processRuleGroup = (rg) => {
|
|
2850
2660
|
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
|
|
2851
2661
|
const processedRules = rg.rules.map((rule) => {
|
|
@@ -3243,6 +3053,106 @@ const defaultRuleProcessorCypher = (rule, opts = {}) => {
|
|
|
3243
3053
|
}
|
|
3244
3054
|
};
|
|
3245
3055
|
//#endregion
|
|
3056
|
+
//#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
|
|
3057
|
+
/**
|
|
3058
|
+
* Default rule processor used by {@link formatQuery} for the "drizzle" format.
|
|
3059
|
+
*
|
|
3060
|
+
* @group Export
|
|
3061
|
+
*/
|
|
3062
|
+
const defaultRuleProcessorDrizzle = (rule, _options) => {
|
|
3063
|
+
const opts = _options ?? ( /* v8 ignore start -- @preserve */ {});
|
|
3064
|
+
// v8 ignore next
|
|
3065
|
+
const { parseNumbers, preserveValueOrder, context = {} } = opts;
|
|
3066
|
+
const { columns, drizzleOperators, useRawFields } = context;
|
|
3067
|
+
if (!columns || !drizzleOperators) return void 0;
|
|
3068
|
+
const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
|
|
3069
|
+
const { field, operator, value, valueSource } = rule;
|
|
3070
|
+
const column = useRawFields && /^[a-z_][a-z0-9_.]*$/i.test(field) ? sql.raw(field) : columns[field];
|
|
3071
|
+
const operatorLC = lc(operator);
|
|
3072
|
+
const valueIsField = valueSource === "field";
|
|
3073
|
+
const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
|
|
3074
|
+
const maybeParseNumber = (v) => {
|
|
3075
|
+
if (valueIsField || !parseNumbers) return asFieldOrValue(v);
|
|
3076
|
+
return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
|
|
3077
|
+
};
|
|
3078
|
+
if (!column) return void 0;
|
|
3079
|
+
const matchEval = processMatchMode(rule);
|
|
3080
|
+
if (matchEval === false) return;
|
|
3081
|
+
else if (matchEval) {
|
|
3082
|
+
if (opts.preset !== "postgresql") return void 0;
|
|
3083
|
+
const { mode, threshold } = matchEval;
|
|
3084
|
+
const arrayElementAlias = "elem_alias";
|
|
3085
|
+
const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => ({
|
|
3086
|
+
...r,
|
|
3087
|
+
field: arrayElementAlias
|
|
3088
|
+
}) }), {
|
|
3089
|
+
...opts,
|
|
3090
|
+
context: {
|
|
3091
|
+
...opts.context,
|
|
3092
|
+
useRawFields: true
|
|
3093
|
+
}
|
|
3094
|
+
});
|
|
3095
|
+
switch (mode) {
|
|
3096
|
+
case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
|
|
3097
|
+
case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
|
|
3098
|
+
case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
|
|
3099
|
+
case "atleast":
|
|
3100
|
+
case "atmost":
|
|
3101
|
+
case "exactly": {
|
|
3102
|
+
const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
|
|
3103
|
+
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}`)}`;
|
|
3104
|
+
}
|
|
3105
|
+
}
|
|
3106
|
+
}
|
|
3107
|
+
switch (operatorLC) {
|
|
3108
|
+
case "=": return eq(column, maybeParseNumber(value));
|
|
3109
|
+
case "!=": return ne(column, maybeParseNumber(value));
|
|
3110
|
+
case ">": return gt(column, maybeParseNumber(value));
|
|
3111
|
+
case "<": return lt(column, maybeParseNumber(value));
|
|
3112
|
+
case ">=": return gte(column, maybeParseNumber(value));
|
|
3113
|
+
case "<=": return lte(column, maybeParseNumber(value));
|
|
3114
|
+
case "beginswith":
|
|
3115
|
+
case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
|
|
3116
|
+
case "contains":
|
|
3117
|
+
case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
|
|
3118
|
+
case "endswith":
|
|
3119
|
+
case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
|
|
3120
|
+
case "null": return isNull(column);
|
|
3121
|
+
case "notnull": return isNotNull(column);
|
|
3122
|
+
case "in":
|
|
3123
|
+
case "notin": {
|
|
3124
|
+
const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
|
|
3125
|
+
return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
|
|
3126
|
+
}
|
|
3127
|
+
case "between":
|
|
3128
|
+
case "notbetween": {
|
|
3129
|
+
const valueAsArray = toArray(value);
|
|
3130
|
+
if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
|
|
3131
|
+
let [first, second] = valueAsArray;
|
|
3132
|
+
const shouldParseNumbers = !(parseNumbers === false);
|
|
3133
|
+
if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
|
|
3134
|
+
const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
|
|
3135
|
+
const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
|
|
3136
|
+
if (!preserveValueOrder && secondNum < firstNum) {
|
|
3137
|
+
const tempNum = secondNum;
|
|
3138
|
+
second = firstNum;
|
|
3139
|
+
first = tempNum;
|
|
3140
|
+
} else {
|
|
3141
|
+
first = firstNum;
|
|
3142
|
+
second = secondNum;
|
|
3143
|
+
}
|
|
3144
|
+
} else if (valueIsField) {
|
|
3145
|
+
first = asFieldOrValue(first);
|
|
3146
|
+
second = asFieldOrValue(second);
|
|
3147
|
+
}
|
|
3148
|
+
return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
|
|
3149
|
+
}
|
|
3150
|
+
return;
|
|
3151
|
+
}
|
|
3152
|
+
default: return;
|
|
3153
|
+
}
|
|
3154
|
+
};
|
|
3155
|
+
//#endregion
|
|
3246
3156
|
//#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
|
|
3247
3157
|
const rangeOperatorMap = {
|
|
3248
3158
|
"<": "lt",
|
|
@@ -4212,6 +4122,96 @@ const defaultRuleProcessorSPARQL = (rule, opts = {}) => {
|
|
|
4212
4122
|
}
|
|
4213
4123
|
};
|
|
4214
4124
|
//#endregion
|
|
4125
|
+
//#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
|
|
4126
|
+
/**
|
|
4127
|
+
* Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
|
|
4128
|
+
*
|
|
4129
|
+
* @group Export
|
|
4130
|
+
*/
|
|
4131
|
+
const defaultRuleProcessorTanStackDB = (rule, _options) => {
|
|
4132
|
+
const { parseNumbers, preserveValueOrder, context = {} } = _options ?? ( /* v8 ignore start -- @preserve */ {});
|
|
4133
|
+
const ops = context.tanStackDbOperators;
|
|
4134
|
+
const refs = context._tanstackDbRefs;
|
|
4135
|
+
const primaryRef = context._tanstackDbPrimaryRef;
|
|
4136
|
+
if (!ops || !refs || !primaryRef) return void 0;
|
|
4137
|
+
const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
|
|
4138
|
+
const resolveField = (fieldName) => {
|
|
4139
|
+
const dotIdx = fieldName.indexOf(".");
|
|
4140
|
+
if (dotIdx > 0) {
|
|
4141
|
+
const prefix = fieldName.slice(0, dotIdx);
|
|
4142
|
+
const rest = fieldName.slice(dotIdx + 1);
|
|
4143
|
+
if (refs[prefix]) return refs[prefix][rest];
|
|
4144
|
+
}
|
|
4145
|
+
return refs[primaryRef][fieldName];
|
|
4146
|
+
};
|
|
4147
|
+
const { field, operator, value, valueSource } = rule;
|
|
4148
|
+
const column = resolveField(field);
|
|
4149
|
+
const operatorLC = lc(operator);
|
|
4150
|
+
const valueIsField = valueSource === "field";
|
|
4151
|
+
const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
|
|
4152
|
+
const maybeParseNumber = (v) => {
|
|
4153
|
+
if (valueIsField || !parseNumbers) return asFieldOrValue(v);
|
|
4154
|
+
return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
|
|
4155
|
+
};
|
|
4156
|
+
switch (operatorLC) {
|
|
4157
|
+
case "=": return eq(column, maybeParseNumber(value));
|
|
4158
|
+
case "!=": return not(eq(column, maybeParseNumber(value)));
|
|
4159
|
+
case ">": return gt(column, maybeParseNumber(value));
|
|
4160
|
+
case "<": return lt(column, maybeParseNumber(value));
|
|
4161
|
+
case ">=": return gte(column, maybeParseNumber(value));
|
|
4162
|
+
case "<=": return lte(column, maybeParseNumber(value));
|
|
4163
|
+
case "beginswith":
|
|
4164
|
+
case "doesnotbeginwith": {
|
|
4165
|
+
const expr = like(column, valueIsField ? void 0 : `${value}%`);
|
|
4166
|
+
return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
|
|
4167
|
+
}
|
|
4168
|
+
case "contains":
|
|
4169
|
+
case "doesnotcontain": {
|
|
4170
|
+
const expr = like(column, valueIsField ? void 0 : `%${value}%`);
|
|
4171
|
+
return operatorLC === "doesnotcontain" ? not(expr) : expr;
|
|
4172
|
+
}
|
|
4173
|
+
case "endswith":
|
|
4174
|
+
case "doesnotendwith": {
|
|
4175
|
+
const expr = like(column, valueIsField ? void 0 : `%${value}`);
|
|
4176
|
+
return operatorLC === "doesnotendwith" ? not(expr) : expr;
|
|
4177
|
+
}
|
|
4178
|
+
case "null": return isNull(column);
|
|
4179
|
+
case "notnull": return not(isNull(column));
|
|
4180
|
+
case "in":
|
|
4181
|
+
case "notin": {
|
|
4182
|
+
const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
|
|
4183
|
+
return operatorLC === "notin" ? not(expr) : expr;
|
|
4184
|
+
}
|
|
4185
|
+
case "between":
|
|
4186
|
+
case "notbetween": {
|
|
4187
|
+
const valueAsArray = toArray(value);
|
|
4188
|
+
if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
|
|
4189
|
+
let [first, second] = valueAsArray;
|
|
4190
|
+
const shouldParseNumbers = !(parseNumbers === false);
|
|
4191
|
+
if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
|
|
4192
|
+
const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
|
|
4193
|
+
const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
|
|
4194
|
+
if (!preserveValueOrder && secondNum < firstNum) {
|
|
4195
|
+
const tempNum = secondNum;
|
|
4196
|
+
second = firstNum;
|
|
4197
|
+
first = tempNum;
|
|
4198
|
+
} else {
|
|
4199
|
+
first = firstNum;
|
|
4200
|
+
second = secondNum;
|
|
4201
|
+
}
|
|
4202
|
+
} else if (valueIsField) {
|
|
4203
|
+
first = asFieldOrValue(first);
|
|
4204
|
+
second = asFieldOrValue(second);
|
|
4205
|
+
}
|
|
4206
|
+
const expr = and(gte(column, first), lte(column, second));
|
|
4207
|
+
return operatorLC === "notbetween" ? not(expr) : expr;
|
|
4208
|
+
}
|
|
4209
|
+
return;
|
|
4210
|
+
}
|
|
4211
|
+
default: return;
|
|
4212
|
+
}
|
|
4213
|
+
};
|
|
4214
|
+
//#endregion
|
|
4215
4215
|
//#region src/utils/formatQuery/formatQuery.ts
|
|
4216
4216
|
/**
|
|
4217
4217
|
* A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.
|
|
@@ -4777,7 +4777,8 @@ const mergeClassnames = (...args) => ({
|
|
|
4777
4777
|
matchThreshold: joinClassnamesByName("matchThreshold", args),
|
|
4778
4778
|
branches: joinClassnamesByName("branches", args),
|
|
4779
4779
|
hasSubQuery: joinClassnamesByName("hasSubQuery", args),
|
|
4780
|
-
loading: joinClassnamesByName("loading", args)
|
|
4780
|
+
loading: joinClassnamesByName("loading", args),
|
|
4781
|
+
valueDateTimeRelative: joinClassnamesByName("valueDateTimeRelative", args)
|
|
4781
4782
|
});
|
|
4782
4783
|
//#endregion
|
|
4783
4784
|
//#region src/utils/preferProp.ts
|