From 7e323d0c3e6734e6ca698c6bffcb9c24ef5acd13 Mon Sep 17 00:00:00 2001 From: Daniel Kos Date: Fri, 30 Nov 2018 01:02:01 +0100 Subject: [PATCH] Add exist filter Feature #14280 Arvados-DCO-1.1-Signed-off-by: Daniel Kos --- src/services/api/filter-builder.ts | 8 +++++++- src/store/search-bar/search-bar-actions.ts | 10 +++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/services/api/filter-builder.ts b/src/services/api/filter-builder.ts index 1ebf4886..08746c81 100644 --- a/src/services/api/filter-builder.ts +++ b/src/services/api/filter-builder.ts @@ -51,6 +51,10 @@ export class FilterBuilder { return this.addCondition(field, "<=", value, "", "", resourcePrefix); } + public addExists(value?: string, resourcePrefix?: string) { + return this.addCondition("properties", "exists", value, "", "", resourcePrefix); + } + public getFilters() { return this.filters; } @@ -69,7 +73,9 @@ export class FilterBuilder { ? resourcePrefix + "." : ""; - this.filters += `${this.filters ? "," : ""}["${resPrefix}${_.snakeCase(field)}","${cond}",${value}]`; + const fld = field.indexOf('properties.') < 0 ? _.snakeCase(field) : field; + + this.filters += `${this.filters ? "," : ""}["${resPrefix}${fld}","${cond}",${value}]`; } return this; } diff --git a/src/store/search-bar/search-bar-actions.ts b/src/store/search-bar/search-bar-actions.ts index f5d83579..3d1b4ee9 100644 --- a/src/store/search-bar/search-bar-actions.ts +++ b/src/store/search-bar/search-bar-actions.ts @@ -353,7 +353,7 @@ export const parseSearchQuery: (query: string) => ParseSearchQuery = (searchValu const getFirstProp = (sq: ParseSearchQuery, name: string) => sq.properties[name] && sq.properties[name][0]; const getPropValue = (sq: ParseSearchQuery, name: string, value: string) => sq.properties[name] && sq.properties[name].find((v: string) => v === value); -const getProperties = (sq: ParseSearchQuery) => { +const getProperties = (sq: ParseSearchQuery): PropertyValues[] => { if (sq.properties.has) { return sq.properties.has.map((value: string) => { const v = value.split(':'); @@ -439,9 +439,13 @@ export const getFilters = (filterName: string, searchValue: string): string => { if (dateTo) { filter.addLte('modified_at', buildDateFilter(dateTo)); } - } - // TODO: has props + const props = getProperties(sq); + props.forEach(p => { + // filter.addILike(`properties.${p.key}`, p.value); + filter.addExists(p.key); + }); + } return filter .addEqual('groupClass', GroupClass.PROJECT, GroupContentsResourcePrefix.PROJECT) -- 2.30.2