package com.kingschan.blog.dao.font.impl;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.hankcs.lucene.HanLPIndexAnalyzer;
import org.apache.commons.lang.StringUtils;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.UserVo;
import com.kingschan.blog.dao.HibernateBaseDao;
import com.kingschan.blog.dao.Pagination;
import com.kingschan.blog.dao.font.BlogFontDao;
import com.kingschan.blog.po.Article;
import com.kingschan.blog.po.ArticleComment;
import com.kingschan.blog.po.ArticleCommentSupport;
import com.kingschan.blog.po.BlogMsgBoard;
import com.kingschan.blog.po.User;
import com.kingschan.blog.util.BlogUtil;
import com.kingschan.blog.util.SqlUtil;
import com.kingschan.blog.util.TimeStampUtil;
@Repository("BlogFontDaoImpl")
@SuppressWarnings("unchecked")
public class BlogFontDaoImpl extends HibernateBaseDao implements BlogFontDao {
private Logger log =LoggerFactory.getLogger(BlogFontDaoImpl.class);
@Override
public void addMsgBoard(BlogMsgBoard bmb) throws Exception {
save(bmb);
BlogMsgBoard parent =StringUtils.isEmpty(bmb.getMsgRoot())?null:(BlogMsgBoard) get(BlogMsgBoard.class, bmb.getMsgRoot());
if (null!=parent) {
parent.setMsgCount(parent.getMsgCount()+1);
save(parent);
}
}
@Override
public Pagination getArticleDiscuss(int page, int limit,String articleId, String userid,String root, String model) throws Exception {
Pagination p= new Pagination();
List<Map<String, Object>> lis =null;
Map<String, Object> params= new HashMap<String, Object>();
params.put("articleid", articleId);
params.put("userid", userid);
params.put("root", root);
String sqlcmd=SqlUtil.getSql("article","article_comments");
StringBuffer sql=new StringBuffer(sqlcmd);
if (model.equals("default")) {
sql.append(" order by a.c_datetime desc");
}else if (model.equals("hot")) {
sql.append(" order by a.c_support desc,a.c_datetime desc ");
}else if (model.equals("aboutme")) {
sql.append(" and (a.c_user_id=:userid or a.c_tosomeone=:userid) ")
.append(" order by a.c_datetime desc");
}
if (root.matches("\\w{32}")) {
//加载回复评论不分页
lis=PaginationBySQL(sql.toString(), page, limit, false, params);
}else{
//加载根节点分页
p=PaginationsBySQL(sql.toString(), page, limit, false, params);
lis = (List<Map<String, Object>>) p.getData();
}
List<ArticleCommentVo> rows = new ArrayList<ArticleCommentVo>();
for (Map<String, Object> map : lis) {
ArticleCommentVo ac = new ArticleCommentVo();
ac.setCDatetime((Timestamp)map.get("c_datetime"));
ac.setId(map.get("id").toString());
String content=map.get("c_text").toString();//评论的内容
String html=BlogUtil.markDownToHtml(content);
html=BlogUtil.atUserFormat(html);//处理@用户
ac.setCText(html.replaceAll("\\<(\\/)?p\\>", ""));//将markdown转成html
ac.setCSupport(Integer.valueOf(map.get("c_support").toString()));
ac.setCReplyTotal(Integer.valueOf(map.get("reply_total").toString()));
//谁评论的
UserVo fromU=new UserVo();
fromU.setId(map.get("from_user_id").toString());
fromU.setUserProfileImg(map.get("user_profile_img").toString());
fromU.setUserScreenName(map.get("user_screen_name").toString());
fromU.setUserName(map.get("user_name").toString());
fromU.setExtendUserUrl(map.get("from_user_url").toString());
ac.setCUser(fromU);
//@谁
if (null!=map.get("to_uid")) {
UserVo toU=new UserVo();
toU.setId(map.get("to_uid").toString());
toU.setUserProfileImg(map.get("to_img_s").toString());
toU.setUserScreenName(map.get("to_screen_name").toString());
toU.setExtendUserUrl(map.get("to_user_url").toString());
ac.setCTosomeone(toU);
}
ac.setExistsSupport(null!=map.get("support"));//当前登录用户是否已经点赞过
rows.add(ac);
}
p.setData(rows);
return p;
}
@Override
public List<ArticleComment> getArticleDiscussReplyById(Integer page, Integer limit,
String rootId,String currentUser) throws Exception {
String hql=" from ArticleComment a left join a.CUser b left join a.CTosomeone c left join a.supports d where a.CRoot=? and a.CIsdel='√' and d.userid=? order by a.CDatetime desc";
List<ArticleComment> list = new ArrayList<ArticleComment>();
List<Object[]> lis = (List<Object[]>) PaginationByHql(hql, page, limit, false, rootId,currentUser);
for (Object[] item : lis) {
ArticleComment comments=(ArticleComment) item[0];
comments.setCUser((User)item[1]);
if (null!=item[2]) {
comments.setCTosomeone((User)item[2]);
}
if (null!=item[3]) {
Set<ArticleCommentSupport> set =new HashSet<ArticleCommentSupport>();
set.add((ArticleCommentSupport)item[3]);
comments.setSupports(set);
}
list.add(comments);
}
return list;
}
@Override
public ArticleVo getNext(String datetime, String website) throws Exception {
String sql =String.format("select * from (select id,article_title,UNIX_TIMESTAMP(article_updatetime) sort from blog_article where websiteid='%s')t where sort > UNIX_TIMESTAMP('%s')order by sort asc ",
website,datetime);
List<Map<String, Object>> lis= PaginationBySQL(sql, 1, 1, false, null);
if (null!=lis&&lis.size()>0) {
Map<String, Object> row=lis.get(0);
return new ArticleVo(row.get("id").toString(), row.get("article_title").toString());
}
return null;
}
@Override
public ArticleVo getPrevious(String datetime, String website)
throws Exception {
String sql =String.format("select * from (select id,article_title,UNIX_TIMESTAMP(article_updatetime) sort from blog_article where websiteid='%s')t where sort < UNIX_TIMESTAMP('%s')order by sort desc ",
website,datetime);
List<Map<String, Object>> lis= PaginationBySQL(sql, 1, 1, false, null);
if (null!=lis&&lis.size()>0) {
Map<String, Object> row=lis.get(0);
return new ArticleVo(row.get("id").toString(), row.get("article_title").toString());
}
return null;
}
@Override
public List<ArticleVo> similarArticles(String website,String keyword,int limit) throws Exception {
log.debug("相似文章查找:{}",keyword);
QueryBuilder qb = getFullTextSession().getSearchFactory()
.buildQueryBuilder().forEntity(Article.class).get();
org.apache.lucene.search.Query query = null;
query= qb.bool().must(
qb.keyword().onField("websiteid").matching(website).createQuery()
).must(
qb.keyword().onFields("articlePrivate").matching("false").createQuery()
).must(
qb.keyword().onFields("articleTitle","articleText.articleContent").matching(keyword).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(0);
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();
if (null==article.getArticleText().getArticleSummary()||article.getArticleText().getArticleSummary().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);
list.add(vo);
}
return list;
}
}