diff --git a/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateTest.java b/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateTest.java
index 0b90644..2c82289 100644
--- a/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateTest.java
+++ b/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateTest.java
@@ -44,7 +44,6 @@ import java.util.Set;
import javax.annotation.Nonnull;
-import com.google.common.collect.Maps;
import org.apache.jackrabbit.oak.api.CommitFailedException;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Type;
@@ -61,6 +60,7 @@ import org.apache.jackrabbit.oak.query.ast.NodeTypeInfoProvider;
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.DefaultEditor;
import org.apache.jackrabbit.oak.spi.commit.Editor;
import org.apache.jackrabbit.oak.spi.commit.EditorHook;
import org.apache.jackrabbit.oak.spi.commit.EditorProvider;
@@ -74,6 +74,7 @@ import org.apache.jackrabbit.util.ISO8601;
import org.junit.Test;
import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
public class IndexUpdateTest {
@@ -734,4 +735,71 @@ public class IndexUpdateTest {
return nb;
}
+ /**
+ * Reindex Test for OAK-5499
+ *
+ * - Add some content
+ * - Add 2 index definitions on subtrees
+ * - Verify number of traversed nodes, ideally should be close (equal) to number of nodes in content
+ *
+ */
+ @Test
+ public void testReindexExtraTraversals() throws Exception {
+ final CountingEditor editor = new CountingEditor();
+ IndexEditorProvider provider = new IndexEditorProvider() {
+
+ @Override
+ public Editor getIndexEditor(String type, NodeBuilder definition, NodeState root,
+ IndexUpdateCallback callback) {
+ return editor;
+ }
+
+ };
+
+ EditorHook HOOK = new EditorHook(new IndexUpdateProvider(provider));
+
+ NodeState before = EmptyNodeState.EMPTY_NODE;
+ NodeBuilder builder = before.builder();
+
+ builder.child("content").setProperty("foo", "abc");
+ builder.child("content").child("childContent").setProperty("bar", "cde");
+
+ NodeBuilder c = builder.child("content").child("childContent");
+ for (int i = 0; i < 5; i++) {
+ c = c.child("c" + i);
+ }
+
+ createIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME),
+ "foo1Index", false, false, ImmutableSet.of("foo"), null);
+ createIndexDefinition(builder.child("content").child(INDEX_DEFINITIONS_NAME),
+ "foo2Index", false, false, ImmutableSet.of("bar"), null);
+
+ NodeState after = builder.getNodeState();
+ HOOK.processCommit(EmptyNodeState.EMPTY_NODE, after, CommitInfo.EMPTY);
+
+ System.err.println(NodeStateUtils.toString(after));
+
+ assertEquals(11, editor.nodesAdded);
+ assertEquals(0, editor.nodesChanged);
+ }
+
+ private static class CountingEditor extends DefaultEditor {
+
+ private int nodesAdded = 0;
+
+ private int nodesChanged = 0;
+
+ @Override
+ public Editor childNodeAdded(String name, NodeState after) throws CommitFailedException {
+ nodesAdded++;
+ return this;
+ }
+
+ @Override
+ public Editor childNodeChanged(String name, NodeState before, NodeState after) throws CommitFailedException {
+ nodesChanged++;
+ return this;
+ }
+
+ }
}