FECDealLinkRepositoryImpl.java

package com.tradecloud.repository.impl;

import com.tradecloud.domain.model.FECDealLink;
import com.tradecloud.domain.model.ForexGroup;
import com.tradecloud.domain.model.deal.Deal;
import com.tradecloud.domain.model.deal.OrderReference;
import com.tradecloud.domain.model.fec.IFEC;
import com.tradecloud.repository.FECDealLinkRepository;
import org.apache.commons.lang.StringUtils;
import org.hibernate.Query;
import org.hibernate.transform.Transformers;
import org.hibernate.type.StandardBasicTypes;
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.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;


/**
 * Default implementation of the {@link FECDealLinkRepository} interface.
 *
 */
@Repository(value = "fecDealLinkRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class FECDealLinkRepositoryImpl extends AbstractDealLinkRepository<FECDealLink> implements FECDealLinkRepository {

    private static final long serialVersionUID = 1L;

    @Override
    public List<FECDealLink> findAllByDeal(Deal deal) {
        return findAllByDeal(deal, FECDealLink.class.getSimpleName());
    }

    @Override
    public List<FECDealLink> findAllByFEC(IFEC fec) {
        @SuppressWarnings("unchecked")
        List<FECDealLink> list =
                (List<FECDealLink>) getSessionCustom().createQuery("from FECDealLink where fec_id = :fecId")
                .setParameter("fecId", fec.getId()).list();
        return list;
    }

    @Override
    public FECDealLink find(FECDealLink fecDealLink) {
        return (FECDealLink) getSessionCustom().createQuery("from FECDealLink where fec_id = :fecId and deal_id =:dealId")
                .setParameter("fecId", fecDealLink.getFec().getId()).setParameter("dealId", fecDealLink.getDeal().getId()).uniqueResult();
    }

    @Override
    public List<FECDealLink> findAll() {
        return findAll(FECDealLink.class.getSimpleName());
    }

    @Override
    public List<Deal> findAllDealsLinkedToFEC(IFEC fec) {
        String hql = "select deal from Deal deal, FECDealLink fdl, FEC fec where fec.id = :fecId and fdl.fec.id = fec.id and deal.id = fdl.deal.id";
        @SuppressWarnings("unchecked")
        List<Deal> list = (List<Deal>) findByNamedParam(hql, "fecId", fec.getId());
        return list;
    }

    @Override
    public void deleteAllByDeal(Deal deal) {
        deleteAllByDeal(deal, FECDealLink.class.getSimpleName());
    }

    @Override
    public List<FECDealLink> findAllByOrderReference(OrderReference orderReference) {
        String hql =
                "select fdl from Deal deal, FECDealLink fdl, FEC fec" + " where deal.orderReference = :orderReference" + " and fdl.fec.id = fec.id"
                        + " and deal.id = fdl.deal.id";
        @SuppressWarnings("unchecked")
        List<FECDealLink> list = (List<FECDealLink>) findByNamedParam(hql, "orderReference", orderReference);
        return list;
    }

    @Override
    public List<FECDealLink> findAll(OrderReference orderReference, ForexGroup forexGroup, String paymentType) {

        String hql =
                "select fdl from Deal deal, FECDealLink fdl, FEC fec" + " where deal.orderReference = :orderReference" + " and fdl.fec.id = fec.id"
                        + " and deal.id = fdl.deal.id"+ " and deal.forexGroup=:forexGroup";
        if(StringUtils.isNotEmpty(paymentType)) {
            hql=hql+" and paymentType= :paymentType";
        }

        Query query  = getSessionCustom().createQuery(hql).setParameter("orderReference", orderReference)
                .setParameter("forexGroup", forexGroup);

        if(StringUtils.isNotEmpty(paymentType)){
            query =query.setParameter("paymentType",paymentType);
        }
        return query.list();

    }

    @Override
    public List<FECDealLink> findAllByDealReference(Collection<String> references) {
        String hql =
                "select fdl from Deal deal, FECDealLink fdl, FEC fec" + " where deal.orderReference.reference in (:orderReference)" +
                        " and fdl.fec.id = fec.id and deal.id = fdl.deal.id" ;
        Query query  = getSessionCustom().createQuery(hql).setParameterList("orderReference", references);
        return query.list();
    }

    @Override
    public boolean isLinked(IFEC fec) {
        Query query = getSessionCustom().createQuery("select count(*) from FECDealLink fdl where fdl.fec=:fecParam")
                .setParameter("fecParam", fec);
        return (Long) query.uniqueResult() > 0;
    }

    @Override
    public boolean hasDealInState(List<String> dealStates, Long fecId) {
        String hql =
                "select count(*) from Deal deal, FECDealLink fdl, FEC fec" + " where fec.id= :fecId and fdl.fec.id = fec.id"
                        + " and deal.id = fdl.deal.id" + " and deal.status.statusName in :dealStates";

        Query query = getSessionCustom().createQuery(hql);
        query.setParameter("fecId", fecId);
        query.setParameterList("dealStates", dealStates);
        return (Long) query.uniqueResult() > 0;
    }

    @Override
    public List<Map<String, String>> findAmountDateLinked(IFEC fec) {
        @SuppressWarnings("unchecked")
        String query = "select fd.amount_value as amount,d.estimated_settlement_date from fec_deal_link " +
                "fd join deal d on (d.id=fd.deal_id)   where fec_id = :fecId";

        @SuppressWarnings("unchecked")
        List<Map<String, String>> results = getCurrentSession()
                .createNativeQuery(query)
                .addScalar("amount", StandardBasicTypes.STRING)
                .addScalar("estimated_settlement_date", StandardBasicTypes.STRING)
                .setParameter("fecId", fec.getId())
                .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
        return results;

    }

    public boolean hasFecLinks(Set<Long> dealIds) {
            Query query = getSessionCustom().createQuery("select count(*) from FECDealLink fdl where fdl.deal.id in (:dealIds)")
                    .setParameterList("dealIds", dealIds);
            return (Long) query.uniqueResult() > 0;

    }

    @Override
    public BigDecimal getLinkedAmount(Long dealId) {
        Query query = getSessionCustom().createNativeQuery("select sum(fdl.amount_value) from fec_deal_link fdl where fdl.deal_id = :dealId ")
                .setParameter("dealId", dealId);
        return (BigDecimal) query.uniqueResult() ;

    }

    @Override
    public List<FECDealLink> findAllByDealIdIn(List<Long> dealIds) {
        String hql =
                "select fdl from FECDealLink fdl  where deal.id in (:dealIds)"  ;
        Query query  = getSessionCustom().createQuery(hql).setParameterList("dealIds", dealIds);
        return query.list();
    }

    @Override
    public List getLinkedAmounts(List<Long> dealIds) {
        Query query = getSessionCustom().createNativeQuery("select sum(fdl.amount_value),fdl.deal_id from fec_deal_link fdl where fdl.deal_id in (:dealIds) group by fdl.deal_id ")
                .setParameter("dealIds", dealIds);
        return  query.list() ;

    }

    @Override
    public void delete2(FECDealLink link) {

        getCurrentSession().delete(link);

    }

}