diff --git a/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java b/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java index cb42af2..383a565 100644 --- a/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java +++ b/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java @@ -555,9 +555,11 @@ public class SegmentNodeState extends Record implements NodeState { } } } else if (beforeChildName != Template.MANY_CHILD_NODES) { + boolean beforeChildExists = false; for (ChildNodeEntry entry : afterTemplate.getChildNodeEntries(afterId)) { String childName = entry.getName(); + beforeChildExists |= childName.equals(beforeChildName); NodeState afterChild = entry.getNodeState(); if (beforeChildName.equals(childName)) { NodeState beforeChild = @@ -577,6 +579,13 @@ public class SegmentNodeState extends Record implements NodeState { return false; } } + if (!beforeChildExists) { + NodeState beforeChild = + beforeTemplate.getChildNode(beforeChildName, beforeId); + if (!diff.childNodeDeleted(beforeChildName, beforeChild)) { + return false; + } + } } else { MapRecord afterMap = afterTemplate.getChildNodeMap(afterId); MapRecord beforeMap = beforeTemplate.getChildNodeMap(beforeId); diff --git a/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java b/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java index 4460e9b..fd78f73 100644 --- a/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java +++ b/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java @@ -156,5 +156,22 @@ public class CompareAgainstBaseStateTest { after.compareAgainstBaseState(before, diff); verify(diff); } + + @Test + public void testChildNodeDeletedAndMultipleAdded() { + NodeState before = builder.getNodeState(); + builder.getChildNode("baz").remove(); + builder.child("x"); + builder.child("y"); + NodeState after = builder.getNodeState(); + + expect(diff.childNodeDeleted("baz", before.getChildNode("baz"))).andReturn(true); + expect(diff.childNodeAdded("x", after.getChildNode("x"))).andReturn(true); + expect(diff.childNodeAdded("y", after.getChildNode("x"))).andReturn(true); + replay(diff); + + after.compareAgainstBaseState(before, diff); + verify(diff); + } }