a bit more cleaning up
authorAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Thu, 20 Sep 2012 16:59:25 +0000 (16:59 +0000)
committerAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Thu, 20 Sep 2012 16:59:25 +0000 (16:59 +0000)
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/search/QueryFactory.java

index 8f42471185b59ef2e0a56b7ba0d3a0f5bba4c9c2..beb58134b1fb3c581363cba49f01a47b690821bf 100644 (file)
@@ -1155,99 +1155,64 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
             directorySelectClass = clazz;\r
         }\r
 \r
-//        queryString = queryString.toLowerCase();\r
 \r
-        StringBuilder luceneQueryTemplate = new StringBuilder();\r
         BooleanQuery finalQuery = new BooleanQuery();\r
         BooleanQuery textQuery = new BooleanQuery();\r
-        Set<String> freetextFields = new HashSet<String>();\r
 \r
         LuceneSearch luceneSearch = new LuceneSearch(getSession(), directorySelectClass);\r
-        QueryFactory queryBuilder = new QueryFactory(luceneSearch);\r
+        QueryFactory queryFactory = new QueryFactory(luceneSearch);\r
 \r
         // ---- search criteria\r
-\r
-//        luceneQueryTemplate.append("+(");\r
-//        luceneQueryTemplate.append("titleCache:(%1$s) ");\r
-        freetextFields.add("titleCache");\r
-        textQuery.add(queryBuilder.newTermQuery("titleCache", queryString), Occur.SHOULD);\r
+        textQuery.add(queryFactory.newTermQuery("titleCache", queryString), Occur.SHOULD);\r
 \r
         // common name\r
-        freetextFields.add("name");\r
-\r
         Query nameQuery;\r
         if(languages == null || languages.size() == 0){\r
-//            luceneQueryTemplate.append("name:(%1$s) ");\r
-            nameQuery = queryBuilder.newTermQuery("name", queryString);\r
+            nameQuery = queryFactory.newTermQuery("name", queryString);\r
         } else {\r
             nameQuery = new BooleanQuery();\r
             BooleanQuery languageSubQuery = new BooleanQuery();\r
-//            luceneQueryTemplate.append("(+name:(%1$s) ");\r
             for(Language lang : languages){\r
-//             luceneQueryTemplate.append(" +language.uuid:" + lang.getUuid().toString());\r
-                languageSubQuery.add(queryBuilder.newTermQuery("language.uuid",  lang.getUuid().toString()), Occur.SHOULD);\r
+                languageSubQuery.add(queryFactory.newTermQuery("language.uuid",  lang.getUuid().toString()), Occur.SHOULD);\r
             }\r
-            ((BooleanQuery) nameQuery).add(queryBuilder.newTermQuery("name", queryString), Occur.MUST);\r
+            ((BooleanQuery) nameQuery).add(queryFactory.newTermQuery("name", queryString), Occur.MUST);\r
             ((BooleanQuery) nameQuery).add(languageSubQuery, Occur.MUST);\r
-//            luceneQueryTemplate.append(")");\r
         }\r
         textQuery.add(nameQuery, Occur.SHOULD);\r
 \r
 \r
         // text field from TextData\r
-        freetextFields.add("text.ALL");\r
-//        appendLocalizedFieldQuery("text", languages, luceneQueryTemplate).append(" ");\r
-        textQuery.add(queryBuilder.newLocalizedTermQuery("text", queryString, languages), Occur.SHOULD);\r
+        textQuery.add(queryFactory.newLocalizedTermQuery("text", queryString, languages), Occur.SHOULD);\r
 \r
         // --- TermBase fields - by representation ----\r
         // state field from CategoricalData\r
-        freetextFields.add("states.state.representation.ALL");\r
-//        appendLocalizedFieldQuery("states.state.representation", languages, luceneQueryTemplate).append(" ");\r
-        textQuery.add(queryBuilder.newLocalizedTermQuery("states.state.representation", queryString, languages), Occur.SHOULD);\r
+        textQuery.add(queryFactory.newLocalizedTermQuery("states.state.representation", queryString, languages), Occur.SHOULD);\r
 \r
         // state field from CategoricalData\r
-        freetextFields.add("states.modifyingText.ALL");\r
-//        appendLocalizedFieldQuery("states.modifyingText", languages, luceneQueryTemplate).append(" ");\r
-        textQuery.add(queryBuilder.newLocalizedTermQuery("states.modifyingText", queryString, languages), Occur.SHOULD);\r
-//        luceneQueryTemplate.append(") ");\r
+        textQuery.add(queryFactory.newLocalizedTermQuery("states.modifyingText", queryString, languages), Occur.SHOULD);\r
 \r
         finalQuery.add(textQuery, Occur.MUST);\r
         // --- classification ----\r
 \r
         if(classification != null){\r
-//            luceneQueryTemplate.append("+inDescription.taxon.taxonNodes.classification.id:").append(PaddedIntegerBridge.paddInteger(classification.getId())).append(" ");\r
-            finalQuery.add(queryBuilder.newEntityIdQuery("inDescription.taxon.taxonNodes.classification.id", classification), Occur.MUST);\r
+            finalQuery.add(queryFactory.newEntityIdQuery("inDescription.taxon.taxonNodes.classification.id", classification), Occur.MUST);\r
         }\r
 \r
         // --- IdentifieableEntity fields - by uuid\r
         if(features != null && features.size() > 0 ){\r
-            finalQuery.add(queryBuilder.newEntityUuidQuery("feature.uuid", features), Occur.MUST);\r
-//            luceneQueryTemplate.append("+feature.uuid:(");\r
-//            for(Feature feature : features){\r
-//                luceneQueryTemplate.append(feature.getUuid()).append(" ");\r
-//            }\r
-//            luceneQueryTemplate.append(") ");\r
+            finalQuery.add(queryFactory.newEntityUuidQuery("feature.uuid", features), Occur.MUST);\r
         }\r
 \r
         // the description must be associated with a taxon\r
-//        luceneQueryTemplate.append("+inDescription.taxon.id:[ " + PaddedIntegerBridge.paddInteger(0) + " TO " + PaddedIntegerBridge.paddInteger(Integer.MAX_VALUE) + "] ");\r
-        //luceneQueryTemplate.append("-inDescription.taxon.id:" + PaddedIntegerBridge.NULL_STRING);\r
-        finalQuery.add(queryBuilder.newIdNotNullQuery("inDescription.taxon.id"), Occur.MUST);\r
-\r
-//        String luceneQueryStr = String.format(luceneQueryTemplate.toString(), queryString);\r
+        finalQuery.add(queryFactory.newIdNotNullQuery("inDescription.taxon.id"), Occur.MUST);\r
 \r
-        // --- sort fields\r
         SortField[] sortFields = new  SortField[]{SortField.FIELD_SCORE, new SortField("inDescription.taxon.titleCache__sort", false)};\r
 \r
-        // ---- execute criteria\r
-\r
-\r
-//        Query luceneQuery = luceneSearch.parse(luceneQueryStr);\r
         TopDocs topDocsResultSet = luceneSearch.executeSearch(finalQuery, clazz, pageSize, pageNumber, sortFields);\r
 \r
         String[] highlightFields = null;\r
         if(highlightFragments){\r
-            highlightFields = freetextFields.toArray(new String[freetextFields.size()]);\r
+            highlightFields = queryFactory.getTextFieldNames().toArray(new String[queryFactory.getTextFieldNames().size()]);\r
         }\r
 \r
         // initialize taxa, thighlight matches ....\r
index 125ccfda111c1770065ee0415417f9ad469146c7..a2481f2c726ac44fe68495fbb5d586f81da43992 100644 (file)
@@ -9,8 +9,9 @@
 */
 package eu.etaxonomy.cdm.api.service.search;
 
-import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.log4j.Logger;
 import org.apache.lucene.index.Term;
@@ -40,20 +41,30 @@ public class QueryFactory {
 
     private LuceneSearch luceneSearch;
 
+    Set<String> textFieldNames = new HashSet<String>();
+
+    public Set<String> getTextFieldNames() {
+        return textFieldNames;
+    }
+
 
     public QueryFactory(LuceneSearch luceneSearch){
         this.luceneSearch = luceneSearch;
     }
 
     /**
-     *
      * @param fieldName
      * @param queryString
-     * @return a {@link TermQuery} or a {@link WildcardQuery}
+     * @param isTextField whether this field is a field containing free text in contrast to e.g. ID fields.
+     * @return
      */
-    public Query newTermQuery(String fieldName, String queryString){
+    public Query newTermQuery(String fieldName, String queryString, boolean isTextField){
+
+        if(isTextField){
+            textFieldNames.add(fieldName);
+        }
 
-        // in order to support the full query syntax we must use the parser here
+         // in order to support the full query syntax we must use the parser here
         String luceneQueryString = fieldName + ":(" + queryString + ")";
         try {
             return luceneSearch.parse(luceneQueryString);
@@ -63,6 +74,16 @@ public class QueryFactory {
         return null;
     }
 
+    /**
+     * only to be used for text fields, see {@link #newTermQuery(String, String, boolean)}
+     * @param fieldName
+     * @param queryString
+     * @return a {@link TermQuery} or a {@link WildcardQuery}
+     */
+    public Query newTermQuery(String fieldName, String queryString){
+        return newTermQuery(fieldName, queryString, true);
+    }
+
     /**
      * DefinedTerm representations and MultilanguageString maps are stored in the Lucene index by the {@link DefinedTermBaseClassBridge}
      * and {@link MultilanguageTextFieldBridge } in a consistent way. One field per language and also in one additional field for all languages.
@@ -92,7 +113,7 @@ public class QueryFactory {
      * @return
      */
     public Query newEntityIdQuery(String idFieldName, CdmBase entitiy){
-        return newTermQuery("inDescription.taxon.taxonNodes.classification.id", PaddedIntegerBridge.paddInteger(entitiy.getId()));
+        return newTermQuery("inDescription.taxon.taxonNodes.classification.id", PaddedIntegerBridge.paddInteger(entitiy.getId()), false);
     }
 
     /**
@@ -122,7 +143,7 @@ public class QueryFactory {
         BooleanQuery uuidInQuery = new BooleanQuery();
         if(entities != null && entities.size() > 0 ){
             for(IdentifiableEntity entity : entities){
-                uuidInQuery.add(newTermQuery(uuidFieldName, entity.getUuid().toString()), Occur.SHOULD);
+                uuidInQuery.add(newTermQuery(uuidFieldName, entity.getUuid().toString(), false), Occur.SHOULD);
             }
         }
         return uuidInQuery;