missing bits for #476: Implement free-text search methods for TaxonBase and TextData
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / search / SearchResultBuilder.java
1 // $Id$
2 /**
3 * Copyright (C) 2012 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10 package eu.etaxonomy.cdm.api.service.search;
11
12 import java.io.IOException;
13 import java.util.ArrayList;
14 import java.util.HashSet;
15 import java.util.List;
16 import java.util.Set;
17 import java.util.UUID;
18
19 import org.apache.lucene.document.Document;
20 import org.apache.lucene.index.CorruptIndexException;
21 import org.apache.lucene.search.ScoreDoc;
22 import org.apache.lucene.search.TopDocs;
23 import org.hibernate.criterion.Criterion;
24 import org.springframework.stereotype.Component;
25
26 import eu.etaxonomy.cdm.model.common.CdmBase;
27 import eu.etaxonomy.cdm.persistence.dao.common.ICdmEntityDao;
28 import eu.etaxonomy.cdm.search.LuceneSearch;
29
30 /**
31 * @author Andreas Kohlbecker
32 * @date Jan 6, 2012
33 *
34 */
35 @Component
36 public class SearchResultBuilder implements ISearchResultBuilder {
37
38 /* (non-Javadoc)
39 * @see eu.etaxonomy.cdm.api.service.search.ISearchResultBuilder#createResultSetFromIds(eu.etaxonomy.cdm.search.LuceneSearch, org.apache.lucene.search.TopDocs, eu.etaxonomy.cdm.persistence.dao.common.ICdmEntityDao, java.lang.String)
40 */
41 /**
42 * @param luceneSearch
43 * @param topDocsResultSet
44 * @param dao
45 * @param idField
46 * @return
47 * @throws CorruptIndexException
48 * @throws IOException
49 */
50 public <T extends CdmBase> List<SearchResult<T>> createResultSetFromIds(LuceneSearch luceneSearch, TopDocs topDocsResultSet,
51 ICdmEntityDao<T> dao, String idField, List<String> propertyPaths) throws CorruptIndexException, IOException {
52
53 List<SearchResult<T>> searchResults = new ArrayList<SearchResult<T>>();
54
55 for (ScoreDoc scoreDoc : topDocsResultSet.scoreDocs) {
56 Document doc = luceneSearch.getSearcher().doc(scoreDoc.doc);
57 String[] idStrings = doc.getValues(idField);
58 SearchResult<T> searchResult = new SearchResult<T>(doc);
59 //TODO use findByUuid(List<UUID> uuids, List<Criterion> criteria, List<String> propertyPaths)
60 // instead or even better a similar findById(List<Integer> ids) however this is not yet implemented
61 if(idStrings.length > 0){
62 T entity = dao.load(Integer.valueOf(idStrings[0]), propertyPaths);
63 searchResult.setEntity(entity);
64 }
65 searchResults.add(searchResult);
66 }
67
68 return searchResults;
69 }
70
71 }