SABSSlidingScaleRepositoryImpl.java

/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
package com.tradecloud.repository.sabs;

import com.tradecloud.domain.base.utils.ObjectUtil;
import com.tradecloud.domain.sabs.SABSSlidingScale;
import com.tradecloud.domain.sabs.SABSSlidingScaleSearch;
import com.tradecloud.repository.SearchMetaParams;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import com.tradecloud.repository.impl.ConsignmentRepositoryImpl;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
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.List;

/**
 * Implement SABSSlidingScale search functionality.
 */
@Repository(value = "sabsSlidingScaleRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class SABSSlidingScaleRepositoryImpl extends RepositoryBaseImpl<SABSSlidingScale, SABSSlidingScaleSearch>
        implements SABSSlidingScaleRepository {

    private static Logger log = Logger.getLogger(ConsignmentRepositoryImpl.class);

    private static final long serialVersionUID = 1L;

    private final static String DESCRIPTION = "sabsSlidingScaleDescription";
    private final static String EFFECTIVE_DATE = "effectiveDate";
    private final static String CREATED = "created";

    @Override
    public SABSSlidingScale findById(long id) {
        List<SABSSlidingScale> sabsSlidingScales = (List<SABSSlidingScale>) findByNamedQueryAndNamedParam("findSABSSlidingScaleById",
                "id", id);
        return ObjectUtil.first(sabsSlidingScales);
    }

    @Override
    public List<SABSSlidingScale> search(SABSSlidingScaleSearch search) {
        log.debug("Search. " + search);
        DetachedCriteria searchCriteria = DetachedCriteria.forClass(getPersistentClass(), "sabsslidingscale");

        if (search.getDescription() != null) {
            searchCriteria.add(Restrictions.like(DESCRIPTION, search.getDescription()));
        }

        if (search.getCurrency() != null) {
            // search the currency of the child Orders
            // inner join with orders
            searchCriteria.createAlias("consignment.orders", "orders");
            searchCriteria.add(Restrictions.eq("orders.currency", search.getCurrency()));
            // ensure distinct results, no duplicates when joining to Orders
            // table that can have multiple results for each Consignment
            //searchCriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        }

        if (search.getEffectiveDateFrom() != null && search.getEffectiveDateTo() != null) {
            searchCriteria.add(Restrictions.between(EFFECTIVE_DATE, search.getEffectiveDateFrom(),
                    search.getEffectiveDateTo()));
        }

        searchCriteria.addOrder(Order.desc(CREATED));

        // ensure distinct results, no duplicates when joining to Orders
        // table that can have multiple results for each Consignment
        searchCriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

        SearchMetaParams metaParams = new SearchMetaParams(0, 10, CREATED, false);
        search.setSearchMetaParams(metaParams);
        List<SABSSlidingScale> consignmentList = getExecutableCriteriaList(searchCriteria, search.getSearchMetaParams());
        return consignmentList;
    }

    @Override
    public SABSSlidingScale findByDescription(String sabsSlidingScaleDescription) {

        Criteria searchCriteria = getSessionCustom().createCriteria(SABSSlidingScale.class);
        searchCriteria.add(Restrictions.like(DESCRIPTION, sabsSlidingScaleDescription));
        return (SABSSlidingScale) searchCriteria.uniqueResult();
    }

    /**
     * Method performs a full search (no duplicates) without page filtering/pagination, ie: row count or index start.
     *
     * @param search
     * @return
     */
    public List<SABSSlidingScale> fullSearch(SABSSlidingScaleSearch search) {
        log.debug("Search. " + search);
        DetachedCriteria searchCriteria = DetachedCriteria.forClass(getPersistentClass(), "consignment");

        if (search.getDescription() != null) {
            searchCriteria.add(Restrictions.like(DESCRIPTION, search.getDescription()));
        }

        if (search.getCurrency() != null) {
            // search the currency of the child Orders
            // inner join with orders
            searchCriteria.createAlias("consignment.orders", "orders");
            searchCriteria.add(Restrictions.eq("orders.currency", search.getCurrency()));
        }

        if (search.getEffectiveDateFrom() != null && search.getEffectiveDateTo() != null) {
            searchCriteria.add(Restrictions.between(EFFECTIVE_DATE, search.getEffectiveDateFrom(),
                    search.getEffectiveDateTo()));
        }

        searchCriteria.addOrder(Order.desc(CREATED));

        // ensure distinct results, no duplicates when joining to Orders
        // table that can have multiple results for each Consignment
        // below line of code has been moved from currency search block to ensure unique results
        searchCriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

        return getExecutableCriteriaList(searchCriteria, null);
    }
}