ClearingRateRepositoryImpl.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.ClearingRate;
import com.tradecloud.domain.rate.ClearingRateCosting;
import com.tradecloud.dto.rate.ClearingRateSearch;
import com.tradecloud.repository.rate.ClearingRateRepository;
import com.tradecloud.repository.utils.CriteriaBuilder2;
import org.hibernate.criterion.*;
import org.hibernate.transform.AliasToBeanResultTransformer;
import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.List;
@Repository(value = "clearingRateRepository")
public class ClearingRateRepositoryImpl extends BaseRateRepository<ClearingRate, ClearingRateSearch> implements ClearingRateRepository {
private DetachedCriteria buildBaseCriteria(ClearingRateSearch search) {
DetachedCriteria criteria = DetachedCriteria.forClass(ClearingRate.class);
if (search.isSpecificSearch()) {
CriteriaBuilder.addExactMatch(criteria, "costLine", search.getCostLine());
CriteriaBuilder.addExactMatch(criteria, "shippingMode", search.getShippingMode());
CriteriaBuilder.addExactMatch(criteria, "multiModalShippingMode", search.getMultiModalShippingMode());
CriteriaBuilder.addExactMatch(criteria, "containerType", search.getContainerType());
CriteriaBuilder.addExactMatch(criteria, "placeOfDischarge", search.getPlaceOfDischarge());
CriteriaBuilder.addExactMatch(criteria, "transporter", search.getTransporter());
CriteriaBuilder.addExactMatch(criteria, "organisationalUnit", search.getOrganisationalUnit());
CriteriaBuilder.addExactMatch(criteria, "clearingDepot", search.getClearingDepot());
CriteriaBuilder.addExactMatch(criteria, "clearingAgent", search.getClearingAgent());
CriteriaBuilder.addExactMatch(criteria, "finalDestination", search.getFinalDestination());
CriteriaBuilder.addExactMatch(criteria, "freightForwarder", search.getFreightForwarder());
CriteriaBuilder.addExactMatch(criteria, "carrier", search.getCarrier());
CriteriaBuilder.addExactMatch(criteria, "costingType", search.getCostingType());
CriteriaBuilder.addExactMatch(criteria, "currency", search.getCurrency());
} else {
CriteriaBuilder.addEqRestriction(criteria, "costLine", search.getCostLine());
CriteriaBuilder.addEqRestriction(criteria, "shippingMode", search.getShippingMode());
CriteriaBuilder.addEqRestriction(criteria, "multiModalShippingMode", search.getMultiModalShippingMode());
CriteriaBuilder.addEqRestriction(criteria, "containerType", search.getContainerType());
CriteriaBuilder.addEqRestriction(criteria, "placeOfDischarge", search.getPlaceOfDischarge());
CriteriaBuilder.addEqRestriction(criteria, "transporter", search.getTransporter());
CriteriaBuilder.addEqRestriction(criteria, "organisationalUnit", search.getOrganisationalUnit());
CriteriaBuilder.addEqRestriction(criteria, "clearingDepot", search.getClearingDepot());
CriteriaBuilder.addEqRestriction(criteria, "clearingAgent", search.getClearingAgent());
CriteriaBuilder.addEqRestriction(criteria, "finalDestination", search.getFinalDestination());
CriteriaBuilder.addEqRestriction(criteria, "freightForwarder", search.getFreightForwarder());
CriteriaBuilder.addEqRestriction(criteria, "carrier", search.getCarrier());
CriteriaBuilder.addEqRestriction(criteria, "costingType", search.getCostingType());
CriteriaBuilder.addEqRestriction(criteria, "currency", search.getCurrency());
}
CriteriaBuilder.addEqRestriction(criteria, "costCompareOnly", search.isCostCompareOnly());
if (search.getWeight() != null && !MathUtils.isZero(search.getWeight())) {
criteria.add(Restrictions.disjunction().add(Restrictions.isNull("weightFrom")).add(Restrictions.le("weightFrom", search.getWeight())));
criteria.add(Restrictions.disjunction().add(Restrictions.isNull("weightTo")).add(Restrictions.ge("weightTo", search.getWeight())));
}
return criteria;
}
@Override
public List<ClearingRate> search(ClearingRateSearch search) {
DetachedCriteria criteria = buildBaseCriteria(search);
CriteriaBuilder.addDateGreaterOrEqualRangeCriteria(criteria, "effectiveDate", search.getEffectiveDateLower());
CriteriaBuilder.addDateLessOrEqualRangeCriteria(criteria, "effectiveDate", search.getEffectiveDateUpper());
//criteria.addOrder(Order.desc("updated"));
//criteria.addOrder(Order.desc("costLine")).addOrder(Order.desc("effectiveDate"));
criteria.addOrder(Order.desc("costLine")).addOrder(Order.desc("effectiveDate")).addOrder(Order.asc("id"));
//List<ClearingRate> results = criteria.getExecutableCriteria(getSessionFlushMode()).list();
//List<ClearingRate> results = getExecutableCriteriaList(criteria, null);
//return results;
return getExecutableCriteriaList(criteria, search.getSearchMetaParams());
}
@Override
public long count(ClearingRateSearch search) {
DetachedCriteria criteria = buildBaseCriteria(search);
CriteriaBuilder.addDateGreaterOrEqualRangeCriteria(criteria, "effectiveDate", search.getEffectiveDateLower());
CriteriaBuilder.addDateLessOrEqualRangeCriteria(criteria, "effectiveDate", search.getEffectiveDateUpper());
return getExecutableCriteriaCount(criteria);
}
@Override
public List<ClearingRate> searchByClosestEffectiveDate(ClearingRateSearch search) {
DetachedCriteria criteria = DetachedCriteria.forClass(ClearingRate.class);
CriteriaBuilder.addEqRestriction(criteria, "costLine", search.getCostLine());
CriteriaBuilder.addEqRestriction(criteria, "shippingMode", search.getShippingMode());
CriteriaBuilder.addEqRestriction(criteria, "multiModalShippingMode", search.getMultiModalShippingMode());
CriteriaBuilder.addDisjunction(criteria, "containerType", search.getContainerType());
CriteriaBuilder.addDisjunction(criteria, "placeOfDischarge", search.getPlaceOfDischarge());
CriteriaBuilder.addDisjunction(criteria, "transporter", search.getTransporter());
// CriteriaBuilder.addDisjunction(criteria, "organisationalUnit", search.getOrganisationalUnit());
CriteriaBuilder.addDisjunctionIn(criteria, "organisationalUnit", findApplicableOrgs(search));
CriteriaBuilder.addDisjunction(criteria, "clearingDepot", search.getClearingDepot());
CriteriaBuilder.addDisjunction(criteria, "clearingAgent", search.getClearingAgent());
CriteriaBuilder.addDisjunction(criteria, "finalDestination", search.getFinalDestination());
CriteriaBuilder.addDisjunction(criteria, "freightForwarder", search.getFreightForwarder());
CriteriaBuilder.addDisjunction(criteria, "carrier", search.getCarrier());
CriteriaBuilder.addDisjunction(criteria, "rateUnit", search.getRateUnit());
CriteriaBuilder.addEqRestriction(criteria, "costCompareOnly", search.isCostCompareOnly());
setRateUnitAndCurrency(search, criteria);
CriteriaBuilder.addDateLessOrEqualRangeCriteria(criteria, "effectiveDate", search.getEffectiveDateLower());
if(search.getFinalDestination() != null) {
criteria.addOrder(org.hibernate.criterion.Order.asc("finalDestination"));
}
criteria.addOrder(org.hibernate.criterion.Order.desc("effectiveDate"));
List<ClearingRate> results = criteria.getExecutableCriteria(getSessionCustom()).list();
if (results.size() > 1) {
List<ClearingRate> list = new ArrayList<ClearingRate>();
list.add(results.get(0));
return list;
}
return results;
}
@Override
public void save(ClearingRate clearingRate) {
super.save(clearingRate);
}
@Override
public ClearingRate searchByOrderOfPriority(ClearingRateSearch search) {
DetachedCriteria criteria = DetachedCriteria.forClass(ClearingRate.class);
return searchByOrderOfPriority(search, criteria);
}
@Override
public ClearingRate searchByOrderOfPriorityCosting(ClearingRateSearch search) {
DetachedCriteria criteria = DetachedCriteria.forClass(ClearingRate.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("maxValue"), "maxValue")
.add(Projections.property("minValue"), "minValue")
.add(Projections.property("weightFrom"), "weightFrom")
.add(Projections.property("weightTo"), "weightTo");
criteria.setProjection(projections);
criteria.setResultTransformer(new AliasToBeanResultTransformer(ClearingRateCosting.class));
}
private ClearingRate searchByOrderOfPriority(ClearingRateSearch search, DetachedCriteria criteria) {
if (search.getCostLine() == null) {
throw new RuntimeException("Rate search must contain CostLine");
}
CriteriaBuilder.addEqRestriction(criteria, "costLine", search.getCostLine());
CriteriaBuilder.addEqRestriction(criteria, "shippingMode", search.getShippingMode());
CriteriaBuilder.addDisjunction(criteria, "multiModalShippingMode", search.getMultiModalShippingMode());
CriteriaBuilder.addEqRestriction(criteria, "costingType", search.getCostingType());
CriteriaBuilder.addEqRestriction(criteria, "costCompareOnly", search.isCostCompareOnly());
CriteriaBuilder.addDisjunction(criteria, "containerType", search.getContainerType());
CriteriaBuilder.addDisjunction(criteria, "clearingDepot", search.getClearingDepot());
CriteriaBuilder.addDisjunction(criteria, "placeOfDischarge", search.getPlaceOfDischarge());
CriteriaBuilder.addDisjunction(criteria, "clearingAgent", search.getClearingAgent());
CriteriaBuilder.addDisjunction(criteria, "transporter", search.getTransporter());
CriteriaBuilder.addDisjunctionIn(criteria, "organisationalUnit", findApplicableOrgs(search));
CriteriaBuilder.addDisjunction(criteria, "finalDestination", search.getFinalDestination());
CriteriaBuilder.addDisjunction(criteria, "freightForwarder", search.getFreightForwarder());
CriteriaBuilder.addDisjunction(criteria, "carrier", search.getCarrier());
setRateUnitAndCurrency(search, criteria);
DetachedCriteria tierCriteria = findOrgTierCriteria(search, criteria);
CriteriaBuilder2.addRateOrderOfPriority(criteria, search, new String[]{"shippingMode"}, tierCriteria);
if (search.getMultiModalShippingMode() != null)
CriteriaBuilder2.addRateOrderOfPriority(criteria, search, new String[]{"multiModalShippingMode"}, null);
CriteriaBuilder.addDateLessOrEqualRangeCriteria(criteria, "effectiveDate", search.getEffectiveDateLower());
if (search.getWeight() != null && !MathUtils.isZero(search.getWeight())) {
criteria.add(Restrictions.disjunction().add(Restrictions.isNull("weightFrom")).add(Restrictions.le("weightFrom", search.getWeight())));
criteria.add(Restrictions.disjunction().add(Restrictions.isNull("weightTo")).add(Restrictions.ge("weightTo", search.getWeight())));
}
List<ClearingRate> results = criteria.getExecutableCriteria(getSession()).list();
return results.size() == 0 ? null : results.get(0);
}
}