package com.salesmanager.core.business.repositories.catalog.category;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import com.salesmanager.core.model.catalog.category.Category;
import com.salesmanager.core.model.merchant.MerchantStore;
public class CategoryRepositoryImpl implements CategoryRepositoryCustom {
@PersistenceContext
private EntityManager em;
@Override
public List<Object[]> countProductsByCategories(MerchantStore store, List<Long> categoryIds) {
StringBuilder qs = new StringBuilder();
qs.append("select categories, count(product.id) from Product product ");
qs.append("inner join product.categories categories ");
qs.append("where categories.id in (:cid) ");
qs.append("and product.available=true and product.dateAvailable<=:dt ");
qs.append("group by categories.id");
String hql = qs.toString();
Query q = this.em.createQuery(hql);
q.setParameter("cid", categoryIds);
q.setParameter("dt", new Date());
@SuppressWarnings("unchecked")
List<Object[]> counts = q.getResultList();
return counts;
}
@SuppressWarnings("unchecked")
@Override
public List<Category> listByStoreAndParent(MerchantStore store, Category category) {
StringBuilder queryBuilder = new StringBuilder();
queryBuilder.append("select c from Category c join fetch c.merchantStore cm ");
if (store == null) {
if (category == null) {
//query.from(qCategory)
queryBuilder.append(" where c.parent IsNull ");
//.where(qCategory.parent.isNull())
//.orderBy(qCategory.sortOrder.asc(),qCategory.id.desc());
} else {
//query.from(qCategory)
queryBuilder.append(" join fetch c.parent cp where cp.id =:cid ");
//.where(qCategory.parent.eq(category))
//.orderBy(qCategory.sortOrder.asc(),qCategory.id.desc());
}
} else {
if (category == null) {
//query.from(qCategory)
queryBuilder.append(" where c.parent IsNull and cm.id=:mid ");
//.where(qCategory.parent.isNull()
// .and(qCategory.merchantStore.eq(store)))
//.orderBy(qCategory.sortOrder.asc(),qCategory.id.desc());
} else {
//query.from(qCategory)
queryBuilder.append(" join fetch c.parent cp where cp.id =:cId and cm.id=:mid ");
//.where(qCategory.parent.eq(category)
// .and(qCategory.merchantStore.eq(store)))
//.orderBy(qCategory.sortOrder.asc(),qCategory.id.desc());
}
}
queryBuilder.append(" order by c.sortOrder asc");
String hql = queryBuilder.toString();
Query q = this.em.createQuery(hql);
q.setParameter("cid", category.getId());
if (store != null) {
q.setParameter("mid", store.getId());
}
return q.getResultList();
}
}