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 + * + */ + @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; + } + + } }