From 8acb64198cb4bccc4e43dea649ae323d4f3a6928 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 Feb 2024 01:24:57 +0200 Subject: [PATCH] server-ts: Port services/search/services/build_comparator --- .../search/expressions/property_comparison.js | 2 +- ...uild_comparator.js => build_comparator.ts} | 29 +++++++++++-------- src/services/search/services/parse.js | 2 +- 3 files changed, 19 insertions(+), 14 deletions(-) rename src/services/search/services/{build_comparator.js => build_comparator.ts} (51%) diff --git a/src/services/search/expressions/property_comparison.js b/src/services/search/expressions/property_comparison.js index 865e50ff1..8ab21f448 100644 --- a/src/services/search/expressions/property_comparison.js +++ b/src/services/search/expressions/property_comparison.js @@ -2,7 +2,7 @@ const Expression = require('./expression'); const NoteSet = require('../note_set'); -const buildComparator = require('../services/build_comparator.js'); +const buildComparator = require('../services/build_comparator'); /** * Search string is lower cased for case-insensitive comparison. But when retrieving properties, diff --git a/src/services/search/services/build_comparator.js b/src/services/search/services/build_comparator.ts similarity index 51% rename from src/services/search/services/build_comparator.js rename to src/services/search/services/build_comparator.ts index 6d3ba463a..426bfa195 100644 --- a/src/services/search/services/build_comparator.js +++ b/src/services/search/services/build_comparator.ts @@ -1,6 +1,6 @@ -const cachedRegexes = {}; +const cachedRegexes: Record = {}; -function getRegex(str) { +function getRegex(str: string) { if (!(str in cachedRegexes)) { cachedRegexes[str] = new RegExp(str); } @@ -8,31 +8,36 @@ function getRegex(str) { return cachedRegexes[str]; } -const stringComparators = { +type Comparator = (comparedValue: T) => ((val: string) => boolean); + +const stringComparators: Record> = { "=": comparedValue => (val => val === comparedValue), "!=": comparedValue => (val => val !== comparedValue), ">": comparedValue => (val => val > comparedValue), ">=": comparedValue => (val => val >= comparedValue), "<": comparedValue => (val => val < comparedValue), "<=": comparedValue => (val => val <= comparedValue), - "*=": comparedValue => (val => val && val.endsWith(comparedValue)), - "=*": comparedValue => (val => val && val.startsWith(comparedValue)), - "*=*": comparedValue => (val => val && val.includes(comparedValue)), - "%=": comparedValue => (val => val && !!getRegex(comparedValue).test(val)), + "*=": comparedValue => (val => !!val && val.endsWith(comparedValue)), + "=*": comparedValue => (val => !!val && val.startsWith(comparedValue)), + "*=*": comparedValue => (val => !!val && val.includes(comparedValue)), + "%=": comparedValue => (val => !!val && !!getRegex(comparedValue).test(val)), }; -const numericComparators = { +const numericComparators: Record> = { ">": comparedValue => (val => parseFloat(val) > comparedValue), ">=": comparedValue => (val => parseFloat(val) >= comparedValue), "<": comparedValue => (val => parseFloat(val) < comparedValue), "<=": comparedValue => (val => parseFloat(val) <= comparedValue) }; -function buildComparator(operator, comparedValue) { +function buildComparator(operator: string, comparedValue: string) { comparedValue = comparedValue.toLowerCase(); - if (operator in numericComparators && !isNaN(comparedValue)) { - return numericComparators[operator](parseFloat(comparedValue)); + if (operator in numericComparators) { + const floatValue = parseFloat(comparedValue); + if (!isNaN(floatValue)) { + return numericComparators[operator](floatValue); + } } if (operator in stringComparators) { @@ -40,4 +45,4 @@ function buildComparator(operator, comparedValue) { } } -module.exports = buildComparator; +export = buildComparator; diff --git a/src/services/search/services/parse.js b/src/services/search/services/parse.js index 869046236..330f139c0 100644 --- a/src/services/search/services/parse.js +++ b/src/services/search/services/parse.js @@ -15,7 +15,7 @@ const NoteFlatTextExp = require('../expressions/note_flat_text'); const NoteContentFulltextExp = require('../expressions/note_content_fulltext'); const OrderByAndLimitExp = require('../expressions/order_by_and_limit'); const AncestorExp = require('../expressions/ancestor'); -const buildComparator = require('./build_comparator.js'); +const buildComparator = require('./build_comparator'); const ValueExtractor = require('../value_extractor'); const utils = require('../../utils'); const TrueExp = require('../expressions/true');