package org.openmrs.api.db.hibernate;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.Query;
import org.apache.lucene.util.Version;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.openmrs.Person;
import org.openmrs.api.db.SearchDAO;
import org.openmrs.api.search.SearchParser;
import org.openmrs.util.OpenmrsConstants;
public class HibernateSearchDAO implements SearchDAO {
private SearchParser parser;
private SessionFactory sessionFactory;
private FullTextSession fullTextSession;
protected final Log log = LogFactory.getLog(getClass());
private Class entity;
private FullTextSession getFullTextSession() {
if (fullTextSession == null)
this.openFullTextSession();
return fullTextSession;
}
@Override
public void openFullTextSession() {
fullTextSession = Search.getFullTextSession(sessionFactory.getCurrentSession());
}
@Override
public void closeFullTextSession() {
fullTextSession.close();
}
@Override
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
public SessionFactory getSessionFactory() {
return sessionFactory;
}
@Override
public void indexExistingData() {
try {
this.getFullTextSession().createIndexer().startAndWait();
}
catch (InterruptedException e) {
log.debug(e);
}
}
@Override
public void setSearchParser(SearchParser parser) {
this.parser = parser;
}
@Override
public SearchParser getSearchParser() {
return parser;
}
@Override
public List search(String param, Class clazz, String[] fields) {
this.openFullTextSession();
Query query = null;
List result = null;
try {
query = new MultiFieldQueryParser(OpenmrsConstants.LUCENE_VERSION, fields, new StandardAnalyzer(
OpenmrsConstants.LUCENE_VERSION)).parse(param);
// wrap Lucene query in a org.hibernate.Query
org.hibernate.Query hibQuery = this.getFullTextSession().createFullTextQuery(query, clazz);
// execute search
result = hibQuery.list();
}
catch (ParseException e) {
e.printStackTrace();
}
return result;
}
public List search(String searchString) {
if (fullTextSession == null)
this.openFullTextSession();
return this.getFullTextSession().createFullTextQuery(parser.parse(searchString), entity).list();
}
@Override
public List search() {
this.openFullTextSession();
// wrap Lucene query in a org.hibernate.Query
org.hibernate.Query hibQuery = this.getFullTextSession().createFullTextQuery((Query) getSearchParser(), getEntity());
List result = hibQuery.list();
return result;
}
@Override
public void setEntity(Class entity) {
this.entity = entity;
}
@Override
public Class getEntity() {
return entity;
}
}