package com.puppetlabs.puppetdb.javaclient.query; import java.util.List; import java.util.Map; /** * Amends a query expression with instructions to order the result in accorance with a list * of {@link OrderByField} instances. * * @param <T> */ public class OrderBy<T> implements Parameters<T> { /** * Describes a field that can be used for ordering in either ascending * or descending mode. * * @param <T> */ public static class OrderByField<T> { private final Field<T> field; private final boolean descending; OrderByField(Field<T> field, boolean descending) { this.field = field; this.descending = descending; } void toJSON(StringBuilder result) { result.append("{\"field\":"); field.toJSON(result); if(descending) result.append(",\"order\": \"desc\""); result.append('}'); } } private final Expression<T> query; private final List<OrderByField<T>> fields; OrderBy(Expression<T> query, List<OrderByField<T>> fields) { this.query = query; this.fields = fields; } @Override public void appendTo(Map<String, String> queryParams) { if(query != null) query.appendTo(queryParams); if(fields != null && fields.size() > 0) queryParams.put("order-by", toString()); } public void toJSON(StringBuilder result) { result.append('['); int top = fields.size(); for(int idx = 0; idx < top; ++idx) { if(idx > 0) result.append(','); fields.get(idx).toJSON(result); } result.append(']'); } @Override public String toString() { StringBuilder bld = new StringBuilder(); toJSON(bld); return bld.toString(); } }