package com.salesmanager.core.business.repositories.catalog.product.relationship; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import com.salesmanager.core.model.catalog.product.Product; import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship; import com.salesmanager.core.model.merchant.MerchantStore; import com.salesmanager.core.model.reference.language.Language; public class ProductRelationshipRepositoryImpl implements ProductRelationshipRepositoryCustom { @PersistenceContext private EntityManager em; @Override public List<ProductRelationship> getByType(MerchantStore store, String type, Product product, Language language) { StringBuilder qs = new StringBuilder(); qs.append("select distinct pr from ProductRelationship as pr "); qs.append("left join fetch pr.product p "); qs.append("join fetch pr.relatedProduct rp "); qs.append("left join fetch rp.descriptions rpd "); qs.append("where pr.code=:code "); qs.append("and pr.store.id=:storeId "); qs.append("and p.id=:id "); qs.append("and rpd.language.id=:langId"); String hql = qs.toString(); Query q = em.createQuery(hql); q.setParameter("code", type); q.setParameter("id", product.getId()); q.setParameter("storeId", store.getId()); qs.append("and pr.store.id=:storeId "); q.setParameter("langId", language.getId()); @SuppressWarnings("unchecked") List<ProductRelationship> relations = q.getResultList(); return relations; } @Override public List<ProductRelationship> getByType(MerchantStore store, String type, Language language) { StringBuilder qs = new StringBuilder(); qs.append("select distinct pr from ProductRelationship as pr "); qs.append("left join fetch pr.product p "); qs.append("join fetch pr.relatedProduct rp "); qs.append("left join fetch rp.attributes pattr "); qs.append("left join fetch rp.categories rpc "); qs.append("left join fetch rp.descriptions rpd "); qs.append("left join fetch rp.images pd "); qs.append("left join fetch rp.merchantStore rpm "); qs.append("left join fetch rpm.currency rpmc "); qs.append("left join fetch rp.availabilities pa "); qs.append("left join fetch rp.manufacturer m "); qs.append("left join fetch m.descriptions md "); qs.append("left join fetch pa.prices pap "); qs.append("left join fetch pap.descriptions papd "); qs.append("where pr.code=:code "); qs.append("and rp.available=:available "); qs.append("and pr.store.id=:storeId "); qs.append("and rpd.language.id=:langId"); String hql = qs.toString(); Query q = em.createQuery(hql); q.setParameter("code", type); q.setParameter("langId", language.getId()); q.setParameter("storeId", store.getId()); q.setParameter("available", true); @SuppressWarnings("unchecked") List<ProductRelationship> relations = q.getResultList(); return relations; } @Override public List<ProductRelationship> getByGroup(MerchantStore store, String group) { StringBuilder qs = new StringBuilder(); qs.append("select distinct pr from ProductRelationship as pr "); qs.append("left join fetch pr.product p "); qs.append("left join fetch pr.relatedProduct rp "); qs.append("left join fetch rp.attributes pattr "); qs.append("left join fetch rp.categories rpc "); qs.append("left join fetch rp.descriptions rpd "); qs.append("left join fetch rp.images pd "); qs.append("left join fetch rp.merchantStore rpm "); qs.append("left join fetch rpm.currency rpmc "); qs.append("left join fetch rp.availabilities pa "); qs.append("left join fetch pa.prices pap "); qs.append("left join fetch pap.descriptions papd "); qs.append("left join fetch rp.manufacturer manuf "); qs.append("left join fetch manuf.descriptions manufd "); qs.append("left join fetch rp.type type "); qs.append("where pr.code=:code "); qs.append("and pr.store.id=:storeId "); String hql = qs.toString(); Query q = em.createQuery(hql); q.setParameter("code", group); q.setParameter("storeId", store.getId()); @SuppressWarnings("unchecked") List<ProductRelationship> relations = q.getResultList(); return relations; } @Override public List<ProductRelationship> getGroups(MerchantStore store) { StringBuilder qs = new StringBuilder(); qs.append("select distinct pr from ProductRelationship as pr "); qs.append("where pr.store.id=:store "); qs.append("and pr.product=null"); String hql = qs.toString(); Query q = em.createQuery(hql); q.setParameter("store", store.getId()); @SuppressWarnings("unchecked") List<ProductRelationship> relations = q.getResultList(); Map<String,ProductRelationship> relationMap = new HashMap<String,ProductRelationship>(); for(ProductRelationship relationship : relations) { if(!relationMap.containsKey(relationship.getCode())) { relationMap.put(relationship.getCode(), relationship); } } List<ProductRelationship> returnList = new ArrayList<ProductRelationship>(relationMap.values()); return returnList; } @Override public List<ProductRelationship> getByType(MerchantStore store, String type) { StringBuilder qs = new StringBuilder(); qs.append("select distinct pr from ProductRelationship as pr "); qs.append("left join fetch pr.product p "); qs.append("join fetch pr.relatedProduct rp "); qs.append("left join fetch rp.descriptions rpd "); qs.append("where pr.code=:code "); qs.append("and pr.store.id=:storeId "); String hql = qs.toString(); Query q = em.createQuery(hql); q.setParameter("code", type); q.setParameter("storeId", store.getId()); @SuppressWarnings("unchecked") List<ProductRelationship> relations = q.getResultList(); return relations; } @Override public List<ProductRelationship> listByProducts(Product product) { StringBuilder qs = new StringBuilder(); qs.append("select pr from ProductRelationship as pr "); qs.append("left join fetch pr.product p "); qs.append("left join fetch pr.relatedProduct rp "); qs.append("left join fetch rp.attributes pattr "); qs.append("left join fetch rp.categories rpc "); qs.append("left join fetch p.descriptions pd "); qs.append("left join fetch rp.descriptions rpd "); qs.append("where p.id=:id"); qs.append(" or rp.id=:id"); String hql = qs.toString(); Query q = em.createQuery(hql); q.setParameter("id", product.getId()); @SuppressWarnings("unchecked") List<ProductRelationship> relations = q.getResultList(); return relations; } @Override public List<ProductRelationship> getByType(MerchantStore store, String type, Product product) { StringBuilder qs = new StringBuilder(); qs.append("select distinct pr from ProductRelationship as pr "); qs.append("left join fetch pr.product p "); qs.append("left join fetch pr.relatedProduct rp "); qs.append("left join fetch rp.attributes pattr "); qs.append("left join fetch rp.categories rpc "); qs.append("left join fetch rp.descriptions rpd "); qs.append("left join fetch rp.images pd "); qs.append("left join fetch rp.merchantStore rpm "); qs.append("left join fetch rpm.currency rpmc "); qs.append("left join fetch rp.availabilities pa "); qs.append("left join fetch pa.prices pap "); qs.append("left join fetch pap.descriptions papd "); qs.append("left join fetch rp.manufacturer manuf "); qs.append("left join fetch manuf.descriptions manufd "); qs.append("left join fetch rp.type type "); qs.append("where pr.code=:code "); qs.append("and rp.available=:available "); qs.append("and p.id=:pId"); String hql = qs.toString(); Query q = em.createQuery(hql); q.setParameter("code", type); q.setParameter("available", true); q.setParameter("pId", product.getId()); @SuppressWarnings("unchecked") List<ProductRelationship> relations = q.getResultList(); return relations; } }