package com.xiaozhi.blog.redis;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BulkMapper;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.query.SortQuery;
import org.springframework.data.redis.core.query.SortQueryBuilder;
import org.springframework.data.redis.hash.DecoratingStringHashMapper;
import org.springframework.data.redis.hash.HashMapper;
import org.springframework.data.redis.hash.JacksonHashMapper;
import org.springframework.stereotype.Component;
import com.xiaozhi.blog.utils.KeyUtils;
import com.xiaozhi.blog.utils.MentionUtil;
import com.xiaozhi.blog.vo.Post;
import com.xiaozhi.blog.vo.Range;
import solr.index.BlogIndexData;
@Component
public class BlogIndexDao {
private static Log logger = LogFactory.getLog(BlogIndexDao.class);
@Autowired
private StringRedisTemplate template;
@Autowired
private BlogDao blogDao;
@Autowired
private MentionUtil mentionUtil;
private final HashMapper<Post, String, String> postMapper = new DecoratingStringHashMapper<Post>(new JacksonHashMapper<Post>(Post.class) {
});
/**
* 获取所有微博
* @param range
* @return
*/
public List<BlogIndexData> getAlltimeline(Range range) {
return convertPidsToPosts(KeyUtils.timeline(), range);
}
/**
* 获取所有微博数
* @param uid
* @return
*/
public int getAllTimelineNum(){
return template.opsForList().size(KeyUtils.timeline()).intValue();
}
/**
* 获取微薄列表
*/
private List<BlogIndexData> convertPidsToPosts(String key, Range range) {
String pid = "pid:*->";
final String pidKey = "#";
final String content = "content";
final String transmitid = "transmitid";
SortQuery<String> query = SortQueryBuilder.sort(key).noSort()
.get(pidKey)
.get(pid + content)
.get(pid + transmitid)
.limit(range.being, range.end-range.being+1).build();
BulkMapper<BlogIndexData, String> hm = new BulkMapper<BlogIndexData, String>() {
public BlogIndexData mapBulk(List<String> bulk) {
Map<String, String> map = new LinkedHashMap<String, String>();
//Iterator<String> iterator = bulk.iterator();
String pid = bulk.get(0);
map.put(content, bulk.get(1));
map.put(transmitid, bulk.get(2));
return convertPost(pid, map);
}
};
List<BlogIndexData> sort = template.sort(query, hm);
return sort;
}
private BlogIndexData convertPost(String pid, Map<String,String> hash) {
Post post = postMapper.fromHash(hash);
if(post==null){
BlogIndexData blogIndexData = new BlogIndexData();
blogIndexData.setPid(pid);
return blogIndexData;
}
BlogIndexData blogIndexData = new BlogIndexData();
blogIndexData.setContent(post.getContent());
if(null!=post.getTransmitid() && !"".equals(post.getTransmitid())){//转发微薄
blogIndexData.setForwardcontent(blogDao.getBlogById(post.getTransmitid(),true).getContent());
}
blogIndexData.setPid(pid);
blogIndexData.setContent(mentionUtil.replaceMentions(post.getContent()));
return blogIndexData;
}
}