INameService : added findByNameFuzzySearch method to search names by fuzzy matching
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / search / SearchResultBuilder.java
index 05b328aac761171da9097c64dfadc3be96693914..dee216f54ee97a7d9fea62ba8ac3852361ab72c8 100644 (file)
@@ -141,6 +141,60 @@ public class SearchResultBuilder implements ISearchResultBuilder {
 
         return searchResults;
     }
+    
+    /**
+     * {@inheritDoc}
+     *
+     */
+    public <T extends CdmBase> List<SearchResult<T>> createResultSet(TopDocs topDocs,
+                String[] highlightFields, ICdmEntityDao<T> dao, Map<CdmBaseType, String> idFields, List<String> propertyPaths) throws CorruptIndexException, IOException {
+
+        List<SearchResult<T>> searchResults = new ArrayList<SearchResult<T>>();
+
+        if(topDocs == null){
+            return searchResults;
+        }
+
+        SearchResultHighligther highlighter = null;
+        if(highlightFields  != null && highlightFields.length > 0){
+            highlighter = new SearchResultHighligther();
+        }
+
+        for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
+
+               String cdmEntityId = null;
+               SearchResult<T> searchResult = new SearchResult<T>();
+
+               Document document = luceneSearch.getSearcher().doc(scoreDoc.doc);
+               searchResult.addDoc(document);
+
+               if(cdmEntityId == null){                    
+                       cdmEntityId = findId(idFields, document);
+               }
+
+               //TODO use findByUuid(List<UUID> uuids, List<Criterion> criteria, List<String> propertyPaths)
+               //      instead or even better a similar findById(List<Integer> ids) however this is not yet implemented
+               if(cdmEntityId != null){
+                       T entity = dao.load(Integer.valueOf(cdmEntityId), propertyPaths);
+                       searchResult.setEntity(entity);
+               }
+               searchResult.setScore(scoreDoc.score);
+               searchResult.setMaxScore(scoreDoc.score);
+            // add highlight fragments
+            if(highlighter != null){
+                Map<String, String[]> fieldFragmentMap = null;
+                for(Document doc: searchResult.getDocs()){
+                    fieldFragmentMap = merge(fieldFragmentMap, highlighter.getFragmentsWithHighlightedTerms(luceneSearch.getAnalyzer(), query, highlightFields, doc, fragmentNumber, fragmentSize));
+                }
+                searchResult.setFieldHighlightMap(fieldFragmentMap);
+            }
+
+            // finally add the final result to the list
+            searchResults.add(searchResult);
+        }
+
+        return searchResults;
+    }
 
     /**
      * @param base