ome.services.db.SearchTest.java Source code

Java tutorial

Introduction

Here is the source code for ome.services.db.SearchTest.java

Source

/*
 *   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;
    }

}