SABSTariffRepositoryImpl.java

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

import java.util.List;

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 com.tradecloud.domain.base.utils.ObjectUtil;
import com.tradecloud.domain.sabs.AbstractSABSTariff;
import com.tradecloud.domain.sabs.SABSTariff;
import com.tradecloud.domain.sabs.SABSTariffSearch;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import com.tradecloud.repository.impl.ConsignmentRepositoryImpl;

/**
 * Implement SABS Tariff search functionality.
 */
@Repository(value = "sabsTariffRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class SABSTariffRepositoryImpl extends RepositoryBaseImpl<SABSTariff, SABSTariffSearch> implements SABSTariffRepository {

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

    private static final long serialVersionUID = 1L;

    private final static String DESCRIPTION = "description";
    private final static String CATEGORY = "category";
    private final static String CODE = "code";
    private final static String EFFECTIVE_DATE = "effectiveDate";
    private final static String CREATED = "created";

    @Override
    public SABSTariff findById(long id) {
        List<SABSTariff> sabsTariffs = (List<SABSTariff>) findByNamedQueryAndNamedParam("findSabsTariffById", "id", id);
        return ObjectUtil.first(sabsTariffs);
    }

    @Override
    public List<SABSTariff> search(SABSTariffSearch search) {
        log.debug("Search. " + search);
        DetachedCriteria searchCriteria = DetachedCriteria.forClass(SABSTariff.class, "sabstariff");

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

        if (search.getCategory() != null) {
            searchCriteria.add(Restrictions.like(CATEGORY, LIKE + search.getCategory() + LIKE));
        }

        if (search.getCode() != null) {
            searchCriteria.add(Restrictions.like(CODE, LIKE + search.getCode() + LIKE));
        }

        if (search.getCurrency() != null) {

        }

        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<SABSTariff> tariffList = getExecutableCriteriaList(searchCriteria, search.getSearchMetaParams());
        return tariffList;
    }

    @Override
    public SABSTariff findByDescription(String sabsTariffDescription) {

        Criteria searchCriteria = getSessionCustom().createCriteria(AbstractSABSTariff.class);
        searchCriteria.add(Restrictions.like(DESCRIPTION, sabsTariffDescription));
        return (SABSTariff) searchCriteria.uniqueResult();
    }

    @Override
    public List<SABSTariff> findEffectiveTariffs() {
        @SuppressWarnings("unchecked")
        List<SABSTariff> results = getSessionCustom().createSQLQuery(
            "select st.* from sabstariff st inner join "
            + "(select code, max(effectivedate) as maxeffectivedate from sabstariff group by code) groupedst "
            + "on st.code = groupedst.code and st.effectivedate = groupedst.maxeffectivedate order by st.code")
                .addEntity(SABSTariff.class).list();
        return results;
    }

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

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

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

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

        if (search.getCurrency() != null) {
        }

        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);
    }
}