/*
* Copyright (C) 2010-2011 Glencoe Software, Inc. All rights reserved.
* Use is subject to license terms supplied in LICENSE.txt
*/
package ome.services.db;
import java.util.List;
import junit.framework.TestCase;
import ome.model.IObject;
import ome.model.meta.Event;
import ome.model.meta.Experimenter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.hibernate.CacheMode;
import org.hibernate.FlushMode;
import org.hibernate.Query;
import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
import org.hibernate.Transaction;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.testng.annotations.Test;
@Test( groups = "integration" )
public class SearchTest extends TestCase {
private static Logger log = LoggerFactory.getLogger(SearchTest.class);
@Test
public void testEvent() throws Exception {
HibernateTest ht = new HibernateTest();
ht.setupSession();
ht.createEvent();
ht.closeSession();
ht.setupSession();
String queryStr = "manual";
List<Event> list = query(ht, queryStr, Event.class, "status");
assertTrue(list.size() > 0);
}
@Test
public void testReindexingExperimenter() throws Exception {
HibernateTest ht = new HibernateTest();
ht.setupSession();
FullTextSession fullTextSession = Search.getFullTextSession(ht.s);
fullTextSession.setFlushMode(FlushMode.MANUAL);
fullTextSession.setCacheMode(CacheMode.IGNORE);
Transaction transaction = fullTextSession.beginTransaction();
// Scrollable results will avoid loading too many objects in memory
ScrollableResults results = fullTextSession.createCriteria(
Experimenter.class).scroll(ScrollMode.FORWARD_ONLY);
int index = 0;
int batchSize = 10;
while (results.next()) {
index++;
fullTextSession.index(results.get(0)); // index each element
if (index % batchSize == 0) {
ht.s.clear(); // clear every batchSize since the queue is
// processed
}
}
ht.closeSession();
ht.setupSession();
List<Experimenter> list = query(ht, "root", Experimenter.class,
"omeName");
assertTrue(list.toString(), list.size() == 1);
ht.closeSession();
}
@Test
public void testMultipleClassSearch() throws Exception {
HibernateTest ht = new HibernateTest();
ht.setupSession();
String queryStr = "root OR manual";
QueryParser qp = new MultiFieldQueryParser(new String[] { "omeName",
"status" }, new StandardAnalyzer());
org.apache.lucene.search.Query lq = qp.parse(queryStr);
FullTextSession fts = Search.getFullTextSession(ht.s);
Query q = fts.createFullTextQuery(lq, Event.class, Experimenter.class);
List list = q.list();
assertTrue(list.toString(), list.size() > 1);
ht.closeSession();
}
// ===========================================================
private <T extends IObject> List<T> query(HibernateTest ht,
String queryStr, Class<T> k, String... fields)
throws ParseException {
MultiFieldQueryParser parser = new MultiFieldQueryParser(fields,
new StandardAnalyzer());
org.apache.lucene.search.Query luceneQuery = parser.parse(queryStr);
FullTextSession fts = Search.getFullTextSession(ht.s);
Query q = fts.createFullTextQuery(luceneQuery, k);
List<T> list = q.list();
return list;
}
}