+ 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<T>(
+ [...this.order, this.getRule("asc", attribute)],
+ this.prefix
+ );
+ }
+
+ addDesc(attribute: keyof T) {
+ return new OrderBuilder<T>(
+ [...this.order, this.getRule("desc", attribute)],
+ this.prefix
+ );
+ }
+
+ concat(orderBuilder: OrderBuilder){
+ return new OrderBuilder<T>(
+ this.order.concat(orderBuilder.getOrder()),
+ this.prefix
+ );