From e68620ddab69983f6bf127d51017bed2f21e0d4a Mon Sep 17 00:00:00 2001 From: Michal Klobukowski Date: Tue, 3 Jul 2018 13:06:09 +0200 Subject: [PATCH] Add immutability and concatenation of order builder Feature #13703 Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski --- src/common/api/order-builder.test.ts | 23 ++++++++++---- src/common/api/order-builder.ts | 45 +++++++++++++++++++++------- 2 files changed, 52 insertions(+), 16 deletions(-) diff --git a/src/common/api/order-builder.test.ts b/src/common/api/order-builder.test.ts index c184ebce..b80756d4 100644 --- a/src/common/api/order-builder.test.ts +++ b/src/common/api/order-builder.test.ts @@ -6,11 +6,22 @@ import OrderBuilder from "./order-builder"; describe("OrderBuilder", () => { it("should build correct order query", () => { - const orderBuilder = new OrderBuilder(); - const order = orderBuilder - .addAsc("name") - .addDesc("modified_at") - .get(); - expect(order).toEqual(["name asc","modified_at desc"]); + const order = OrderBuilder + .create() + .addAsc("kind") + .addDesc("modifiedAt") + .getOrder(); + expect(order).toEqual(["kind asc", "modified_at desc"]); + }); + + it("should combine results with other builder", () => { + const order = OrderBuilder + .create() + .addAsc("kind") + .concat(OrderBuilder + .create("properties") + .addDesc("modifiedAt")) + .getOrder(); + expect(order).toEqual(["kind asc", "properties.modified_at desc"]); }); }); diff --git a/src/common/api/order-builder.ts b/src/common/api/order-builder.ts index cc3eadbb..08d17b18 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; + getOrder() { + return this.order.slice(); } } -- 2.30.2