package com.blinkcoder.model;
import com.blinkcoder.kit.MarkdownKit;
import com.blinkcoder.kit.ModelKit;
import com.blinkcoder.search.Searchable;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.ehcache.CacheKit;
import org.apache.commons.collections.CollectionUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* User: Michael
* Email: yidongnan@gmail.com
* Date: 13-10-10
* Time: 下午9:58
*/
public class Blog extends MyModel<Blog> implements Searchable {
public static final Blog dao = new Blog();
private static final String MODEL_CACHE = "blog";
private static final ModelKit mk = new ModelKit(dao, MODEL_CACHE);
private static final String MODEL_LIST_CACHE = "blog#list";
private static final int TOP = 0x01;
private static final int NORMAL = 0x00;
private static final long serialVersionUID = 1441921092958223502L;
public static void VisitBlog(ConcurrentHashMap<Integer, Integer> datas) {
Object[][] args = new Object[datas.size()][2];
int i = 0;
for (Integer id : datas.keySet()) {
Blog blog = Blog.dao.Get(id);
if (blog == null) break;
args[i][0] = id;
args[i][1] = datas.get(id);
i++;
}
String sql = "INSERT INTO blog (id) VALUES(?) ON DUPLICATE KEY UPDATE " +
"read_count = read_count + ?";
Db.batch(sql, args, 500);
for (int id : datas.keySet()) {
CacheKit.remove(MODEL_CACHE, id);
}
}
public Blog Get(int id) {
return mk.getModel(id);
}
protected void removeCache() {
CacheKit.remove(MODEL_CACHE, this.get("id"));
CacheKit.remove(MODEL_CACHE, this.get("global_url"));
CacheKit.removeAll(MODEL_LIST_CACHE);
}
public Blog getByGlobalUrl(String global_url) {
Blog blog = findFirstByCache(MODEL_CACHE, "golbal_url - " + global_url,
"select id from blog where global_url = ?", global_url);
if (blog == null)
return null;
else
return Get(blog.getInt("id"));
}
public boolean isTopBlog() {
return this.getInt("type") == TOP;
}
public Page<Blog> hotBlogList(int page, int pageSize) {
return mk.loadModelPage(paginateByCache(MODEL_LIST_CACHE, "hot#blog" + page + pageSize,
page, pageSize, "select id", "from blog order by read_count desc"));
}
public Page<Blog> topBlogList(int page, int pageSize) {
return mk.loadModelPage(paginateByCache(MODEL_LIST_CACHE, "top#blog" + page + pageSize,
page, pageSize, "select id", "from blog where type = ? order by id", TOP));
}
public Page<Blog> normalBlogList(int page, int pageSize) {
return mk.loadModelPage(paginateByCache(MODEL_LIST_CACHE,
"normal#blog" + page + pageSize, page, pageSize, "select id",
"from blog where type = ? order by id", NORMAL));
}
public Page<Blog> topAndNormalBlogList(int page, int pageSize) {
return mk.loadModelPage(paginateByCache(MODEL_LIST_CACHE, "all#blog" + page + pageSize,
page, pageSize, "select id", "from blog order by type desc, id desc"));
}
public Page<Blog> normalByCatalogBlogList(int catalog_id, int page, int pageSize) {
return mk.loadModelPage(paginateByCache(MODEL_LIST_CACHE, "normal#catalog#" + catalog_id
+ "#blog" + page + pageSize, page, pageSize, "select id",
"from blog where catalog = ? order by id desc", catalog_id
));
}
public Page<Blog> normalByTagBlogList(int tag_id, int page, int pageSize) {
return mk.loadModelPage(paginateByCache(MODEL_LIST_CACHE, "normal#tag#" + tag_id +
"#blog" + page + pageSize, page, pageSize, "SELECT b.*", " from blog b ," +
"blog_tag bl where b.id = bl.blog_id and bl.tag_id = ? order by b.id",
tag_id
));
}
public List<Blog> allBlog() {
return mk.loadModel(findByCache(MODEL_LIST_CACHE, "all#blog",
"select id from blog order by id desc"));
}
public Blog prevBlog(int id) {
String sql = "select id from blog where id < ? order by id desc";
Blog blog = findFirstByCache(MODEL_LIST_CACHE, "prev" + id, sql, id);
if (blog != null)
return Get(blog.getInt("id"));
else return null;
}
public Blog nextBlog(int id) {
String sql = "select id from blog where id > ?";
Blog blog = findFirstByCache(MODEL_LIST_CACHE, "next" + id, sql, id);
if (blog != null)
return Get(blog.getInt("id"));
else return null;
}
public String content() {
return MarkdownKit.parse(this.getStr("content"));
}
public Catalog blogCatalog() {
return Catalog.dao.Get(this.getInt("catalog"));
}
public List<Tag> blogTags() {
List<Tag> tags = new ArrayList<>();
List<BlogTag> blogTags = BlogTag.dao.getBlogTagByBlog(this.getInt("id"));
if (CollectionUtils.isNotEmpty(blogTags)) {
for (BlogTag blogTag : blogTags) {
tags.add(Tag.dao.Get(blogTag.getInt("tag_id")));
}
}
return tags;
}
public Page<Comment> blogComment(int page, int pageSize, int blogId) {
return Comment.dao.getCommentListByBlog(page, pageSize, blogId);
}
public User owner() {
return User.dao.Get(this.getInt("owner_id"));
}
@Override
public int getId() {
return this.getInt("id");
}
@Override
public void setId(int id) {
this.set("id", id);
}
@Override
public float boost() {
return 1.0f;
}
@Override
public Map<String, Object> storeDatas() {
final Blog blog = this;
return new HashMap<String, Object>() {{
put("content", blog.get("content"));
}};
}
@Override
public Map<String, Object> indexDatas() {
final Blog blog = this;
return new HashMap<String, Object>() {{
put("title", blog.get("title"));
put("content", blog.get("content"));
List<BlogTag> blogTagList = BlogTag.dao.getBlogTagByBlog(blog.getInt("id"));
StringBuilder tagStr = new StringBuilder();
for (BlogTag blogTag : blogTagList) {
tagStr.append(Tag.dao.Get(blogTag.getInt("tag_id")).getStr("name"));
}
put("tags", tagStr);
}};
}
@Override
public int compareTo(Searchable o) {
int cid1 = this.getId();
int cid2 = o.getId();
return cid1 - cid2;
}
}