package fi.otavanopisto.muikku.dao.users;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Root;
import fi.otavanopisto.muikku.model.users.UserGroupEntity_;
import fi.otavanopisto.muikku.model.users.UserGroupUserEntity_;
import fi.otavanopisto.muikku.model.users.UserSchoolDataIdentifier_;
import fi.otavanopisto.muikku.dao.CoreDAO;
import fi.otavanopisto.muikku.model.base.SchoolDataSource;
import fi.otavanopisto.muikku.model.users.UserEntity;
import fi.otavanopisto.muikku.model.users.UserGroupEntity;
import fi.otavanopisto.muikku.model.users.UserGroupUserEntity;
import fi.otavanopisto.muikku.model.users.UserSchoolDataIdentifier;
public class UserGroupEntityDAO extends CoreDAO<UserGroupEntity> {
private static final long serialVersionUID = -2602347893195385174L;
public UserGroupEntity create(SchoolDataSource defaultSchoolDataSource, String defaultIdentifier, boolean archived) {
UserGroupEntity userGroup = new UserGroupEntity();
userGroup.setArchived(archived);
userGroup.setSchoolDataSource(defaultSchoolDataSource);
userGroup.setIdentifier(defaultIdentifier);
getEntityManager().persist(userGroup);
return userGroup;
}
public UserGroupEntity findByDataSourceAndIdentifier(SchoolDataSource schoolDataSource, String identifier) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<UserGroupEntity> criteria = criteriaBuilder.createQuery(UserGroupEntity.class);
Root<UserGroupEntity> root = criteria.from(UserGroupEntity.class);
criteria.select(root);
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(UserGroupEntity_.schoolDataSource), schoolDataSource),
criteriaBuilder.equal(root.get(UserGroupEntity_.identifier), identifier)
)
);
return getSingleResult(entityManager.createQuery(criteria));
}
public UserGroupEntity findByDataSourceAndIdentifierAndArchived(SchoolDataSource schoolDataSource, String identifier, Boolean archived) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<UserGroupEntity> criteria = criteriaBuilder.createQuery(UserGroupEntity.class);
Root<UserGroupEntity> root = criteria.from(UserGroupEntity.class);
criteria.select(root);
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(UserGroupEntity_.archived), archived),
criteriaBuilder.equal(root.get(UserGroupEntity_.schoolDataSource), schoolDataSource),
criteriaBuilder.equal(root.get(UserGroupEntity_.identifier), identifier)
)
);
return getSingleResult(entityManager.createQuery(criteria));
}
public UserGroupEntity updateArchived(UserGroupEntity userGroupEntity, Boolean archived) {
userGroupEntity.setArchived(archived);
return persist(userGroupEntity);
}
public List<UserGroupEntity> listByDataSource(SchoolDataSource schoolDataSource, Integer firstResult, Integer maxResults) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<UserGroupEntity> criteria = criteriaBuilder.createQuery(UserGroupEntity.class);
Root<UserGroupEntity> root = criteria.from(UserGroupEntity.class);
criteria.select(root);
criteria.where(
criteriaBuilder.equal(root.get(UserGroupEntity_.schoolDataSource), schoolDataSource)
);
TypedQuery<UserGroupEntity> query = entityManager.createQuery(criteria);
if (firstResult != null) {
query.setFirstResult(firstResult);
}
if (maxResults != null) {
query.setMaxResults(maxResults);
}
return query.getResultList();
}
public List<UserGroupEntity> listByArchived(Boolean archived) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<UserGroupEntity> criteria = criteriaBuilder.createQuery(UserGroupEntity.class);
Root<UserGroupEntity> root = criteria.from(UserGroupEntity.class);
criteria.select(root);
criteria.where(
criteriaBuilder.equal(root.get(UserGroupEntity_.archived), archived)
);
return entityManager.createQuery(criteria).getResultList();
}
public List<UserGroupEntity> listByUserIdentifierExcludeArchived(UserSchoolDataIdentifier userSchoolDataIdentifier) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<UserGroupEntity> criteria = criteriaBuilder.createQuery(UserGroupEntity.class);
Root<UserGroupUserEntity> root = criteria.from(UserGroupUserEntity.class);
Join<UserGroupUserEntity, UserGroupEntity> groupJoin = root.join(UserGroupUserEntity_.userGroupEntity);
criteria.select(root.get(UserGroupUserEntity_.userGroupEntity));
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(UserGroupUserEntity_.userSchoolDataIdentifier), userSchoolDataIdentifier),
criteriaBuilder.equal(groupJoin.get(UserGroupEntity_.archived), Boolean.FALSE),
criteriaBuilder.equal(root.get(UserGroupUserEntity_.archived), Boolean.FALSE)
)
);
return entityManager.createQuery(criteria).getResultList();
}
public List<UserGroupEntity> listByUserEntityExcludeArchived(UserEntity userEntity) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<UserGroupEntity> criteria = criteriaBuilder.createQuery(UserGroupEntity.class);
Root<UserGroupUserEntity> root = criteria.from(UserGroupUserEntity.class);
Join<UserGroupUserEntity, UserSchoolDataIdentifier> join = root.join(UserGroupUserEntity_.userSchoolDataIdentifier);
Join<UserGroupUserEntity, UserGroupEntity> join2 = root.join(UserGroupUserEntity_.userGroupEntity);
criteria.select(root.get(UserGroupUserEntity_.userGroupEntity));
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(join.get(UserSchoolDataIdentifier_.userEntity), userEntity),
criteriaBuilder.equal(join.get(UserSchoolDataIdentifier_.archived), Boolean.FALSE),
criteriaBuilder.equal(join2.get(UserGroupEntity_.archived), Boolean.FALSE),
criteriaBuilder.equal(root.get(UserGroupUserEntity_.archived), Boolean.FALSE)
)
);
return entityManager.createQuery(criteria).getResultList();
}
public Long countGroupUsers(UserGroupEntity userGroupEntity) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> criteria = criteriaBuilder.createQuery(Long.class);
Root<UserGroupUserEntity> root = criteria.from(UserGroupUserEntity.class);
criteria.select(criteriaBuilder.count(root));
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(UserGroupUserEntity_.userGroupEntity), userGroupEntity),
criteriaBuilder.equal(root.get(UserGroupUserEntity_.archived), Boolean.FALSE)
)
);
return entityManager.createQuery(criteria).getSingleResult();
}
public void delete(UserGroupEntity userGroupEntity){
super.delete(userGroupEntity);
}
}