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 2014/08/13 14:35:10 UTC

svn commit: r1617713 - in /jackrabbit/oak/branches/1.0: ./ oak-doc/ oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/ oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/

Author: chetanm
Date: Wed Aug 13 12:35:10 2014
New Revision: 1617713

URL: http://svn.apache.org/r1617713
Log:
OAK-2029 - Oak Lucene index doesn't get notified about updates when index is stored on the file system

Merge 1617711

Modified:
    jackrabbit/oak/branches/1.0/   (props changed)
    jackrabbit/oak/branches/1.0/oak-doc/   (props changed)
    jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java
    jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java

Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk:r1617711

Propchange: jackrabbit/oak/branches/1.0/oak-doc/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk/oak-doc:r1617711

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java?rev=1617713&r1=1617712&r2=1617713&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java Wed Aug 13 12:35:10 2014
@@ -26,6 +26,7 @@ import static org.apache.lucene.store.No
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Calendar;
 import java.util.Set;
 
 import javax.jcr.PropertyType;
@@ -35,6 +36,7 @@ import org.apache.jackrabbit.oak.api.Pro
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.util.ISO8601;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.IndexWriterConfig;
@@ -165,6 +167,13 @@ public class LuceneIndexEditorContext {
     void closeWriter() throws IOException {
         if (writer != null) {
             writer.close();
+
+            //OAK-2029 Record the last updated status so
+            //as to make IndexTracker detect changes when index
+            //is stored in file system
+            NodeBuilder status = definition.child(":status");
+            status.setProperty("lastUpdated", ISO8601.format(Calendar.getInstance()), Type.DATE);
+            status.setProperty("indexedNodes",indexedNodes);
         }
     }
 

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java?rev=1617713&r1=1617712&r2=1617713&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java Wed Aug 13 12:35:10 2014
@@ -16,8 +16,12 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.lucene;
 
+import java.io.File;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import static com.google.common.collect.ImmutableList.copyOf;
 import static com.google.common.collect.Iterators.transform;
 import static javax.jcr.PropertyType.TYPENAME_STRING;
@@ -27,6 +31,9 @@ import static junit.framework.Assert.ass
 import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
 import static org.apache.jackrabbit.JcrConstants.NT_BASE;
 import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
+import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PERSISTENCE_FILE;
+import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PERSISTENCE_NAME;
+import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PERSISTENCE_PATH;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.util.LuceneIndexHelper.newLuceneIndexDefinition;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_NODE_TYPES;
 import static org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent.INITIAL_CONTENT;
@@ -34,12 +41,16 @@ import static org.apache.jackrabbit.oak.
 import com.google.common.base.Function;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.index.IndexUpdateProvider;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore;
 import org.apache.jackrabbit.oak.query.QueryEngineSettings;
 import org.apache.jackrabbit.oak.query.ast.Operator;
 import org.apache.jackrabbit.oak.query.ast.SelectorImpl;
 import org.apache.jackrabbit.oak.query.index.FilterImpl;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.EditorHook;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
+import org.apache.jackrabbit.oak.spi.commit.Observable;
+import org.apache.jackrabbit.oak.spi.commit.Observer;
 import org.apache.jackrabbit.oak.spi.query.Cursor;
 import org.apache.jackrabbit.oak.spi.query.Filter;
 import org.apache.jackrabbit.oak.spi.query.IndexRow;
@@ -47,6 +58,7 @@ import org.apache.jackrabbit.oak.spi.que
 import org.apache.jackrabbit.oak.spi.query.QueryIndex;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.lucene.analysis.Analyzer;
 import org.junit.Test;
 
@@ -222,4 +234,57 @@ public class LuceneIndexTest {
                 LuceneIndex.tokenize("*llo-wor*", analyzer));
     }
 
+    @Test
+    public void luceneWithFSDirectory() throws Exception{
+        //Issue is not reproducible with MemoryNodeBuilder and
+        //MemoryNodeState as they cannot determine change in childNode without
+        //entering
+        NodeStore nodeStore = new SegmentNodeStore();
+        final IndexTracker tracker = new IndexTracker();
+        ((Observable)nodeStore).addObserver(new Observer() {
+            @Override
+            public void contentChanged(@Nonnull NodeState root, @Nullable CommitInfo info) {
+                tracker.update(root);
+            }
+        });
+        builder = nodeStore.getRoot().builder();
+        NodeBuilder index = builder.child(INDEX_DEFINITIONS_NAME);
+        NodeBuilder idxb = newLuceneIndexDefinition(index, "lucene",
+                ImmutableSet.of(TYPENAME_STRING));
+        idxb.setProperty(PERSISTENCE_NAME, PERSISTENCE_FILE);
+        idxb.setProperty(PERSISTENCE_PATH, getIndexDir());
+
+        nodeStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+
+        builder = nodeStore.getRoot().builder();
+        builder.setProperty("foo", "bar");
+
+        NodeState indexed = nodeStore.merge(builder, HOOK, CommitInfo.EMPTY);
+
+        assertQuery(tracker, indexed, "foo", "bar");
+
+        builder = nodeStore.getRoot().builder();
+        builder.setProperty("foo2", "bar2");
+        indexed = nodeStore.merge(builder, HOOK, CommitInfo.EMPTY);
+
+        assertQuery(tracker, indexed, "foo2", "bar2");
+    }
+
+    private void assertQuery(IndexTracker tracker, NodeState indexed, String key, String value){
+        QueryIndex queryIndex = new LuceneIndex(tracker, analyzer, null);
+        FilterImpl filter = createFilter(NT_BASE);
+        filter.restrictPath("/", Filter.PathRestriction.EXACT);
+        filter.restrictProperty(key, Operator.EQUAL,
+                PropertyValues.newString(value));
+        Cursor cursor = queryIndex.query(filter, indexed);
+        assertTrue(cursor.hasNext());
+        assertEquals("/", cursor.next().getPath());
+        assertFalse(cursor.hasNext());
+    }
+
+    private String getIndexDir(){
+        File dir = new File("target", "indexdir"+System.nanoTime());
+        return dir.getAbsolutePath();
+    }
+
 }