package org.radargun.stages.query;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
/**
* @author Radim Vansa <rvansa@redhat.com>
*/
public class OrderBy {
public final String attribute;
public final boolean asc;
public OrderBy(String attribute, boolean asc) {
this.attribute = attribute;
this.asc = asc;
}
public static class ListConverter implements org.radargun.config.Converter<List<OrderBy>> {
@Override
public List<OrderBy> convert(String string, Type type) {
String[] parts = string.split(",", 0);
ArrayList<OrderBy> result = new ArrayList<OrderBy>(parts.length);
for (String part : parts) {
int colon = part.indexOf(':');
if (colon < 0) {
result.add(new OrderBy(part.trim(), true));
} else {
String order = part.substring(colon + 1).trim();
boolean asc;
if (order.equalsIgnoreCase("ASC")) {
asc = true;
} else if (order.equalsIgnoreCase("DESC")) {
asc = false;
} else {
throw new IllegalArgumentException("Sort order: " + order);
}
result.add(new OrderBy(part.substring(0, colon).trim(), asc));
}
}
return result;
}
@Override
public String convertToString(List<OrderBy> value) {
if (value == null) return "<unordered>";
StringBuilder sb = new StringBuilder();
for (OrderBy e : value) {
sb.append(e.attribute).append(':').append(e.asc ? "ASC" : "DESC").append(", ");
}
return sb.substring(0, sb.length() - 2);
}
@Override
public String allowedPattern(Type type) {
return "[0-9a-zA-Z_]*(:ASC|:DESC)?(,\\s*[0-9a-zA-Z_]*(:ASC|:DESC)?)*";
}
}
}