package com.kingschan.blog.dao.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.hankcs.lucene.HanLPIndexAnalyzer;
import com.kingschan.blog.po.*;
import org.apache.lucene.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Fragmenter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.jsoup.Jsoup;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Repository;
import com.kingschan.blog.model.vo.ArticleCommentVo;
import com.kingschan.blog.model.vo.ArticleVo;
import com.kingschan.blog.model.vo.CategoryVo;
import com.kingschan.blog.model.vo.UserVo;
import com.kingschan.blog.dao.ArticleDao;
import com.kingschan.blog.dao.HibernateBaseDao;
import com.kingschan.blog.dao.Pagination;
import com.kingschan.blog.util.TimeStampUtil;
import com.kingschan.blog.util.UnixDate;
/**
*
* <pre>
* 类名称:ArticleDaoImpl
* 类描述: 文章数据访问dao
* 创建人:陈国祥 (kingschan)
* 创建时间:2016-2-18 下午9:06:50
* 修改人:Administrator
* 修改时间:2016-2-18 下午9:06:50
* 修改备注:
* @version V1.0
* </pre>
*/
@Repository("ArticleDaoImpl")
@SuppressWarnings("unchecked")
public class ArticleDaoImpl extends HibernateBaseDao implements ArticleDao{
@Override
public void addObj(Article obj) throws Exception {
save(obj);
}
@Override
public void deleteObj(Article obj) throws Exception {
delete(obj);
}
@Override
public void updateObj(Article obj) throws Exception {
update(obj);
}
@Override
public Article getObj(Object id) throws Exception {
return (Article) get(Article.class, id.toString());
}
@Override
public Pagination getNewArticleByPage(int page,int limit, String website,Map<String, Object> args) throws Exception {
StringBuffer hql = new StringBuffer(String.format("from Article a inner join a.articleText inner join a.category where a.websiteid='%s'", website));
if (args.get("model").toString().equalsIgnoreCase("font")) {
hql.append(" and a.articlePrivate=false ");
}
if (args.containsKey("category")) {
hql.append(" and a.category.categoryName=:category ");
}else if (args.containsKey("categoryId")) {
hql.append(" and a.category.id=:categoryId ");
}
else if (args.containsKey("year")) {
hql.append(" and YEAR(a.articlePubtime)=:year ")
.append(" and MONTH(a.articlePubtime)=:month ");
if (args.containsKey("day")) {
hql.append(" and DAY(a.articlePubtime)=:day ");
}
}
if (args.containsKey("title")) {
hql.append(" and a.articleTitle like '%").append(args.get("title").toString()).append("%'");
args.remove("title");
}
if (args.containsKey("orderby")) {
hql.append(" order by ").append(args.get("orderby").toString());
args.remove("orderby");
}else{
hql.append(" order by a.articleSort desc ,a.articleUpdatetime desc");
}
args.remove("model");
Pagination p = PaginationsByHQLMapParams(hql.toString(), page, limit, true, args);
List<Object[]> list = (List<Object[]>)p.getData();
List<Article> result=new ArrayList<Article>();
for (Object[] row:list) {
Article a =(Article)row[0];
ArticleText at =(ArticleText)row[1];
Category cg =(Category)row[2];
a.setArticleText(at);
a.setCategory(cg);
result.add(a);
}
p.setData(result);
return p;
}
@Override
public Pagination getHomeArticleList(int page,
int limit, Map<String, Object> args) throws Exception {
StringBuffer hql = new StringBuffer(" from Article a left join a.articleText left join a.user where a.articlePrivate=false");
if (args.containsKey("category")) {
hql.append(" and a.category.categoryName=:category ");
}
hql.append(" order by a.articleUpdatetime desc");
return PaginationsByHQLMapParams(hql.toString(), page, limit, true, args);
}
@Override
public Article getArticleByID(String id) throws Exception {
return getObj(id);
}
//select b.id,b.article_title,a.lable_name from blog_label a left join blog_article b on a.lable_articleid=b.id where a.lable_name='java' ORDER BY b.article_updatetime desc limit 10
@Override
public Pagination getArticleByLable(String lableName,String website,int page,int limit) throws Exception {
Pagination p = null;
//String hql="select lableName,article from Lable a where a.lableName =:lablename and a.webSite.id=:website and a.article.articlePrivate=false ";
String hql =" from Lable a inner join a.article inner join a.article.articleText where a.webSite.id=:website and a.lableName=:lablename";
Map<String, Object> map = new HashMap<String, Object>();
map.put("lablename", lableName);
map.put("website", website);
p=PaginationsByHQLMapParams(hql, page, limit, true,map);
List<Object[]> lis= (List<Object[]>) p.getData();//(List<Object[]>) Pagination(hql, page, 10,true, lableName);
List<Article> list = new ArrayList<Article>();
for (Object[] objects : lis) {
Article a = (Article) objects[1];
ArticleText at = (ArticleText)objects[2];
a.setArticleText(at);
list.add(a);
}
p.setData(list);
return p;
}
@Override
public Article getArticleByTitleOrLinkURL(String keyword,String website) throws Exception {
String hql="from Article a where a.websiteid=? and ( a.articleTitle=? or a.articleLinkurl=? )";
List<Article> lis = (List<Article>) queryForListByHql(hql,true,false,website, keyword,keyword);
return null!=lis&&lis.size()>0?lis.get(0):null;
}
@Override
public List<Article> getHotArticle(String websiteid,int limit) throws Exception {
String hql="from Article a where a.websiteid=? order by a.articleViewcount desc";
return (List<Article>) PaginationByHql(hql, 1, limit, true, websiteid);
}
@Override
public List<Object[]> getSiteMapByWebSite(String websiteid) throws Exception {
String hql="select a.id,a.articleTitle from Article a where a.websiteid=? order by a.articleUpdatetime desc";
return (List<Object[]>) queryForListByHql(hql, true,false, websiteid);
}
@Override
public Map<String, Object> getEveryDayArticleInfo(String websiteid, int year, int month)
throws Exception {
String sql="select date_format(article_pubtime,'%Y-%m-%d') times,count(*) total from blog_article where YEAR(article_pubtime)=:year and MONTH(article_pubtime)=:month and websiteid=:website group by times";
Map<String, Object> map = new HashMap<String, Object>();
map.put("year", year);
map.put("month", month);
map.put("website", websiteid);
return (Map<String, Object>) queryForSingleMap(sql, map, "times", "total");
}
@Override
public Pagination getFullTextSearch(int page, int limit, String website,Boolean isback,
String keyword, String... fields) throws Exception {
Pagination p = new Pagination();
QueryBuilder qb = getFullTextSession().getSearchFactory()
.buildQueryBuilder().forEntity(Article.class).get();
org.apache.lucene.search.Query query = null;
if (isback){
query=qb.bool().must(
qb.keyword().onField("websiteid").matching(website).createQuery()
).must(
qb.keyword().onFields(fields).matching(keyword).createQuery()
).createQuery();
}else if (null!=website) {
query= qb.bool().must(
qb.keyword().onField("websiteid").matching(website).createQuery()
).must(
qb.keyword().onField("articlePrivate").matching("false").createQuery()
).must(
qb.keyword().onFields(fields).matching(keyword).createQuery()
).createQuery();
}
else{
query=qb.bool().must(
qb.keyword().onFields(fields).matching(keyword).createQuery()
).must(
qb.keyword().onField("articlePrivate").matching("false").createQuery()
).createQuery();
}
/* org.apache.lucene.search.Query query = qb
.keyword().onFields(fields).matching(keyword)
.createQuery();*/
// wrap Lucene query in a org.hibernate.Query
FullTextQuery fullTextQuery = getFullTextSession().createFullTextQuery(query, Article.class);
fullTextQuery.setCacheable(true);
fullTextQuery.setFirstResult((page-1)*limit);
fullTextQuery.setMaxResults(limit);
List<Article> lis=fullTextQuery.list();
//高亮处理
Formatter formatter = new SimpleHTMLFormatter("<font style='color:red;'>","</font>");
//用于高亮查询,query是Lucene的查询对象Query
QueryScorer scorer = new QueryScorer(query);
//创建一个高亮器
Highlighter highlighter = new Highlighter(formatter, scorer);
//设置文本摘要大小
Fragmenter fragmenter = new SimpleFragmenter(300);
highlighter.setTextFragmenter(fragmenter);
String summary=null;
List<ArticleVo> list=new ArrayList<ArticleVo>();
for (Article article : lis) {
String title=article.getArticleTitle();
summary=article.getArticleText().getArticleSummary();
if (null==summary||summary.isEmpty()) {
summary=Jsoup.parse(article.getArticleText().getArticleContent()).text();
summary=summary.length()>300? summary.substring(0,300):summary;
}else {
summary=Jsoup.parse(article.getArticleText().getArticleSummary()).text();
}
String highlighterTitle = highlighter.getBestFragment(new HanLPIndexAnalyzer() , "articleTitle", title);
//转换为vo
ArticleVo vo = new ArticleVo();
BeanUtils.copyProperties(article, vo);
vo.setArticlePubtime(TimeStampUtil.timestampToString(article.getArticlePubtime()));
if (null!=highlighterTitle) {
vo.setArticleTitle(highlighterTitle);
}
vo.setArticleSummary(summary);
//类型转换
Category category=article.getCategory();
CategoryVo categoryVo= new CategoryVo();
BeanUtils.copyProperties(category, categoryVo);
vo.setCategory(categoryVo);
//用户信息
UserVo temp_user=new UserVo();
BeanUtils.copyProperties(article.getUser(), temp_user);
vo.setUser(temp_user);
list.add(vo);
}
//builder Pagination 对象
p.setData(list);
p.setLimit(limit);
p.setPageindex(page);
Integer total=fullTextQuery.getResultSize();
p.setTotal(total);
p.setMaxPage((total-1)/limit+1);
return p;
}
@Override
public int delArticles(String[] ids) throws Exception {
String del_article="delete from Article where id in(:ids)";
String del_lable="delete from Lable l where l.article.id in(:ids)";
Map<String, Object> map = new HashMap<String, Object>();
map.put("ids", ids);
executeHQL(del_lable, map);
return executeHQL(del_article, map);
}
@Override
public int updateArticleType(String[] ids, String typeid) throws Exception {
String hql ="update from Article set category.id=:category where id in(:ids)";
Map<String, Object> map = new HashMap<String, Object>();
return executeHQL(hql, map);
}
@Override
public Article getArticleByID(String id, String website) throws Exception {
String hql="from Article a where a.id=? and a.websiteid=?";
List<Article> lis = (List<Article>) queryForListByHql(hql,false,false, id,website);
return null!=lis&&lis.size()>0?lis.get(0):null;
}
@Override
public int updateArticlesType(String[] ids, String category,String websiteid)throws Exception {
String hql=" update Article a set a.category.id=:category where a.id in(:ids) and a.websiteid=:websiteid";
Map<String, Object> map = new HashMap<String, Object>();
map.put("ids", ids);
map.put("websiteid", websiteid);
map.put("category", category);
return executeHQL(hql, map);
}
@Override
public Pagination getHomeFullTextSearch(int page,
int limit, String keyword, String... fields) throws Exception {
return getFullTextSearch(page, limit, null,false,keyword, fields);
}
@Override
public Pagination getCommentsByArticle(int page,
int limit, String articleId, Map<String, Object> args)
throws Exception {
HashMap<String, Object> params= new HashMap<String, Object>();
StringBuffer hql =new StringBuffer(" from ArticleComment a left join a.CUser u left join a.CTosomeone u1 where a.CIsdel='√' ");
//指定文章
if (null!=articleId&&!articleId.isEmpty()) {
hql.append(" and a.article.id=:articleId ");
params.put("articleId", articleId);
}
if (null!=args) {
//指定用户
if (args.containsKey("CUserId")) {
hql.append(" and a.CUser.id=:CUserId");
params.put("CUserId", args.get("CUserId"));
}
if (args.containsKey("website")) {
hql.append(" and a.CWebsiteId=:website");
params.put("website", args.get("website"));
}
}
hql.append(" order by a.CDatetime desc");
Pagination p = PaginationsByHQLMapParams(hql.toString(), page, limit, true, params);
List<Object[]> rows = (List<Object[]>) p.getData();
if (null!=rows&&rows.size()>0) {
List<ArticleCommentVo> lis = new ArrayList<ArticleCommentVo>();
for (Object[] objects : rows) {
ArticleComment comment=(ArticleComment) objects[0];
User user=(User) objects[1];
User touser=(User) objects[2];
ArticleCommentVo acv =new ArticleCommentVo();
ArticleVo av = new ArticleVo();
UserVo u1 = new UserVo();
UserVo u2 = new UserVo();
BeanUtils.copyProperties(comment, acv);
if (null!=user) {
BeanUtils.copyProperties(user, u1);
}
if (null!=touser) {
BeanUtils.copyProperties(touser, u2);
}
if (null!=comment.getArticle()) {
BeanUtils.copyProperties(comment.getArticle(), av);
}
acv.setCUser(u1);
acv.setCTosomeone(u2);
acv.setArticle(av);
lis.add(acv);
}
p.setData(lis);
}
return p;
}
@Override
public int delArticleComments(String[] ids) throws Exception {
String hql="update ArticleComment set CIsdel='X' where id in (:ids)";
Map<String, Object> map = new HashMap<String, Object>();
map.put("ids", ids);
return executeHQL(hql, map);
}
@Override
public int fixedTop(String[] ids, String websiteid) throws Exception {
String hql="update Article set articleSort=:sort where id in (:ids) and websiteid =:website";
Map<String, Object> map = new HashMap<String, Object>();
map.put("ids", ids);
map.put("website", websiteid);
Integer i =(int) new UnixDate().getCurrentDate();
map.put("sort", i);
return executeHQL(hql, map);
}
@Override
public int cancleFixed(String[] ids, String websiteid) throws Exception {
String hql="update Article set articleSort=0 where id in (:ids) and websiteid =:website";
Map<String, Object> map = new HashMap<String, Object>();
map.put("ids", ids);
map.put("website", websiteid);
return executeHQL(hql, map);
}
@Override
public int setCover(String[] ids, String websiteid, String resKey)
throws Exception {
String hql="update Article set articleCover=:reskey where id in (:ids) and websiteid =:website";
Map<String, Object> map = new HashMap<String, Object>();
map.put("ids", ids);
map.put("website", websiteid);
String key =null==resKey?"":resKey;
map.put("reskey",key.trim());
return executeHQL(hql, map);
}
@Override
public Pagination articleArchive(int page,int limit, String website) throws Exception {
return null;
}
@Override
public int getArticleDateQuantity(String websiteId, String dateString) throws Exception {
Integer year=Integer.valueOf(dateString.substring(0, 4)) ;
Integer month=Integer.valueOf(dateString.substring(4,6));
ArrayList<Object> args = new ArrayList<Object>();
args.add(websiteId);
args.add(year);
args.add(month);
StringBuffer hql = new StringBuffer("select count(1) from Article a where a.websiteid =? and YEAR(a.articlePubtime)=? and MONTH(a.articlePubtime)=?");
if(dateString.length()==8){
Integer day=Integer.valueOf(dateString.substring(6));
args.add(day);
hql.append(" and DAY(a.articlePubtime)=?");
}
Object val = uniqueQueryByHql(hql.toString(),true,args.toArray(new Object[1]));
return Integer.valueOf(val.toString());
}
@Override
public int delSelfComments(String id, String userid) throws Exception {
String hql="update ArticleComment set CIsdel='X' where id = :id and CUser.id=:userid";
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", id);
map.put("userid", userid);
return executeHQL(hql, map);
}
}