From 2e9daba3aa9fac78fea4c50fbae24108a4911207 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 2 Sep 2024 14:50:46 +0200 Subject: [PATCH] fixed number filter for mongodb and cosmosdb --- packages/filterparser/src/parseFilter.ts | 50 +++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/packages/filterparser/src/parseFilter.ts b/packages/filterparser/src/parseFilter.ts index 7625ce10d..36bc1faec 100644 --- a/packages/filterparser/src/parseFilter.ts +++ b/packages/filterparser/src/parseFilter.ts @@ -95,6 +95,48 @@ const numberTestCondition = () => value => { }; }; +const numberTestIfNumberCondition = () => value => { + const numValue = parseFloat(value); + if (isNaN(numValue)) { + return { + conditionType: 'like', + left: { + exprType: 'placeholder', + }, + right: { + exprType: 'value', + value: `.*${value}.*`, + }, + }; + } + return { + conditionType: 'or', + conditions: [ + { + conditionType: 'like', + left: { + exprType: 'placeholder', + }, + right: { + exprType: 'value', + value: `.*${value}.*`, + }, + }, + { + conditionType: 'binary', + operator: '=', + left: { + exprType: 'placeholder', + }, + right: { + exprType: 'value', + value: numValue, + }, + }, + ], + }; +}; + const idRegex = /[('"]([0-9a-f]{24})['")]/; const objectIdTestCondition = () => value => ({ @@ -414,6 +456,7 @@ const createParser = (filterBehaviour: FilterBehaviour) => { falseNum: () => word('0').map(binaryFixedValueCondition('0')), eq: r => word('=').then(r.value).map(binaryCondition('=')), + eqNum: r => word('=').then(r.value).map(numberTestIfNumberCondition()), ne: r => word('!=').then(r.value).map(binaryCondition('<>')), ne2: r => word('<>').then(r.value).map(binaryCondition('<>')), le: r => word('<=').then(r.value).map(binaryCondition('<=')), @@ -480,7 +523,12 @@ const createParser = (filterBehaviour: FilterBehaviour) => { } if (filterBehaviour.supportEquals) { - allowedElements.push('eq', 'ne', 'ne2'); + if (filterBehaviour.allowNumberDualTesting) { + allowedElements.push('eqNum'); + } else { + allowedElements.push('eq'); + } + allowedElements.push('ne', 'ne2'); } if (filterBehaviour.supportSqlCondition) {