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 ch...@apache.org on 2015/05/12 16:17:51 UTC

svn commit: r1678954 - in /jackrabbit/oak/trunk/oak-lucene/src: main/java/org/apache/jackrabbit/oak/plugins/index/lucene/ test/java/org/apache/jackrabbit/oak/plugins/index/lucene/

Author: chetanm
Date: Tue May 12 14:17:51 2015
New Revision: 1678954

URL: http://svn.apache.org/r1678954
Log:
OAK-2863 - No matching result found with use of relative property names in fulltext search in some cases

Modified:
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
    jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.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=1678954&r1=1678953&r2=1678954&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 May 12 14:17:51 2015
@@ -349,23 +349,31 @@ public class LuceneIndex implements Adva
                         TopDocs docs;
                         long time = System.currentTimeMillis();
                         checkForIndexVersionChange(searcher);
-                        if (lastDoc != null) {
-                            LOG.debug("loading the next {} entries for query {}", nextBatchSize, query);
-                            docs = searcher.searchAfter(lastDoc, query, nextBatchSize);
-                        } else {
-                            LOG.debug("loading the first {} entries for query {}", nextBatchSize, query);
-                            docs = searcher.search(query, nextBatchSize);
-                        }
-                        time = System.currentTimeMillis() - time;
-                        LOG.debug("... took {} ms", time);
-                        nextBatchSize = (int) Math.min(nextBatchSize * 2L, 100000);
+                        while (true) {
+                            if (lastDoc != null) {
+                                LOG.debug("loading the next {} entries for query {}", nextBatchSize, query);
+                                docs = searcher.searchAfter(lastDoc, query, nextBatchSize);
+                            } else {
+                                LOG.debug("loading the first {} entries for query {}", nextBatchSize, query);
+                                docs = searcher.search(query, nextBatchSize);
+                            }
+                            time = System.currentTimeMillis() - time;
+                            LOG.debug("... took {} ms", time);
+                            nextBatchSize = (int) Math.min(nextBatchSize * 2L, 100000);
+
+                            for (ScoreDoc doc : docs.scoreDocs) {
+                                LuceneResultRow row = convertToRow(doc, searcher);
+                                if (row != null) {
+                                    queue.add(row);
+                                }
+                                lastDocToRecord = doc;
+                            }
 
-                        for (ScoreDoc doc : docs.scoreDocs) {
-                            LuceneResultRow row = convertToRow(doc, searcher);
-                            if (row != null) {
-                                queue.add(row);
+                            if (queue.isEmpty() && docs.scoreDocs.length > 0) {
+                                lastDoc = lastDocToRecord;
+                            } else {
+                                break;
                             }
-                            lastDocToRecord = doc;
                         }
                     } else if (luceneRequestFacade.getLuceneRequest() instanceof SpellcheckHelper.SpellcheckQuery) {
                         SpellcheckHelper.SpellcheckQuery spellcheckQuery = (SpellcheckHelper.SpellcheckQuery) luceneRequestFacade.getLuceneRequest();

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java?rev=1678954&r1=1678953&r2=1678954&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java Tue May 12 14:17:51 2015
@@ -291,14 +291,23 @@ public class LucenePropertyIndex impleme
                         path = "/";
                     }
                     if (pr.isPathTransformed()) {
+                        String originalPath = path;
                         path = pr.transformPath(path);
+
+                        if (path == null){
+                            LOG.trace("Ignoring path {} : Transformation returned null", originalPath);
+                            return null;
+                        }
+
                         // avoid duplicate entries
-                        if (path == null || seenPaths.contains(path)) {
+                        if (seenPaths.contains(path)){
+                            LOG.trace("Ignoring path {} : Duplicate post transformation", originalPath);
                             return null;
                         }
                         seenPaths.add(path);
                     }
 
+                    LOG.trace("Matched path {}", path);
                     return new LuceneResultRow(path, doc.score);
                 }
                 return null;
@@ -334,30 +343,40 @@ public class LucenePropertyIndex impleme
 
                         TopDocs docs;
                         long start = PERF_LOGGER.start();
-                        if (lastDoc != null) {
-                            LOG.debug("loading the next {} entries for query {}", nextBatchSize, query);
-                            if (sort == null) {
-                                docs = searcher.searchAfter(lastDoc, query, nextBatchSize);
+                        while (true) {
+                            if (lastDoc != null) {
+                                LOG.debug("loading the next {} entries for query {}", nextBatchSize, query);
+                                if (sort == null) {
+                                    docs = searcher.searchAfter(lastDoc, query, nextBatchSize);
+                                } else {
+                                    docs = searcher.searchAfter(lastDoc, query, nextBatchSize, sort);
+                                }
                             } else {
-                                docs = searcher.searchAfter(lastDoc, query, nextBatchSize, sort);
+                                LOG.debug("loading the first {} entries for query {}", nextBatchSize, query);
+                                if (sort == null) {
+                                    docs = searcher.search(query, nextBatchSize);
+                                } else {
+                                    docs = searcher.search(query, nextBatchSize, sort);
+                                }
                             }
-                        } else {
-                            LOG.debug("loading the first {} entries for query {}", nextBatchSize, query);
-                            if (sort == null) {
-                                docs = searcher.search(query, nextBatchSize);
-                            } else {
-                                docs = searcher.search(query, nextBatchSize, sort);
+                            PERF_LOGGER.end(start, -1, "{} ...", docs.scoreDocs.length);
+                            nextBatchSize = (int) Math.min(nextBatchSize * 2L, 100000);
+
+                            for (ScoreDoc doc : docs.scoreDocs) {
+                                LuceneResultRow row = convertToRow(doc, searcher);
+                                if (row != null) {
+                                    queue.add(row);
+                                }
+                                lastDocToRecord = doc;
                             }
-                        }
-                        PERF_LOGGER.end(start, -1, "...");
-                        nextBatchSize = (int) Math.min(nextBatchSize * 2L, 100000);
 
-                        for (ScoreDoc doc : docs.scoreDocs) {
-                            LuceneResultRow row = convertToRow(doc, searcher);
-                            if (row != null) {
-                                queue.add(row);
+                            if (queue.isEmpty() && docs.scoreDocs.length > 0) {
+                                //queue is still empty but more results can be fetched
+                                //from Lucene so still continue
+                                lastDoc = lastDocToRecord;
+                            } else {
+                                break;
                             }
-                            lastDocToRecord = doc;
                         }
                     } else if (luceneRequestFacade.getLuceneRequest() instanceof SpellcheckHelper.SpellcheckQuery) {
                         SpellcheckHelper.SpellcheckQuery spellcheckQuery = (SpellcheckHelper.SpellcheckQuery) luceneRequestFacade.getLuceneRequest();

Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java?rev=1678954&r1=1678953&r2=1678954&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java Tue May 12 14:17:51 2015
@@ -1280,6 +1280,37 @@ public class LucenePropertyIndexTest ext
         assertQuery("select * from [nt:base] where CONTAINS(*, 'jumping')", Collections.<String>emptyList());
     }
 
+    @Test
+    public void relativePropertyAndCursor() throws Exception{
+        // Index Definition
+        Tree idx = createIndex("test1", of("propa", "propb"));
+        TestUtil.useV2(idx);
+        idx.setProperty(LuceneIndexConstants.FULL_TEXT_ENABLED, true);
+
+        Tree propNode = idx.addChild(PROP_NODE);
+
+        // property definition for index test1
+        Tree propA = propNode.addChild("propa");
+        propA.setProperty(LuceneIndexConstants.PROP_TYPE, PropertyType.TYPENAME_STRING);
+        propA.setProperty(LuceneIndexConstants.FIELD_BOOST, 2.0);
+
+        root.commit();
+
+        // create test data with 1 more than batch size
+        //with boost set we ensure that correct result comes *after* the batch size of results
+        Tree test = root.getTree("/").addChild("test");
+        root.commit();
+        for (int i = 0; i < LucenePropertyIndex.LUCENE_QUERY_BATCH_SIZE; i++) {
+            test.addChild("a"+i).addChild("doNotInclude").setProperty("propa", "foo");
+        }
+        test.addChild("b").addChild("jcr:content").setProperty("propb", "foo");
+        root.commit();
+
+        String queryString = "/jcr:root//element(*, nt:base)[jcr:contains(jcr:content, 'foo' )]";
+
+        assertQuery(queryString, "xpath", asList("/test/b"));
+    }
+
     private Tree createFileNode(Tree tree, String name, String content, String mimeType){
         Tree jcrContent = tree.addChild(name).addChild(JCR_CONTENT);
         jcrContent.setProperty(JcrConstants.JCR_DATA, content.getBytes());