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();
+ }
+
}