X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/bcca5d91296f24e10fdf842cda26a32f6f910ef4..180c2c37b635cbb7a33257d2ee9b4395553ce5e7:/src/common/api/filter-builder.ts?ds=sidebyside diff --git a/src/common/api/filter-builder.ts b/src/common/api/filter-builder.ts index cc31f384..28ad060f 100644 --- a/src/common/api/filter-builder.ts +++ b/src/common/api/filter-builder.ts @@ -3,43 +3,61 @@ // SPDX-License-Identifier: AGPL-3.0 import * as _ from "lodash"; -import { Resource } from "./common-resource-service"; +import { Resource } from "../../models/resource"; -export default class FilterBuilder { - private filters = ""; - - static create() { - return new FilterBuilder(); +export class FilterBuilder { + static create(resourcePrefix = "") { + return new FilterBuilder(resourcePrefix); } - private addCondition(field: keyof T, cond: string, value?: string | string[], prefix: string = "", postfix: string = "") { - if (value) { - value = typeof value === "string" - ? `"${prefix}${value}${postfix}"` - : `["${value.join(`","`)}"]`; - - this.filters += `["${_.snakeCase(field.toString())}","${cond}",${value}]`; - } - return this; - } + constructor( + private resourcePrefix = "", + private filters = "") { } public addEqual(field: keyof T, value?: string) { return this.addCondition(field, "=", value); } public addLike(field: keyof T, value?: string) { - return this.addCondition(field, "like", value, "", "%"); + return this.addCondition(field, "like", value, "%", "%"); } public addILike(field: keyof T, value?: string) { - return this.addCondition(field, "ilike", value, "", "%"); + return this.addCondition(field, "ilike", value, "%", "%"); } public addIsA(field: keyof T, value?: string | string[]) { return this.addCondition(field, "is_a", value); } - public get() { + public addIn(field: keyof T, value?: string | string[]) { + return this.addCondition(field, "in", value); + } + + public concat(filterBuilder: FilterBuilder) { + return new FilterBuilder(this.resourcePrefix, this.filters + (this.filters && filterBuilder.filters ? "," : "") + filterBuilder.getFilters()); + } + + public getFilters() { + return this.filters; + } + + public serialize() { return "[" + this.filters + "]"; } + + private addCondition(field: keyof T, cond: string, value?: string | string[], prefix: string = "", postfix: string = "") { + if (value) { + value = typeof value === "string" + ? `"${prefix}${value}${postfix}"` + : `["${value.join(`","`)}"]`; + + const resourcePrefix = this.resourcePrefix + ? _.snakeCase(this.resourcePrefix) + "." + : ""; + + this.filters += `${this.filters ? "," : ""}["${resourcePrefix}${_.snakeCase(field.toString())}","${cond}",${value}]`; + } + return this; + } }