package fi.otavanopisto.pyramus.dao.help;
import java.util.Date;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;
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.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.jpa.FullTextQuery;
import org.hibernate.search.jpa.Search;
import fi.otavanopisto.pyramus.dao.DAOFactory;
import fi.otavanopisto.pyramus.dao.PyramusEntityDAO;
import fi.otavanopisto.pyramus.domainmodel.help.HelpFolder;
import fi.otavanopisto.pyramus.domainmodel.help.HelpPage;
import fi.otavanopisto.pyramus.domainmodel.help.HelpPageContent;
import fi.otavanopisto.pyramus.domainmodel.users.User;
import fi.otavanopisto.pyramus.persistence.search.SearchResult;
@Stateless
public class HelpPageDAO extends PyramusEntityDAO<HelpPage> {
@SuppressWarnings("unchecked")
public SearchResult<HelpPage> searchHelpPagesBasic(int resultsPerPage, int page, String text) {
int firstResult = page * resultsPerPage;
StringBuilder queryBuilder = new StringBuilder();
if (!StringUtils.isBlank(text)) {
queryBuilder.append("+(");
addTokenizedSearchCriteria(queryBuilder, "titles.title", text, false);
addTokenizedSearchCriteria(queryBuilder, "tags.text", text, false);
addTokenizedSearchCriteria(queryBuilder, "contents.content", text, false);
queryBuilder.append(")");
}
EntityManager entityManager = getEntityManager();
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
QueryParser parser = new QueryParser("", new StandardAnalyzer());
String queryString = queryBuilder.toString();
Query luceneQuery;
try {
if (StringUtils.isBlank(queryString)) {
luceneQuery = new MatchAllDocsQuery();
} else {
luceneQuery = parser.parse(queryString);
}
FullTextQuery query = (FullTextQuery) fullTextEntityManager.createFullTextQuery(luceneQuery, HelpPage.class)
.setSort(new Sort(new SortField[]{ new SortField("recursiveIndex", SortField.Type.STRING) }))
.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);
}
}
public HelpPage create(HelpFolder parent, Integer indexColumn, User creatingUser) {
EntityManager entityManager = getEntityManager();
Date now = new Date(System.currentTimeMillis());
HelpPage helpPage = new HelpPage();
helpPage.setCreated(now);
helpPage.setLastModified(now);
helpPage.setCreator(creatingUser);
helpPage.setLastModifier(creatingUser);
helpPage.setParent(parent);
helpPage.setIndexColumn(indexColumn);
entityManager.persist(helpPage);
return helpPage;
}
@Override
public void delete(HelpPage helpPage) {
HelpPageContentDAO helpPageContentDAO = DAOFactory.getInstance().getHelpPageContentDAO();
HelpItemDAO helpItemDAO = DAOFactory.getInstance().getHelpItemDAO();
HelpPageContent[] contents = helpPage.getContents().toArray(new HelpPageContent[0]);
for (int i = 0, l = contents.length; i < l; i++) {
helpPageContentDAO.delete(contents[i]);
}
helpItemDAO.delete(helpPage);
}
}