package fi.otavanopisto.pyramus.dao.grading;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import org.apache.commons.lang.StringUtils;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.Query;
import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.jpa.FullTextQuery;
import org.hibernate.search.jpa.Search;
import fi.otavanopisto.pyramus.dao.PyramusEntityDAO;
import fi.otavanopisto.pyramus.domainmodel.base.CourseOptionality;
import fi.otavanopisto.pyramus.domainmodel.base.Curriculum;
import fi.otavanopisto.pyramus.domainmodel.base.EducationalLength;
import fi.otavanopisto.pyramus.domainmodel.base.EducationalTimeUnit;
import fi.otavanopisto.pyramus.domainmodel.base.Subject;
import fi.otavanopisto.pyramus.domainmodel.grading.TransferCreditTemplate;
import fi.otavanopisto.pyramus.domainmodel.grading.TransferCreditTemplateCourse;
import fi.otavanopisto.pyramus.domainmodel.grading.TransferCreditTemplateCourse_;
import fi.otavanopisto.pyramus.persistence.search.SearchResult;
@Stateless
public class TransferCreditTemplateCourseDAO extends PyramusEntityDAO<TransferCreditTemplateCourse> {
@SuppressWarnings("unchecked")
public SearchResult<TransferCreditTemplateCourse> searchTransferCreditTemplateCoursesBasic(int resultsPerPage, int page, String text) {
int firstResult = page * resultsPerPage;
StringBuilder queryBuilder = new StringBuilder();
if (!StringUtils.isBlank(text)) {
queryBuilder.append("+(");
addTokenizedSearchCriteria(queryBuilder, "courseName", text, false);
queryBuilder.append(")");
}
EntityManager entityManager = getEntityManager();
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
try {
String queryString = queryBuilder.toString();
Query luceneQuery;
QueryParser parser = new QueryParser("", new StandardAnalyzer());
if (StringUtils.isBlank(queryString)) {
luceneQuery = new MatchAllDocsQuery();
} else {
luceneQuery = parser.parse(queryString);
}
FullTextQuery query = (FullTextQuery) fullTextEntityManager.createFullTextQuery(luceneQuery, TransferCreditTemplateCourse.class)
.setFirstResult(firstResult)
.setMaxResults(resultsPerPage);
int hits = query.getResultSize();
int pages = hits / resultsPerPage;
if (hits % resultsPerPage > 0) {
pages++;
}
int lastResult = Math.min(firstResult + resultsPerPage, hits) - 1;
return new SearchResult<>(page, pages, hits, firstResult, lastResult, query.getResultList());
} catch (ParseException e) {
throw new PersistenceException(e);
}
}
/* TransferCreditTemplateCourse */
public TransferCreditTemplateCourse create(TransferCreditTemplate transferCreditTemplate, String courseName, Integer courseNumber, CourseOptionality optionality, Double courseLength, EducationalTimeUnit courseLengthUnit, Subject subject, Curriculum curriculum) {
EntityManager entityManager = getEntityManager();
EducationalLength courseEductionalLength = new EducationalLength();
courseEductionalLength.setUnits(courseLength);
courseEductionalLength.setUnit(courseLengthUnit);
entityManager.persist(courseEductionalLength);
TransferCreditTemplateCourse transferCreditTemplateCourse = new TransferCreditTemplateCourse();
transferCreditTemplateCourse.setCourseLength(courseEductionalLength);
transferCreditTemplateCourse.setCourseName(courseName);
transferCreditTemplateCourse.setCourseNumber(courseNumber);
transferCreditTemplateCourse.setOptionality(optionality);
transferCreditTemplateCourse.setSubject(subject);
transferCreditTemplateCourse.setCurriculum(curriculum);
entityManager.persist(transferCreditTemplateCourse);
transferCreditTemplate.addCourse(transferCreditTemplateCourse);
entityManager.persist(transferCreditTemplate);
return transferCreditTemplateCourse;
}
public TransferCreditTemplateCourse update(TransferCreditTemplateCourse transferCreditTemplateCourse, String courseName, Integer courseNumber, CourseOptionality optionality, Double courseLength, EducationalTimeUnit courseLengthUnit, Subject subject, Curriculum curriculum) {
EntityManager entityManager = getEntityManager();
EducationalLength educationalLength = transferCreditTemplateCourse.getCourseLength();
educationalLength.setUnits(courseLength);
educationalLength.setUnit(courseLengthUnit);
entityManager.persist(educationalLength);
transferCreditTemplateCourse.setCourseName(courseName);
transferCreditTemplateCourse.setCourseNumber(courseNumber);
transferCreditTemplateCourse.setOptionality(optionality);
transferCreditTemplateCourse.setSubject(subject);
transferCreditTemplateCourse.setCurriculum(curriculum);
entityManager.persist(transferCreditTemplateCourse);
return transferCreditTemplateCourse;
}
public List<TransferCreditTemplateCourse> listByTemplate(TransferCreditTemplate template) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<TransferCreditTemplateCourse> criteria = criteriaBuilder.createQuery(TransferCreditTemplateCourse.class);
Root<TransferCreditTemplateCourse> root = criteria.from(TransferCreditTemplateCourse.class);
criteria.select(root);
criteria.where(
criteriaBuilder.equal(root.get(TransferCreditTemplateCourse_.transferCreditTemplate), template)
);
return entityManager.createQuery(criteria).getResultList();
}
@Override
public void delete(TransferCreditTemplateCourse transferCreditTemplateCourse) {
super.delete(transferCreditTemplateCourse);
}
}