RouteRepositoryImpl.java

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

import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Query;
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.place.Route;
import com.tradecloud.dto.place.RouteSearch;
import com.tradecloud.repository.RouteRepository;
import com.tradecloud.repository.base.impl.CriteriaValue;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;

/**
 * Implement SABS Tariff search functionality.
 */
@Repository(value = "routeRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class RouteRepositoryImpl extends RepositoryBaseImpl<Route, RouteSearch>
    implements RouteRepository {

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

    private static final long serialVersionUID = 1L;

    private static final String LIKE = "%";
    private final static String CREATED = "created";
    private final static String SHIPPING_MODE = "shippingMode";
    private final static String PLACE_OF_DISCHARGE = "placeOfDischarge";
    private final static String PLACE_OF_LOADING = "placeOfLoading";
    private final static String DESTINATION_COUNTRY = "placeOfDischarge.country";
    private final static String ORIGIN_COUNTRY = "placeOfLoading.country";
    private final static String ORIGIN_REGION = "placeOfLoading.region";
    private final static String CARRIER = "carrier";

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

    /*
    @Override
    public List<Route> search(RouteSearch search) {
        log.debug("Search. " + search);
        DetachedCriteria searchCriteria = DetachedCriteria.forClass(getPersistentClass(), "route");

        if (search.getShippingMode() != null) {
            searchCriteria.add(Restrictions.eq(SHIPPING_MODE, search.getShippingMode() ));
        }

        if (search.getPlaceOfDischarge() != null) {
            searchCriteria.add(Restrictions.eq(PLACE_OF_DISCHARGE, search.getPlaceOfDischarge()));
        }

        if (search.getPlaceOfLoading() != null) {
            searchCriteria.add(Restrictions.eq(PLACE_OF_LOADING, search.getPlaceOfLoading()));
        }

        if (search.getCarrier() != null) {
            searchCriteria.add(Restrictions.eq(CARRIER, search.getCarrier()));
        }

        if (search.getOriginCountry() != null) {
            searchCriteria.add(Restrictions.eq(ORIGIN_COUNTRY, search.getOriginCountry()));
        }

        if (search.getDestinationCountry() != null) {
            searchCriteria.add(Restrictions.eq(DESTINATION_COUNTRY, search.getDestinationCountry()));
        }

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

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

        if (search.getShippingMode() != null) {
            searchCriteria.add(Restrictions.eq(SHIPPING_MODE, search.getShippingMode()));
        }

        if (search.getPlaceOfDischarge() != null) {
            searchCriteria.add(Restrictions.eq(PLACE_OF_DISCHARGE, search.getPlaceOfDischarge()));
        }

        if (search.getPlaceOfLoading() != null) {
            searchCriteria.add(Restrictions.eq(PLACE_OF_LOADING, search.getPlaceOfLoading()));
        }

        if (search.getCarrier() != null) {
            searchCriteria.add(Restrictions.eq(CARRIER, search.getCarrier()));
        }

        if (search.getOriginCountry() != null) {
            searchCriteria.add(Restrictions.eq(ORIGIN_COUNTRY, search.getOriginCountry()));
        }

        if (search.getDestinationCountry() != null) {
            searchCriteria.add(Restrictions.eq(DESTINATION_COUNTRY, search.getDestinationCountry()));
        }

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

    // ++++++++++++++++++++++++

    protected Collection<CriteriaValue> routeSearchCriteriaValues(RouteSearch search) {
        Collection<CriteriaValue> fields = new LinkedHashSet<CriteriaValue>();

        Date now = Calendar.getInstance().getTime();
        fields.add(CriteriaValue.eq(SHIPPING_MODE, search.getShippingMode()));
        fields.add(CriteriaValue.eq(PLACE_OF_DISCHARGE, search.getPlaceOfDischarge()));
        fields.add(CriteriaValue.eq(PLACE_OF_LOADING, search.getPlaceOfLoading()));
        fields.add(CriteriaValue.eq(CARRIER, search.getCarrier()));
        fields.add(CriteriaValue.eq(ORIGIN_COUNTRY, search.getOriginCountry()));
        fields.add(CriteriaValue.gt(DESTINATION_COUNTRY, search.getDestinationCountry()));
        fields.add(CriteriaValue.gt(ORIGIN_REGION, search.getOriginRegion()));
        return fields;
    }

    @Override
    public List<Route> search(RouteSearch search) {

        Query query = createQuery(search, false, routeSearchCriteriaValues(search));
        return getQueryList(query, search.getSearchMetaParams());
    }

    //@Override
    public long countRoutes(RouteSearch search) {
        Query query = createQuery(search, true, routeSearchCriteriaValues(search));
        return getQueryCount(query);
    }

}