From e93276f2d389f11bc2cc1f8c0a4e0e645d896d2b Mon Sep 17 00:00:00 2001 From: marlon-erler Date: Thu, 25 Jul 2024 14:15:00 +0200 Subject: [PATCH] add filterObjectsByWords utility function --- dist/index.js | 32 +++++------ src/Model/Utility/utility.ts | 101 ++++++++++++++++++++++++++--------- 2 files changed, 92 insertions(+), 41 deletions(-) diff --git a/dist/index.js b/dist/index.js index 86ed536f..0aaff7ed 100644 --- a/dist/index.js +++ b/dist/index.js @@ -314,22 +314,6 @@ function createTimestamp() { return (/* @__PURE__ */ new Date()).toISOString(); } - var HandlerManager = class { - handlers = /* @__PURE__ */ new Set(); - // manage - addHandler = (handler) => { - this.handlers.add(handler); - }; - deleteHandler = (handler) => { - this.handlers.delete(handler); - }; - // trigger - trigger = (item) => { - for (const handler of this.handlers) { - handler(item); - } - }; - }; function checkDoesObjectMatchReference(reference, stringEntryObject) { reference_entry_loop: for (const referenceEntry of Object.entries( reference @@ -369,6 +353,22 @@ } return [...values.values()].sort(localeCompare); } + var HandlerManager = class { + handlers = /* @__PURE__ */ new Set(); + // manage + addHandler = (handler) => { + this.handlers.add(handler); + }; + deleteHandler = (handler) => { + this.handlers.delete(handler); + }; + // trigger + trigger = (item) => { + for (const handler of this.handlers) { + handler(item); + } + }; + }; var IndexManager = class { itemToString; sortedStrings = []; diff --git a/src/Model/Utility/utility.ts b/src/Model/Utility/utility.ts index c27799bd..185d6c58 100644 --- a/src/Model/Utility/utility.ts +++ b/src/Model/Utility/utility.ts @@ -5,35 +5,12 @@ export function createTimestamp(): string { return new Date().toISOString(); } -// handlers -export type Handler = (item: T) => void; - -export class HandlerManager { - handlers: Set> = new Set(); - - // manage - addHandler = (handler: Handler): void => { - this.handlers.add(handler); - }; - - deleteHandler = (handler: Handler): void => { - this.handlers.delete(handler); - }; - - // trigger - trigger = (item: T): void => { - for (const handler of this.handlers) { - handler(item); - } - }; -} - -// objects +// filters etc export type StringEntryObject = { [key: string]: string | undefined }; export function filterObjectsByStringEntries( reference: StringEntryObject, - converter: (T) => StringEntryObject, + converter: (object: T) => StringEntryObject, objects: T[] ): Set { const matches: Set = new Set(); @@ -116,6 +93,80 @@ export function collectObjectValuesForKey( return [...values.values()].sort(localeCompare); } +export function filterObjectsByWords( + query: string, + getStringsOfObject: (object: T) => string[], + objects: T[] +): Set { + const matches: Set = new Set(); + + object_loop: for (const object of objects) { + const doesMatch: boolean = checkIfMatchesFilter( + query, + getStringsOfObject, + object + ); + if (doesMatch) matches.add(object); + } + + return matches; +} + +export function checkIfMatchesFilter( + query: string, + getStringsOfObject: (object: T) => string[], + object: T +): boolean { + if (query == "") return true; + + const stringsInObject: string[] = getStringsOfObject(object); + const wordsInObject: string[] = []; + for (const string of stringsInObject) { + const lowercaseWordsInString = string.toLocaleLowerCase().split(" "); + wordsInObject.push(...lowercaseWordsInString); + } + + const lowercaseWordsInQuery = query.toLowerCase().split(" "); + for (const queryWord of lowercaseWordsInQuery) { + if (queryWord[0] == "-") { + // exclusion + const wordContent = queryWord.substring(1); + if (wordsInObject.includes(wordContent)) { + return false; + } + } else { + if (wordsInObject.includes(queryWord) == false) { + return false; + } + } + } + + return true; +} + +// handlers +export type Handler = (item: T) => void; + +export class HandlerManager { + handlers: Set> = new Set(); + + // manage + addHandler = (handler: Handler): void => { + this.handlers.add(handler); + }; + + deleteHandler = (handler: Handler): void => { + this.handlers.delete(handler); + }; + + // trigger + trigger = (item: T): void => { + for (const handler of this.handlers) { + handler(item); + } + }; +} + // sorting export class IndexManager { private itemToString: (item: T) => string;