BillOrderPredicate.java 1.79 KB
package fi.codecrew.moya.facade.callbacks.bill;

import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.metamodel.SingularAttribute;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.codecrew.moya.entitysearch.BillSearchQuery;
import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.EventUser_;
import fi.codecrew.moya.model.User;
import fi.codecrew.moya.model.User_;
import fi.codecrew.moya.utilities.SearchQuery.QuerySortOrder;

public class BillOrderPredicate extends GenericBillPredicate {

	private final String sort;
	private QuerySortOrder dir;
	private static final Logger logger = LoggerFactory.getLogger(BillOrderPredicate.class);

	public BillOrderPredicate(BillSearchQuery queryParams) {
		this.sort = queryParams.getSort();
		this.dir = queryParams.getSortDirection();
	}

	@Override
	public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<Bill> root, List<Predicate> predicates, boolean isFullQuery) {
		if (!isFullQuery || dir == null || sort == null) {
			return;
		}

		SingularAttribute<? super Bill, ?> s = BILL_SEARCH_FIELDS.get(sort);

		if (s == null) {
			logger.info("Not found bill sort!: {} dir {}", sort, dir);
			return;
		}

		Path<?> path = root.get(s);

		if (s.getJavaMember().getDeclaringClass().equals(EventUser.class)) {
			path = ((Path<EventUser>) path).get(EventUser_.user).get(User_.login);
		}

		Order order = null;
		switch (dir) {
		case ASCENDING:
			order = cb.asc(path);
			break;
		case DESCENDING:
			order = cb.desc(path);
			break;
		default:
			return;
		}
		cq.orderBy(order);
	}
}