package com.lst.lc.dao.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.hibernate.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import com.lst.lc.dao.RankDao;
import com.lst.lc.dao.UserDao;
import com.lst.lc.entities.Blog;
import com.lst.lc.entities.BlogTag;
import com.lst.lc.entities.Course;
import com.lst.lc.entities.RelUser;
import com.lst.lc.entities.RelUserCourse;
import com.lst.lc.entities.RelUserCourseId;
import com.lst.lc.entities.RelUserId;
import com.lst.lc.entities.User;
import com.lst.lc.utils.SetUtils;
import com.lst.lc.utils.StringUtils;
@Repository("userDao")
public class UserDaoImpl extends BaseDao implements UserDao {
@Autowired
@Qualifier("rankDao")
private RankDao rankDao;
@Override
public void addUser(User user) {
save(user);
}
@Override
public void updateUser(User user) {
update(user);
}
@Override
public User getById(int userId) {
return get(User.class, userId);
}
@Override
public void deleteUser(User user) {
delete(user);
}
@Override
public User validateUser(String email, String password) {
String hql = "from User as user where user.email = ?";
List<User> users = query(hql).setString(0, email).list();
if (users.size() != 1)
return null;
else
return users.get(0);
}
@Override
public void addIntegral(int userId, int integral) {
String hql = "update User as user set user.integral = user.integral + ?, user.rank = ? where user.userId = ?";
String rank = rankDao.getRank(integral);
Query query = query(hql).setInteger(0, integral).setString(1, rank)
.setInteger(2, userId);
query.executeUpdate();
}
@Override
public boolean ifEmailExisted(String email) {
String hql = "from User as user where user.email = ?";
Query query = query(hql).setString(0, email);
List<User> users = query.list();
if (users.size() != 0)
return true;
return false;
}
@Override
public void update(int userId, String gender, String avatar, String motto,
String city) {
String hql = "update User as user set user.gender = ?, user.avatar = ?, user.motto = ?, user.city = ? where user.userId = ?";
Query query = query(hql);
query.setString(0, gender).setString(1, avatar).setString(2, motto)
.setString(3, city).setInteger(4, userId).executeUpdate();
}
@Override
public void learn(int userId, int courseId) {
User user = get(User.class, userId);
Course course = get(Course.class, courseId);
RelUserCourseId id = new RelUserCourseId(userId, courseId);
RelUserCourse userCourse = new RelUserCourse(id, course, user, new Date(), 0);
save(userCourse);
getSession().flush();
}
@Override
public List<User> getTopFive() {
String hql = "from User as user order by user.blogs.size desc";
Query query = query(hql).setMaxResults(5);
return query.list();
}
@Override
public void addRel(int uid1, int uid2) {
System.out.println("ddd");
RelUserId id = new RelUserId(uid1, uid2);
User user1 = getById(uid1);
User user2 = getById(uid2);
RelUser relUser = new RelUser(id, user1, user2, 0, new Date());
save(relUser);
getSession().flush();
}
@Override
public List<User> getFriends(int uid) {
User user = getById(uid);
List<User> users = SetUtils.mergeFriend(user.getRelUsersForUserId1(), user.getRelUsersForUserId2(), user, 1);
return users;
}
@Override
public List<User> getValidateFriends(int uid) {
User user = getById(uid);
Set<RelUser> set = user.getRelUsersForUserId2();
List<User> friends = new ArrayList<User>();
for(Iterator<RelUser> iterator = set.iterator(); iterator.hasNext();){
RelUser relUser = iterator.next();
if(relUser.getState() == 0){
friends.add(relUser.getUserByUserId1());
}
}
return friends;
}
@Override
public void validateFriend(int uid1, int uid2, int state) {
String hql = "update RelUser as relUser set relUser.state = ? where relUser.id.userId1 = ? and relUser.id.userId2 = ?";
Query query = query(hql).setInteger(0, state).setInteger(1, uid1).setInteger(2, uid2);
query.executeUpdate();
}
@Override
public boolean ifFriend(int uid1, int uid2) {
List<User> friends = getFriends(uid1);
User user = getById(uid2);
if(friends.contains(user))
return true;
return false;
}
@Override
public long count() {
String hql = "select count(*) from User";
Query query = query(hql);
long res = (long) query.uniqueResult();
return res;
}
@Override
public List<Map.Entry<String, Integer>> getTags(int uid) {
User user = getById(uid);
Set<Blog> blogs = user.getBlogs();
Map<String, Integer> tags = new HashMap<String, Integer>();
for(Iterator<Blog> iterator = blogs.iterator(); iterator.hasNext();){
Blog blog = iterator.next();
String t = blog.getTag();
List<String> ts = StringUtils.stringSplit(t, ",");
for(int i = 0; i < ts.size(); i++){
String tname = ts.get(i);
if(tags.containsKey(tname)){
tags.put(tname, tags.get(tname)+1);
}else{
tags.put(tname, 1);
}
}
}
List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(tags.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return (o2.getValue() - o1.getValue());
}
});
if(list.size() > 6){
return list.subList(0, 6);
}
return list;
}
}