package org.molgenis.data;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
public class Sort implements Iterable<Sort.Order>
{
private final List<Order> orders;
public Sort()
{
this(new ArrayList<>());
}
public Sort(String attr)
{
this(attr, Direction.ASC);
}
public Sort(String attr, Direction direction)
{
this(Collections.singletonList(new Sort.Order(attr, direction)));
}
public Sort(List<Sort.Order> orders)
{
this.orders = orders != null ? new ArrayList<>(orders) : new ArrayList<>();
}
@Override
public Iterator<Order> iterator()
{
return orders.iterator();
}
public Sort on(String attr)
{
return on(attr, Direction.ASC);
}
public Sort on(String attr, Direction direction)
{
orders.add(new Order(attr, direction));
return this;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((orders == null) ? 0 : orders.hashCode());
return result;
}
@Override
public boolean equals(Object obj)
{
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
Sort other = (Sort) obj;
if (orders == null)
{
if (other.orders != null) return false;
}
else if (!orders.equals(other.orders)) return false;
return true;
}
@Override
public String toString()
{
return "Sort [orders=" + orders + "]";
}
public static Sort parse(String orderByStr)
{
Sort sort = new Sort();
for (String sortClauseStr : StringUtils.split(orderByStr, ';'))
{
String[] tokens = StringUtils.split(sortClauseStr, ',');
if (tokens.length == 1)
{
sort.on(tokens[0]);
}
else
{
sort.on(tokens[0], Direction.valueOf(tokens[1]));
}
}
return sort;
}
public String toSortString()
{
return orders.stream().map(order -> order.getAttr() + ',' + order.getDirection().toString())
.collect(Collectors.joining(";"));
}
public static class Order
{
private final String attr;
private final Direction direction;
public Order(String attr)
{
this(attr, Direction.ASC);
}
public Order(String attr, Direction direction)
{
this.attr = attr;
this.direction = direction;
}
public String getAttr()
{
return attr;
}
public Direction getDirection()
{
return direction;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((attr == null) ? 0 : attr.hashCode());
result = prime * result + ((direction == null) ? 0 : direction.hashCode());
return result;
}
@Override
public boolean equals(Object obj)
{
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
Order other = (Order) obj;
if (attr == null)
{
if (other.attr != null) return false;
}
else if (!attr.equals(other.attr)) return false;
return direction == other.direction;
}
@Override
public String toString()
{
return "Order [attr=" + attr + ", direction=" + direction + "]";
}
}
public enum Direction
{
ASC, DESC
}
public boolean hasField(String attributeName)
{
for (Order order : this.orders)
{
if (order.getAttr().equals(attributeName))
{
return true;
}
}
return false;
}
}