StandardExchangeRateRepositoryImpl.java

package com.tradecloud.repository.impl;

import com.tradecloud.common.base.PersistenceBase;
import com.tradecloud.domain.exchangerate.StandardExchangeRate;
import com.tradecloud.dto.rate.StandardExchangeRateSearch;
import com.tradecloud.repository.SearchMetaParams;
import com.tradecloud.repository.StandardExchangeRateRepository;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import org.hibernate.query.Query;
import org.springframework.stereotype.Repository;

import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author jon
 */
@Repository(value = "standardExchangeRateRepository")
public class StandardExchangeRateRepositoryImpl extends RepositoryBaseImpl<StandardExchangeRate, StandardExchangeRateSearch> implements
        StandardExchangeRateRepository {

    @Override
    public List<StandardExchangeRate> search(StandardExchangeRateSearch search) {
        javax.persistence.criteria.CriteriaBuilder cb = getSessionCustom().getCriteriaBuilder();
        CriteriaQuery<StandardExchangeRate> cq = cb.createQuery(StandardExchangeRate.class);
        Root<StandardExchangeRate> root = cq.from(StandardExchangeRate.class);
        // Build predicates using the common method
        List<Predicate> predicates = buildPredicates(cb, root, search);
        cq.where(predicates.toArray(new Predicate[0]));
        cq.orderBy(cb.desc(root.get("effectiveDate")),cb.desc(root.get("created")));
        Query<StandardExchangeRate> query = getSessionCustom().createQuery(cq);
        SearchMetaParams metaParams = search.getSearchMetaParams();
        if (metaParams != null && metaParams.isPaged()) {
            query.setFirstResult(metaParams.getRowIndex());
            query.setMaxResults(metaParams.getRowCount());

        }
        return query.getResultList();
    }

    @Override
    public long count(StandardExchangeRateSearch search) {
        javax.persistence.criteria.CriteriaBuilder cb = getSessionCustom().getCriteriaBuilder();
        CriteriaQuery<Long> cq = cb.createQuery(Long.class);
        Root<StandardExchangeRate> root = cq.from(StandardExchangeRate.class);
        // Build predicates using the common method
        List<Predicate> predicates = buildPredicates(cb, root, search);
        cq.where(predicates.toArray(new Predicate[0]));
        cq.select(cb.count(root));
        return getSessionCustom().createQuery(cq).getSingleResult();
    }

    private List<Predicate> buildPredicates(javax.persistence.criteria.CriteriaBuilder cb, Root<StandardExchangeRate> root,
                                            StandardExchangeRateSearch search) {
        List<Predicate> predicates = new ArrayList<>();
        // Effective Date Range
        if (search.getEffectiveDateRange() != null) {
            if (search.getEffectiveDateRange().getFrom() != null) {
                predicates.add(cb.greaterThanOrEqualTo(root.get("effectiveDate"), search.getEffectiveDateRange().getFrom()));
            }
            if (search.getEffectiveDateRange().getTo() != null) {
                predicates.add(cb.lessThanOrEqualTo(root.get("effectiveDate"), search.getEffectiveDateRange().getTo()));
            }
        }

        // Created Date Range
        if (search.getCreatedDateRange() != null) {
            if (search.getCreatedDateRange().getFrom() != null) {
                predicates.add(cb.greaterThanOrEqualTo(root.get("created"), search.getCreatedDateRange().getFrom()));
            }
            if (search.getCreatedDateRange().getTo() != null) {
                predicates.add(cb.lessThanOrEqualTo(root.get("created"), search.getCreatedDateRange().getTo()));
            }
        }

        // Organisational Unit
        if (search.getOrganisationalUnit() != null) {
            predicates.add(cb.equal(root.get("organisationalUnit"), search.getOrganisationalUnit()));
        }

        // Local Currency
        if (search.getLocalCurrency() != null) {
            predicates.add(cb.equal(root.get("localCurrency"), search.getLocalCurrency()));
        }

        // Foreign Currency
        if (search.getForeignCurrency() != null) {
            predicates.add(cb.equal(root.get("foreignCurrency"), search.getForeignCurrency()));
        }

        if(search.getEffectiveDate()!=null){
            predicates.add(cb.equal(root.get("effectiveDate"), search.getEffectiveDate()));
        }
        if(search.getCreatedDate()!=null){
            predicates.add(cb.equal(root.get("created"), search.getCreatedDate()));
        }
        return predicates;
    }

    @Override
   public StandardExchangeRate searchLatest(StandardExchangeRateSearch search) {
        javax.persistence.criteria.CriteriaBuilder cb = getSessionCustom().getCriteriaBuilder();
        CriteriaQuery<StandardExchangeRate> cq = cb.createQuery(StandardExchangeRate.class);
        Root<StandardExchangeRate> root = cq.from(StandardExchangeRate.class);
        List<Predicate> predicates = new ArrayList<>();
        // Add predicates (restrictions) based on search criteria
        if (search.getEffectiveDate() != null) {
            predicates.add(cb.lessThanOrEqualTo(root.get("effectiveDate"), search.getEffectiveDate()));
        }

        if (search.getOrganisationalUnit() != null) {
            predicates.add(cb.equal(root.get("organisationalUnit"), search.getOrganisationalUnit()));
        }

        if (search.getLocalCurrency() != null) {
            predicates.add(cb.equal(root.get("localCurrency"), search.getLocalCurrency()));
        }

        if (search.getForeignCurrency() != null) {
            predicates.add(cb.equal(root.get("foreignCurrency"), search.getForeignCurrency()));
        }

        // Null check for deletedDate
        predicates.add(cb.isNull(root.get("deletedDate")));

        // Apply predicates
        cq.where(predicates.toArray(new Predicate[0]));
        // Add ordering by 'effectiveDate' and 'created'
        cq.orderBy(cb.desc(root.get("effectiveDate")), cb.desc(root.get("created")));

        // Execute the query
        Query<StandardExchangeRate> query = getSessionCustom().createQuery(cq);
        List<StandardExchangeRate> results = query.getResultList();

        // Return the latest result if found, or null
        return results.isEmpty() ? null : results.get(0);
    }

    private boolean exists(List<? extends PersistenceBase> list, Serializable excludeId) {
        if (list.isEmpty()) {
            return false;
        } else if (list.size() == 1) {
            return excludeId != null ? !list.get(0).getId().equals(excludeId) : true;
        } else {
            // This shouldn't happen
            return true;
        }
    }

    @Override
    public boolean exists(StandardExchangeRateSearch search, Serializable excludeId) {
        search.setSearchMetaParams(new SearchMetaParams(0,2));
        return exists(search(search), excludeId);
    }
}