package fi.otavanopisto.muikku.plugins.workspace.dao;
import java.util.Collections;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterial_;
import fi.otavanopisto.muikku.plugins.CorePluginsDAO;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterial;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterialAssignmentType;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterialCorrectAnswersDisplay;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceNode;
public class WorkspaceMaterialDAO extends CorePluginsDAO<WorkspaceMaterial> {
private static final long serialVersionUID = -1777382212388116832L;
public WorkspaceMaterial create(WorkspaceNode parent, long materialId, String title, String urlName, Integer orderNumber,
Boolean hidden, WorkspaceMaterialAssignmentType assignmentType, WorkspaceMaterialCorrectAnswersDisplay correctAnswers) {
WorkspaceMaterial workspaceMaterial = new WorkspaceMaterial();
workspaceMaterial.setParent(parent);
workspaceMaterial.setMaterialId(materialId);
workspaceMaterial.setUrlName(urlName);
workspaceMaterial.setOrderNumber(orderNumber);
workspaceMaterial.setHidden(hidden);
workspaceMaterial.setAssignmentType(assignmentType);
workspaceMaterial.setCorrectAnswers(correctAnswers);
workspaceMaterial.setTitle(title);
return persist(workspaceMaterial);
}
public List<WorkspaceMaterial> listByParent(WorkspaceNode parent) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<WorkspaceMaterial> criteria = criteriaBuilder.createQuery(WorkspaceMaterial.class);
Root<WorkspaceMaterial> root = criteria.from(WorkspaceMaterial.class);
criteria.select(root);
criteria.where(
criteriaBuilder.equal(root.get(WorkspaceMaterial_.parent), parent)
);
return entityManager.createQuery(criteria).getResultList();
}
public List<WorkspaceMaterial> listByHiddenAndAssignmentTypeAndParents(Boolean hidden, WorkspaceMaterialAssignmentType assignmentType, List<WorkspaceNode> parents) {
if (parents == null || parents.isEmpty()) {
return Collections.emptyList();
}
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<WorkspaceMaterial> criteria = criteriaBuilder.createQuery(WorkspaceMaterial.class);
Root<WorkspaceMaterial> root = criteria.from(WorkspaceMaterial.class);
criteria.select(root);
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(WorkspaceMaterial_.hidden), hidden),
criteriaBuilder.equal(root.get(WorkspaceMaterial_.assignmentType), assignmentType),
root.get(WorkspaceMaterial_.parent).in(parents)
)
);
return entityManager.createQuery(criteria).getResultList();
}
public Long countByHiddenAndAssignmentTypeAndParents(Boolean hidden, WorkspaceMaterialAssignmentType assignmentType, List<WorkspaceNode> parents) {
if (parents == null || parents.isEmpty()) {
return 0L;
}
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> criteria = criteriaBuilder.createQuery(Long.class);
Root<WorkspaceMaterial> root = criteria.from(WorkspaceMaterial.class);
criteria.select(criteriaBuilder.count(root));
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(WorkspaceMaterial_.hidden), hidden),
criteriaBuilder.equal(root.get(WorkspaceMaterial_.assignmentType), assignmentType),
root.get(WorkspaceMaterial_.parent).in(parents)
)
);
return entityManager.createQuery(criteria).getSingleResult();
}
public WorkspaceMaterial findByFolderAndUrlName(WorkspaceNode parent, String urlName) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<WorkspaceMaterial> criteria = criteriaBuilder.createQuery(WorkspaceMaterial.class);
Root<WorkspaceMaterial> root = criteria.from(WorkspaceMaterial.class);
criteria.select(root);
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(WorkspaceMaterial_.parent), parent),
criteriaBuilder.equal(root.get(WorkspaceMaterial_.urlName), urlName)
)
);
return getSingleResult(entityManager.createQuery(criteria));
}
public List<WorkspaceMaterial> listByMaterialId(long materialId) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<WorkspaceMaterial> criteria = criteriaBuilder.createQuery(WorkspaceMaterial.class);
Root<WorkspaceMaterial> root = criteria.from(WorkspaceMaterial.class);
criteria.select(root);
criteria.where(
criteriaBuilder.equal(root.get(WorkspaceMaterial_.materialId), materialId)
);
return entityManager.createQuery(criteria).getResultList();
}
public List<WorkspaceMaterial> listByParentAndAssignmentType(WorkspaceNode parent, WorkspaceMaterialAssignmentType assignmentType) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<WorkspaceMaterial> criteria = criteriaBuilder.createQuery(WorkspaceMaterial.class);
Root<WorkspaceMaterial> root = criteria.from(WorkspaceMaterial.class);
criteria.select(root);
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(WorkspaceMaterial_.assignmentType), assignmentType),
criteriaBuilder.equal(root.get(WorkspaceMaterial_.parent), parent)
)
);
return entityManager.createQuery(criteria).getResultList();
}
public WorkspaceMaterial updateMaterialId(WorkspaceMaterial workspaceMaterial, long materialId) {
workspaceMaterial.setMaterialId(materialId);
return persist(workspaceMaterial);
}
public WorkspaceMaterial updateUrlName(WorkspaceMaterial workspaceMaterial, String urlName) {
workspaceMaterial.setUrlName(urlName);
return persist(workspaceMaterial);
}
public WorkspaceMaterial updateAssignmentType(WorkspaceMaterial workspaceMaterial, WorkspaceMaterialAssignmentType assignmentType) {
workspaceMaterial.setAssignmentType(assignmentType);
return persist(workspaceMaterial);
}
public WorkspaceMaterial updateCorrectAnswers(WorkspaceMaterial workspaceMaterial, WorkspaceMaterialCorrectAnswersDisplay correctAnswers) {
workspaceMaterial.setCorrectAnswers(correctAnswers);
return persist(workspaceMaterial);
}
public void delete(WorkspaceMaterial workspaceMaterial) {
super.delete(workspaceMaterial);
}
}