From e019db37a2eeee60928dee6f0a1ea7e8f9cb525a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Juli=C3=A1n=20L=C3=B3pez=20Ca=C3=B1a?= Date: Tue, 2 Apr 2019 23:00:42 +0200 Subject: [PATCH] feat(filter): add not operator --- src/field-filter.ts | 10 ++++++++-- src/filter-factory.ts | 5 +++-- src/lookup.enum.ts | 3 ++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/field-filter.ts b/src/field-filter.ts index 919c3ad..32ee055 100644 --- a/src/field-filter.ts +++ b/src/field-filter.ts @@ -1,11 +1,14 @@ import { AbstractFilter } from './filter'; import { LookupFilter } from './lookup.enum'; -import { Like, IsNull, LessThan, LessThanOrEqual, MoreThan, MoreThanOrEqual, In, Between } from 'typeorm'; +import { Like, IsNull, LessThan, LessThanOrEqual, MoreThan, MoreThanOrEqual, In, Between, Not } from 'typeorm'; export class FieldFilter extends AbstractFilter { - constructor(query: any, prop: string, lookup: LookupFilter, value: string) { + private notOperator: boolean; + + constructor(query: any, prop: string, lookup: LookupFilter, value: string, notOperator: boolean = false) { super(query, prop, lookup, value); + this.notOperator = notOperator; } public buildQuery() { @@ -48,6 +51,9 @@ export class FieldFilter extends AbstractFilter { queryToAdd = { [this.prop]: Between(+rangeValues[0], +rangeValues[1]) }; break; } + if(this.notOperator) { + queryToAdd[this.prop] = Not(queryToAdd[this.prop]); + } this.query['where'] = { ...this.query['where'], ...queryToAdd diff --git a/src/filter-factory.ts b/src/filter-factory.ts index 0a3d69c..089ac13 100644 --- a/src/filter-factory.ts +++ b/src/filter-factory.ts @@ -7,10 +7,11 @@ export class FilterFactory { public get(query: any, key: string, value: string): AbstractFilter { if (this.isFieldFilter(key)) { const field = key.split(LookupDelimiter.LOOKUP_DELIMITER)[0]; + const notQuery = key.includes(`${LookupDelimiter.LOOKUP_DELIMITER}${LookupFilter.NOT}`); const lookup = key.includes(LookupDelimiter.LOOKUP_DELIMITER) - ? key.split(LookupDelimiter.LOOKUP_DELIMITER)[1] as LookupFilter + ? key.split(LookupDelimiter.LOOKUP_DELIMITER)[notQuery ? 2 : 1] as LookupFilter : LookupFilter.EXACT; - return new FieldFilter(query, field, lookup, value); + return new FieldFilter(query, field, lookup, value, notQuery); } } diff --git a/src/lookup.enum.ts b/src/lookup.enum.ts index f65b2dc..03ac090 100644 --- a/src/lookup.enum.ts +++ b/src/lookup.enum.ts @@ -9,7 +9,8 @@ export enum LookupFilter { STARTS_WITH = 'startswith', ENDS_WITH = 'endswith', IN = 'in', - BETWEEN = 'between' + BETWEEN = 'between', + NOT = 'not', } export enum LookupDelimiter {