package jpasearch.repository.query.builder;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;
import javax.persistence.metamodel.PluralAttribute;
import javax.persistence.metamodel.SingularAttribute;
import jpasearch.repository.query.OrderBy;
import jpasearch.repository.query.OrderByDirection;
import jpasearch.repository.query.Path;
/**
* @author speralta
*/
public class OrdersByBuilder<FROM> extends AbstractBuilder<SearchBuilder<FROM>> {
private final Set<OrderBy<FROM, ?>> orders;
public OrdersByBuilder(SearchBuilder<FROM> searchParameters) {
super(searchParameters);
orders = new LinkedHashSet<>();
}
public OrdersByBuilder(SearchBuilder<FROM> searchParameters, Set<OrderBy<FROM, ?>> orders) {
super(searchParameters);
this.orders = new LinkedHashSet<>(orders);
}
public <TO> OrderByBuilder<FROM, FROM, TO> by(SingularAttribute<? super FROM, TO> attribute) {
return new OrderByBuilder<>(this, attribute);
}
public <TO> OrderByBuilder<FROM, FROM, TO> by(PluralAttribute<? super FROM, ?, TO> attribute) {
return new OrderByBuilder<>(this, attribute);
}
public OrdersByBuilder<FROM> orderBy(OrderByDirection direction, String path, Class<FROM> from) {
orders.add(new OrderBy<>(direction, from, path));
return this;
}
public Set<OrderBy<FROM, ?>> getOrders() {
return Collections.unmodifiableSet(orders);
}
<TO> OrdersByBuilder<FROM> asc(Path<FROM, TO> path) {
orders.add(new OrderBy<FROM, TO>(OrderByDirection.ASC, path));
return this;
}
<TO> OrdersByBuilder<FROM> desc(Path<FROM, TO> path) {
orders.add(new OrderBy<FROM, TO>(OrderByDirection.DESC, path));
return this;
}
}