package com.hongqiang.shop.modules.content.dao;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.FlushModeType;
import org.springframework.stereotype.Repository;
import com.hongqiang.shop.common.base.persistence.BaseDaoImpl;
import com.hongqiang.shop.common.base.persistence.Page;
import com.hongqiang.shop.common.utils.Filter;
import com.hongqiang.shop.common.utils.Order;
import com.hongqiang.shop.common.utils.Pageable;
import com.hongqiang.shop.modules.entity.Member;
import com.hongqiang.shop.modules.entity.Product;
import com.hongqiang.shop.modules.entity.Review;
@Repository
public class ReviewDaoImpl extends BaseDaoImpl<Review,Long> implements
ReviewDaoCustom {
@Override
public List<Review> findList(Member member, Product product,
Review.Type type, Boolean isShow, Integer count,
List<Filter> filters, List<Order> orders) {
List<Object> parameter = new ArrayList<Object>();
String qlString = composeSql(parameter, member, product, type, isShow);
return super
.findList(qlString, parameter, null, count, filters, orders);
}
@Override
public Page<Review> findPage(Member member, Product product,
Review.Type type, Boolean isShow, Pageable pageable) {
List<Object> parameter = new ArrayList<Object>();
String qlString = composeSql(parameter, member, product, type, isShow);
return super.findPage(qlString, parameter, pageable);
}
@Override
public Long count(Member member, Product product, Review.Type type,
Boolean isShow) {
List<Object> parameter = new ArrayList<Object>();
String qlString = composeSql(parameter, member, product, type, isShow);
StringBuilder stringBuilder = new StringBuilder(qlString);
return super.count(stringBuilder, null, parameter);
}
@Override
public boolean isReviewed(Member member, Product product) {
if ((member == null) || (product == null))
return false;
String str = "select count(*) from Review review where review.member = :member and review.product = :product";
Long localLong = (Long) this.getEntityManager()
.createQuery(str, Long.class)
.setFlushMode(FlushModeType.COMMIT)
.setParameter("member", member)
.setParameter("product", product).getSingleResult();
return localLong.longValue() > 0L;
}
@Override
public long calculateTotalScore(Product product) {
if (product == null)
return 0L;
String str = "select sum(review.score) from Review review where review.product = :product"
+ " and review.isShow = :isShow";
Long localLong = (Long) this.getEntityManager()
.createQuery(str, Long.class)
.setFlushMode(FlushModeType.COMMIT)
.setParameter("product", product)
.setParameter("isShow", Boolean.valueOf(true))
.getSingleResult();
return localLong != null ? localLong.longValue() : 0L;
}
@Override
public long calculateScoreCount(Product product) {
if (product == null)
return 0L;
String str = "select count(*) from Review review where review.product = :product and review.isShow = :isShow";
return ((Long) this.getEntityManager().createQuery(str, Long.class)
.setFlushMode(FlushModeType.COMMIT)
.setParameter("product", product)
.setParameter("isShow", Boolean.valueOf(true))
.getSingleResult()).longValue();
}
private String composeSql(List<Object> parameter, Member member,
Product product, Review.Type type, Boolean isShow) {
String qlString = "select review from Review review where 1=1 ";
if (member != null) {
qlString += " and review.member = ?";
parameter.add(member);
}
if (product != null) {
qlString += " and review.product = ?";
parameter.add(product);
}
if (type == Review.Type.positive) {
qlString += " and review.score >= ?";
parameter.add(Integer.valueOf(4));
} else if (type == Review.Type.moderate) {
qlString += " and review.score = ?";
parameter.add(Integer.valueOf(3));
} else if (type == Review.Type.negative) {
qlString += " and review.score <= ?";
parameter.add(Integer.valueOf(2));
}
if (isShow != null) {
qlString += " and review.isShow = ?";
parameter.add(isShow);
}
// qlString += " order by review.member asc";
return qlString;
}
}