You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by th...@apache.org on 2013/08/06 11:56:53 UTC

svn commit: r1510892 - /jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java

Author: thomasm
Date: Tue Aug  6 09:56:53 2013
New Revision: 1510892

URL: http://svn.apache.org/r1510892
Log:
OAK-890 Query: advanced fulltext search conditions (logging, javadocs, small improvements)

Modified:
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java?rev=1510892&r1=1510891&r2=1510892&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java Tue Aug  6 09:56:53 2013
@@ -152,6 +152,7 @@ public class LuceneIndex implements Full
         }
         Set<String> relPaths = getRelativePaths(ft);
         if (relPaths.size() > 1) {
+            LOG.warn("More than one relative parent for query " + filter.getQueryStatement());
             // there are multiple "parents", as in
             // "contains(a/x, 'hello') and contains(b/x, 'world')"
             return new MultiLuceneIndex(filter, root, relPaths).getCost();
@@ -173,8 +174,9 @@ public class LuceneIndex implements Full
     /**
      * Get the set of relative paths of a full-text condition. For example, for
      * the condition "contains(a/b, 'hello') and contains(c/d, 'world'), the set
-     * { "a", "c" } is returned. If there are no relative properties, then one entry
-     * is returned. If there is no expression, then an empty set is returned.
+     * { "a", "c" } is returned. If there are no relative properties, then one
+     * entry is returned (the empty string). If there is no expression, then an
+     * empty set is returned.
      * 
      * @param ft the full-text expression
      * @return the set of relative paths (possibly empty)
@@ -348,8 +350,11 @@ public class LuceneIndex implements Full
                     Collection<String> paths = new ArrayList<String>();
                     HashSet<String> seenPaths = new HashSet<String>();
                     Query query = getQuery(filter, reader, nonFullTextConstraints);
+                    int parentDepth = PathUtils.getDepth(parent);
                     if (query != null) {
+                        // OAK-925
                         // TODO how to best avoid loading all entries in memory?
+                        // (memory problem and performance problem)
                         TopDocs docs = searcher
                                 .search(query, Integer.MAX_VALUE);
                         for (ScoreDoc doc : docs.scoreDocs) {
@@ -366,10 +371,7 @@ public class LuceneIndex implements Full
                                         continue;
                                     }
                                     // get the base path
-                                    for (int i = 0, size = PathUtils
-                                            .getDepth(parent); i < size; i++) {
-                                        path = PathUtils.getParentPath(path);
-                                    }
+                                    path = PathUtils.getAncestorPath(path, parentDepth);
                                     // avoid duplicate entries
                                     if (seenPaths.contains(path)) {
                                         continue;
@@ -437,6 +439,16 @@ public class LuceneIndex implements Full
         }
     }
     
+    /**
+     * Get the Lucene query for the given filter.
+     * 
+     * @param filter the filter, including full-text constraint
+     * @param reader the Lucene reader
+     * @param nonFullTextConstraints whether non-full-text constraints (such a
+     *            path, node type, and so on) should be added to the Lucene
+     *            query
+     * @return the Lucene query
+     */
     private static Query getQuery(Filter filter, IndexReader reader, boolean nonFullTextConstraints) {
         List<Query> qs = new ArrayList<Query>();
         FullTextExpression ft = filter.getFullTextConstraint();
@@ -661,6 +673,7 @@ public class LuceneIndex implements Full
                 if (p != null && p.indexOf('/') >= 0) {
                     p = PathUtils.getName(p);
                 }
+                // TODO use tokenToQuery(String) if possible
                 String text = term.getText();
                 if (text.indexOf(' ') >= 0) {
                     PhraseQuery pq = new PhraseQuery();
@@ -674,6 +687,7 @@ public class LuceneIndex implements Full
                         text = text + "*";
                     }
                     text = text.toLowerCase();
+                    // TODO if one condition, use wildcard - if multiple, use list of terms
                     q = new WildcardQuery(newFulltextTerm(text));
                 }
                 String boost = term.getBoost();