EventUserAccountSaldoPredicate.java 1.73 KB
package fi.insomnia.bortal.facade.callbacks;

import java.math.BigDecimal;
import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;

import fi.insomnia.bortal.enums.DatabaseValueCompare;
import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.AccountEvent_;
import fi.insomnia.bortal.model.EventUser;

public class EventUserAccountSaldoPredicate implements FacadeCallback<EventUser> {
	private final DatabaseValueCompare compare;

	private final BigDecimal saldo;

	public EventUserAccountSaldoPredicate(BigDecimal accountSaldo, DatabaseValueCompare accountSaldoCompare) {
		saldo = accountSaldo;
		compare = accountSaldoCompare;
	}

	@Override
	public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, From<?, EventUser> root, List<Predicate> predicates) {
		Subquery<BigDecimal> subq = cq.subquery(BigDecimal.class);
		Root<AccountEvent> acRoot = subq.from(AccountEvent.class);
		subq.where(cb.equal(acRoot.get(AccountEvent_.user), root));

		subq.select(cb.sum(cb.prod(acRoot.get(AccountEvent_.unitPrice), acRoot.get(AccountEvent_.quantity))));

		Predicate pred = null;
		switch (compare) {
		case EQ:
			pred = cb.equal(subq, saldo);
			break;
		case GE:
			pred = cb.ge(subq, saldo);
			break;
		case GT:
			pred = cb.gt(subq, saldo);
			break;
		case LE:
			pred = cb.le(subq, saldo);
			break;
		case LT:
			pred = cb.lt(subq, saldo);
			break;
		case NE:
			pred = cb.notEqual(subq, saldo);
			break;
		case NONE:
		default:
			break;

		}
		if (pred != null)
		{
			predicates.add(pred);
		}

	}
}