X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d3f17ba544b22ae76f47401041362bbcefe95aaa..a918d09702ac7b1ac111ea12ded1cdb2bd801e88:/src/common/api/order-builder.ts diff --git a/src/common/api/order-builder.ts b/src/common/api/order-builder.ts index 394cce5c56..08d17b18e9 100644 --- a/src/common/api/order-builder.ts +++ b/src/common/api/order-builder.ts @@ -2,21 +2,46 @@ // // SPDX-License-Identifier: AGPL-3.0 +import * as _ from "lodash"; +import { Resource } from "./common-resource-service"; -export default class OrderBuilder { - private order: string[] = []; +export default class OrderBuilder { - addAsc(attribute: string) { - this.order.push(`${attribute} asc`); - return this; + static create(prefix?: string){ + return new OrderBuilder([], prefix); } - addDesc(attribute: string) { - this.order.push(`${attribute} desc`); - return this; + private constructor( + private order: string[] = [], + private prefix = ""){} + + private getRule (direction: string, attribute: keyof T) { + const prefix = this.prefix ? this.prefix + "." : ""; + return `${prefix}${_.snakeCase(attribute.toString())} ${direction}`; + } + + addAsc(attribute: keyof T) { + return new OrderBuilder( + [...this.order, this.getRule("asc", attribute)], + this.prefix + ); + } + + addDesc(attribute: keyof T) { + return new OrderBuilder( + [...this.order, this.getRule("desc", attribute)], + this.prefix + ); + } + + concat(orderBuilder: OrderBuilder){ + return new OrderBuilder( + this.order.concat(orderBuilder.getOrder()), + this.prefix + ); } - get() { - return `["${this.order.join(`","`)}"]`; + getOrder() { + return this.order.slice(); } }