FinanceRateRepositoryImpl.java
package com.tradecloud.repository.rate.impl;
import com.tradecloud.domain.base.utils.MathUtils;
import com.tradecloud.domain.infrastructure.persistence.CriteriaBuilder;
import com.tradecloud.domain.rate.FinanceRate;
import com.tradecloud.domain.rate.FinanceRateCosting;
import com.tradecloud.dto.rate.FinanceRateSearch;
import com.tradecloud.repository.rate.FinanceRateRepository;
import com.tradecloud.repository.utils.CriteriaBuilder2;
import org.hibernate.criterion.*;
import org.hibernate.transform.AliasToBeanResultTransformer;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
* Created by ds on 2017/01/09.
*/
@Repository(value = "financeRateRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class FinanceRateRepositoryImpl extends BaseRateRepository<FinanceRate, FinanceRateSearch> implements FinanceRateRepository {
@Override
public List<FinanceRate> searchByClosestEffectiveDate(FinanceRateSearch search) {
DetachedCriteria criteria = buildBaseCriteria(search);
CriteriaBuilder.addDateLessOrEqualRangeCriteria(criteria, "effectiveDate", search.getEffectiveDateLower());
criteria.addOrder(Order.desc("effectiveDate"));
List<FinanceRate> results = getExecutableCriteriaList(criteria, null);
if (results.size() > 1) {
List<FinanceRate> list = new ArrayList<FinanceRate>();
list.add(results.get(0));
return list;
}
return results;
}
@Override
public FinanceRate searchByOrderOfPriority(FinanceRateSearch search) {
DetachedCriteria criteria = DetachedCriteria.forClass(FinanceRate.class);
return searchByOrderOfPriority(search, criteria);
}
@Override
public FinanceRate searchByOrderOfPriorityCosting(FinanceRateSearch search) {
DetachedCriteria criteria = DetachedCriteria.forClass(FinanceRate.class);
setCostingProjections(criteria);
return searchByOrderOfPriority(search, criteria);
}
//DO not return heavy objects here, if you must then return id or list of ids.
private void setCostingProjections(DetachedCriteria criteria) {
ProjectionList projections = costingProjectionsCommon()
.add(Projections.property("maximum"), "maximum")
.add(Projections.property("minimum"), "minimum");
criteria.setProjection(projections);
criteria.setResultTransformer(new AliasToBeanResultTransformer(FinanceRateCosting.class));
}
private FinanceRate searchByOrderOfPriority(FinanceRateSearch search, DetachedCriteria criteria) {
if (search.getCostLine() == null) {
throw new RuntimeException("Rate search must contain CostLine");
}
// CriteriaBuilder.addEqRestriction(criteria, "rateState", RateState.ACTIVE);
CriteriaBuilder.addEqRestriction(criteria, "costLine", search.getCostLine());
CriteriaBuilder.addEqRestriction(criteria, "costingType", search.getCostingType());
CriteriaBuilder.addDateLessOrEqualRangeCriteria(criteria, "effectiveDate", search.getEffectiveDateLower());
CriteriaBuilder.addDisjunction(criteria, "paymentMethod", search.getPaymentMethod());
CriteriaBuilder.addDisjunction(criteria, "paymentTerm", search.getPaymentTerm());
CriteriaBuilder.addDisjunctionIn(criteria, "organisationalUnit", findApplicableOrgs(search));
CriteriaBuilder.addEqRestriction(criteria, "itemCategory", search.getItemCategory());
setRateUnitAndCurrency(search, criteria);
// setMinMax(search, criteria);
DetachedCriteria tierCriteria = null;
CriteriaBuilder2.addRateOrderOfPriority(criteria, search, null, tierCriteria);
List<FinanceRate> results = criteria.getExecutableCriteria(getSessionCustom()).list();
return results.size() == 0 ? null : results.get(0);
}
private DetachedCriteria buildBaseCriteria(FinanceRateSearch search) {
DetachedCriteria criteria = DetachedCriteria.forClass(FinanceRate.class);
if (search.isSpecificSearch()) {
CriteriaBuilder.addExactMatch(criteria, "organisationalUnit", search.getOrganisationalUnit());
CriteriaBuilder.addExactMatch(criteria, "paymentMethod", search.getPaymentMethod());
CriteriaBuilder.addExactMatch(criteria, "paymentTerm", search.getPaymentTerm());
CriteriaBuilder.addExactMatch(criteria, "costLine", search.getCostLine());
CriteriaBuilder.addExactMatch(criteria, "costingType", search.getCostingType());
CriteriaBuilder.addExactMatch(criteria, "currency", search.getCurrency());
CriteriaBuilder.addExactMatch(criteria, "rateUnit", search.getRateUnit());
CriteriaBuilder.addExactMatch(criteria, "itemCategory", search.getItemCategory());
} else {
CriteriaBuilder.addEqRestriction(criteria, "organisationalUnit", search.getOrganisationalUnit());
CriteriaBuilder.addEqRestriction(criteria, "paymentMethod", search.getPaymentMethod());
CriteriaBuilder.addEqRestriction(criteria, "paymentTerm", search.getPaymentTerm());
CriteriaBuilder.addEqRestriction(criteria, "costLine", search.getCostLine());
CriteriaBuilder.addEqRestriction(criteria, "costingType", search.getCostingType());
CriteriaBuilder.addEqRestriction(criteria, "currency", search.getCurrency());
CriteriaBuilder.addEqRestriction(criteria, "rateUnit", search.getRateUnit());
CriteriaBuilder.addEqRestriction(criteria, "itemCategory", search.getItemCategory());
}
//setMinMax(search, criteria);
// buildStateSearch(search, criteria);
return criteria;
}
private void setMinMax(FinanceRateSearch search, DetachedCriteria criteria) {
if (search.getMinimum() != null && !MathUtils.isZero(search.getMaximum())) {
criteria.add(Restrictions.disjunction().add(Restrictions.isNull("minimum")).add(Restrictions.le("minimum", search.getMinimum())));
criteria.add(Restrictions.disjunction().add(Restrictions.isNull("maximum")).add(Restrictions.ge("maximum", search.getMaximum())));
}
}
@Override
public List<FinanceRate> search(FinanceRateSearch search) {
DetachedCriteria criteria = buildBaseCriteria(search);
CriteriaBuilder.addDateGreaterOrEqualRangeCriteria(criteria, "effectiveDate", search.getEffectiveDateLower());
CriteriaBuilder.addDateLessOrEqualRangeCriteria(criteria, "effectiveDate", search.getEffectiveDateUpper());
criteria.addOrder(Order.desc("costLine")).addOrder(Order.desc("effectiveDate")).addOrder(Order.asc("id"));
return getExecutableCriteriaList(criteria, search.getSearchMetaParams());
}
@Override
public long count(FinanceRateSearch search) {
DetachedCriteria criteria = buildBaseCriteria(search);
CriteriaBuilder.addDateGreaterOrEqualRangeCriteria(criteria, "effectiveDate", search.getEffectiveDateLower());
CriteriaBuilder.addDateLessOrEqualRangeCriteria(criteria, "effectiveDate", search.getEffectiveDateUpper());
return getExecutableCriteriaCount(criteria);
}
@Override
public void save(FinanceRate financeRate) {
super.save(financeRate);
}
}