From 1d7c296d8a05f0bac07fcc47621ec3a5cb95333a Mon Sep 17 00:00:00 2001 From: Andrey Platov Date: Fri, 1 Oct 2021 15:33:49 +0200 Subject: [PATCH] mongodb `$like` implementation Signed-off-by: Andrey Platov --- packages/core/src/predicate.ts | 4 +--- server/mongo/src/storage.ts | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/packages/core/src/predicate.ts b/packages/core/src/predicate.ts index e9e19b5816..02e445c2cd 100644 --- a/packages/core/src/predicate.ts +++ b/packages/core/src/predicate.ts @@ -19,8 +19,6 @@ import type { Doc } from './classes' type Predicate = (docs: Doc[]) => Doc[] type PredicateFactory = (pred: any, propertyKey: string) => Predicate -const likeSymbol = '%' - const predicates: Record = { $in: (o: any, propertyKey: string): Predicate => { if (!Array.isArray(o)) { @@ -36,7 +34,7 @@ const predicates: Record = { }, $like: (query: string, propertyKey: string): Predicate => { - const searchString = query.split(likeSymbol).join('.*') + const searchString = query.split('%').join('.*') const regex = RegExp(`^${searchString}$`, 'i') return (docs: Doc[]): Doc[] => { const result: Doc[] = [] diff --git a/server/mongo/src/storage.ts b/server/mongo/src/storage.ts index a41ac8e623..54419e98f7 100644 --- a/server/mongo/src/storage.ts +++ b/server/mongo/src/storage.ts @@ -35,8 +35,26 @@ abstract class MongoAdapterBase extends TxProcessor { async init (): Promise {} private translateQuery (clazz: Ref>, query: DocumentQuery): Filter { + const translated: any = {} + for (const key in query) { + const value = (query as any)[key] + if (typeof value === 'object') { + const keys = Object.keys(value) + if (keys[0] === '$like') { + const pattern = value.$like as string + translated[key] = { + $regex: `^${pattern.split('%').join('.*')}$`, + $options: 'i' + } + continue + } + } + translated[key] = value + } const classes = this.hierarchy.getDescendants(clazz) - return Object.assign({}, query, { _class: { $in: classes } }) + translated._class = { $in: classes } + // return Object.assign({}, query, { _class: { $in: classes } }) + return translated } private async lookup (clazz: Ref>, query: DocumentQuery, options: FindOptions): Promise> {