uk.ac.ebi.bioinvindex.search.hibernatesearch.StudyFreeTextSearchImpl.java Source code

Java tutorial

Introduction

Here is the source code for uk.ac.ebi.bioinvindex.search.hibernatesearch.StudyFreeTextSearchImpl.java

Source

package uk.ac.ebi.bioinvindex.search.hibernatesearch;

/*
 * __________
 * CREDITS
 * __________
 *
 * Team page: http://isatab.sf.net/
 * - Marco Brandizi (software engineer: ISAvalidator, ISAconverter, BII data management utility, BII model)
 * - Eamonn Maguire (software engineer: ISAcreator, ISAcreator configurator, ISAvalidator, ISAconverter,  BII data management utility, BII web)
 * - Nataliya Sklyar (software engineer: BII web application, BII model,  BII data management utility)
 * - Philippe Rocca-Serra (technical coordinator: user requirements and standards compliance for ISA software, ISA-tab format specification, BII model, ISAcreator wizard, ontology)
 * - Susanna-Assunta Sansone (coordinator: ISA infrastructure design, standards compliance, ISA-tab format specification, BII model, funds raising)
 *
 * Contributors:
 * - Manon Delahaye (ISA team trainee:  BII web services)
 * - Richard Evans (ISA team trainee: rISAtab)
 *
 *
 * ______________________
 * Contacts and Feedback:
 * ______________________
 *
 * Project overview: http://isatab.sourceforge.net/
 *
 * To follow general discussion: isatab-devel@list.sourceforge.net
 * To contact the developers: isatools@googlegroups.com
 *
 * To report bugs: http://sourceforge.net/tracker/?group_id=215183&atid=1032649
 * To request enhancements:  http://sourceforge.net/tracker/?group_id=215183&atid=1032652
 *
 *
 * __________
 * License:
 * __________
 *
 * This work is licenced under the Creative Commons Attribution-Share Alike 2.0 UK: England & Wales License. To view a copy of this licence, visit http://creativecommons.org/licenses/by-sa/2.0/uk/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA.
 *
 * __________
 * Sponsors
 * __________
 * This work has been funded mainly by the EU Carcinogenomics (http://www.carcinogenomics.eu) [PL 037712] and in part by the
 * EU NuGO [NoE 503630](http://www.nugo.org/everyone) projects and in part by EMBL-EBI.
 */

import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermEnum;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.util.OpenBitSet;
import org.hibernate.Session;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.SearchFactory;
import org.hibernate.search.reader.ReaderProvider;
import org.hibernate.search.store.DirectoryProvider;

import uk.ac.ebi.bioinvindex.model.Study;
import uk.ac.ebi.bioinvindex.search.SearchException;
import uk.ac.ebi.bioinvindex.search.StudyFreeTextSearch;
import uk.ac.ebi.bioinvindex.dao.ejb3.DaoFactory;
import uk.ac.ebi.bioinvindex.dao.StudyDAO;

import javax.persistence.EntityManager;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

/**
 * @author Nataliya Sklyar (nsklyar@ebi.ac.uk) Date: Sep 14, 2007
 */
public class StudyFreeTextSearchImpl implements StudyFreeTextSearch {

    protected EntityManager entityManager;
    protected BIIQueryBuilder<Study> queryBuilder = new BIIQueryBuilder<Study>();
    protected boolean userFilter = false;

    public List<Map<StudyBrowseField, String[]>> getAllStudyBrowseFieldValues(BIIFilterQuery<Study> filterQuery) {
        SearchFactory searchFactory = getSession().getSearchFactory();

        DirectoryProvider directoryProvider = searchFactory.getDirectoryProviders(Study.class)[0];

        List<Map<StudyBrowseField, String[]>> answer = new ArrayList<Map<StudyBrowseField, String[]>>();

        if (filterQuery.getSearchText() != null && !filterQuery.getSearchText().equals("")) {
            //Search index
            search(filterQuery, directoryProvider, answer);

        } else {
            //Browse/filter Index
            browse(filterQuery, searchFactory, directoryProvider, answer);
        }
        return answer;
    }

    private void browse(BIIFilterQuery filterQuery, SearchFactory searchFactory,
            DirectoryProvider directoryProvider, List<Map<StudyBrowseField, String[]>> answer) {
        ReaderProvider readerProvider = searchFactory.getReaderProvider();
        IndexReader reader = readerProvider.openReader(directoryProvider);

        try {

            if (filterQuery.getFilters().size() > 0) {
                Filter filter = queryBuilder.buildFilter(filterQuery);

                DocIdSet docIdSet = filter.getDocIdSet(reader);

                DocIdSetIterator iterator = docIdSet.iterator();

                while (iterator.next()) {
                    int i = iterator.doc();

                    if (reader.isDeleted(i))
                        continue;

                    Document document = reader.document(i);
                    processDocument(answer, document);
                }

            } else {
                for (int i = 0; i < reader.maxDoc(); i++) {
                    if (reader.isDeleted(i))
                        continue;

                    Document document = reader.document(i);
                    processDocument(answer, document);

                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            readerProvider.closeReader(reader);
        }
    }

    private void search(BIIFilterQuery filterQuery, DirectoryProvider directoryProvider,
            List<Map<StudyBrowseField, String[]>> answer) {
        IndexSearcher indexSearcher = null;
        try {
            indexSearcher = new IndexSearcher(directoryProvider.getDirectory());

            Query query = queryBuilder.buildQuery(filterQuery.getSearchText());

            Hits hits;

            if (filterQuery.getFilters().size() > 0) {
                Filter filter = queryBuilder.buildFilter(filterQuery);
                hits = indexSearcher.search(query, filter);
            } else {
                hits = indexSearcher.search(query);
            }

            for (int i = 0; i < hits.length(); i++) {

                Document document = hits.doc(i);
                processDocument(answer, document);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        } finally {
            if (indexSearcher != null) {
                try {
                    indexSearcher.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private void processDocument(List<Map<StudyBrowseField, String[]>> answer, Document document) {

        Map<StudyBrowseField, String[]> row = buildRow(document);
        answer.add(row);
    }

    private Map<StudyBrowseField, String[]> buildRow(Document document) {
        Map<StudyBrowseField, String[]> row = new HashMap<StudyBrowseField, String[]>();

        addCellValue(StudyBrowseField.INVESTIGATION_ACC, row, document);
        addCellValue(StudyBrowseField.STUDY_ACC, row, document);
        addCellValue(StudyBrowseField.TITLE, row, document);
        addCellValue(StudyBrowseField.ORGANISM, row, document);
        addCellValue(StudyBrowseField.FACTOR_NAME, row, document);
        addCellValue(StudyBrowseField.ASSAY_INFO, row, document);
        return row;
    }

    private void addCellValue(StudyBrowseField field, Map<StudyBrowseField, String[]> row, Document document) {
        String[] strings = document.getValues(field.getName());
        if (strings != null) {
            row.put(field, strings);
        }
    }

    private FullTextSession getSession() {
        FullTextSession session;
        Session deligate = (Session) entityManager.getDelegate();

        if (deligate instanceof FullTextSession) {
            session = (FullTextSession) deligate;
        } else {
            session = Search.createFullTextSession(deligate);
        }
        return session;
    }

    //////////////////////////
    // Dependencies injection
    public EntityManager getEntityManager() {
        if (entityManager == null) {
            throw new IllegalStateException(
                    "EntityManager has not been set on StudyFreeTextSearchImpl before usage");
        }
        return entityManager;

    }

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

}