package com.xiaozhi.blog.mongo;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;
import com.google.common.collect.ArrayListMultimap;
import com.xiaozhi.blog.utils.KeyUtils;
import com.xiaozhi.blog.utils.ListPage;
import com.xiaozhi.blog.utils.UserGroupHelper;
import com.xiaozhi.blog.vo.Range;
import com.xiaozhi.blog.vo.User;
import com.xiaozhi.blog.vo.UserGroup;
@Repository
public class MongoFollowerDao {
private static Log logger = LogFactory.getLog(MongoFollowerDao.class);
@Autowired
private StringRedisTemplate template;
@Autowired
private MongoTemplate mongoTemplate;
/**
* 分页获取粉丝列表
* @param uid
* @return
*/
public List<User> getFollowerByPage(String uid, Range range) {
//当前页用户集合
List<String> ids= template.opsForList().range(KeyUtils.followers(uid), range.being, range.end-range.being+1);
List<String> followings= template.opsForList().range(KeyUtils.following(uid),0,-1);
List<User> users = this.mongoTemplate.find(new Query(Criteria.where("id").in(ids.toArray())),User.class);
for(User user :users){
if(followings.contains(user.getId().toString())){//判断是否相互关注
user.setLink(true);
}else{
user.setLink(false);
}
}
return users;
}
/**
* 分页获取粉丝列表(共同关注 我关注的人也关注他)
* @param uid
* @return
*/
private List<User> getFollowers(String uid,List<String> ids, Range range) {
if(ids==null || ids.isEmpty())return null;
//当前页用户集合
List<String> pagekeysList=ids.subList(range.being, (range.end+1)>ids.size()?ids.size():(range.end+1));
List<String> followings= template.opsForList().range(KeyUtils.following(uid),0,-1);
List<User> users = this.mongoTemplate.find(new Query(Criteria.where("id").in(pagekeysList.toArray())),User.class);
for(User user :users){
if(followings.contains(user.getId().toString())){//判断是否相互关注
user.setLink(true);
}else{
user.setLink(false);
}
}
return users;
}
/**
* 返回总粉丝数
* @param uid
* @return
*/
public int getFollowersNum(String uid){
return template.opsForList().size(KeyUtils.followers(uid)).intValue();
}
/**
* 我关注的人关注他的人
* @param uid
* @param targetUid
* @return
*/
public ListPage<User> alsoFollowed(String uid, String targetUid,Integer page,Integer pagesize) {
List<String> followings = following(uid);
followings.retainAll(followers(targetUid));//交集
int firstResult = (page-1)*pagesize;
int lastResult = (page-1)*pagesize+pagesize-1;
int allResults = followings.size();
List<User> users=this.getFollowers(uid, followings, new Range(firstResult,lastResult));
return new ListPage<User>(users, firstResult, lastResult, allResults);
}
/**
* 我和他共同关注的人
* @param uid
* @param targetUid
* @return
*/
public ListPage<User> commonFollowers(String uid, String targetUid,Integer page,Integer pagesize) {
List<String> followings = following(uid);
followings.retainAll(following(targetUid));//交集
int firstResult = (page-1)*pagesize;
int lastResult = (page-1)*pagesize+pagesize-1;
int allResults = followings.size();
List<User> users=this.getFollowers(uid, followings, new Range(firstResult,lastResult));
return new ListPage<User>(users, firstResult, lastResult, allResults);
}
private List<String> following(String uid) {
return template.opsForList().range(KeyUtils.following(uid), 0, -1);
}
private List<String> followers(String uid) {
return template.opsForList().range(KeyUtils.followers(uid), 0, -1);
}
}