Author: davide
Date: Fri Jun 20 13:22:56 2014
New Revision: 1604169

URL: http://svn.apache.org/r1604169
Log:
OAK-1899 Ordered index fails with old index content

merged r1604166 into 1.0 branch


Modified:
    jackrabbit/oak/branches/1.0/   (props changed)
    
jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStoreStrategy.java
    
jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStorageStrategyTest.java

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

Modified: 
jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStoreStrategy.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStoreStrategy.java?rev=1604169&r1=1604168&r2=1604169&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStoreStrategy.java
 (original)
+++ 
jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStoreStrategy.java
 Fri Jun 20 13:22:56 2014
@@ -23,6 +23,7 @@ import static org.apache.jackrabbit.oak.
 import java.util.Collections;
 import java.util.Deque;
 import java.util.Iterator;
+import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Random;
 
@@ -47,6 +48,7 @@ import org.slf4j.LoggerFactory;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
 
 /**
  * Same as for {@link ContentMirrorStoreStrategy} but the order of the keys is 
kept by using the
@@ -149,6 +151,7 @@ public class OrderedContentMirrorStoreSt
                                         
     @Override
     void prune(final NodeBuilder index, final Deque<NodeBuilder> builders, 
final String key) {
+        LOG.debug("prune() - deleting: {}", key);
         for (NodeBuilder node : builders) {
             if (node.hasProperty("match") || node.getChildNodeCount(1) > 0) {
                 return;
@@ -166,11 +169,25 @@ public class OrderedContentMirrorStoreSt
                             walkedLanes
                             );
                         lane0Next = getPropertyNext(walkedLanes[0]);
+                        if (LOG.isDebugEnabled()) {
+                            for (int i = 0; i < walkedLanes.length; i++) {
+                                LOG.debug("prune() - walkedLanes[{}]: {}", i,
+                                    walkedLanes[i].getName());
+                            }
+                        }
                         for (int lane = walkedLanes.length - 1; lane >= 0; 
lane--) {
                             prevNext = getPropertyNext(walkedLanes[lane], 
lane);
                             if (key.equals(prevNext)) {
                                 // if it's actually pointing to us let's deal 
with it
                                 currNext = getPropertyNext(node, lane);
+                                if (LOG.isDebugEnabled()) {
+                                    LOG.debug(
+                                        "prune() - setting next for '{}' on 
lane '{}' with '{}'",
+                                        new Object[] {
+                                        walkedLanes[lane].getName(),
+                                        lane,
+                                        currNext});
+                                }
                                 
setPropertyNext(index.getChildNode(walkedLanes[lane].getName()),
                                     currNext, lane);
                             }
@@ -997,7 +1014,23 @@ public class OrderedContentMirrorStoreSt
         if (node != null && value != null && lane >= 0 && lane < 
OrderedIndex.LANES) {
             PropertyState next = node.getProperty(NEXT);
             if (next != null) {
-                String[] values = 
Iterables.toArray(next.getValue(Type.STRINGS), String.class);
+                String[] values;
+                if (next.isArray()) {
+                    values = Iterables.toArray(next.getValue(Type.STRINGS), 
String.class);
+                    if (values.length < OrderedIndex.LANES) {
+                        // it could be we increased the number of lanes and 
running on some existing
+                        // content
+                        LOG.debug("topping-up the number of lanes.");
+                        List<String> vv = Lists.newArrayList(values);
+                        for (int i = vv.size(); i <= OrderedIndex.LANES; i++) {
+                            vv.add("");
+                        }
+                        values = vv.toArray(new String[0]);
+                    }
+                } else {
+                    values = Iterables.toArray(EMPTY_NEXT, String.class);
+                    values[0] = next.getValue(Type.STRING);
+                }
                 values[lane] = value;
                 setPropertyNext(node, values);
             }

Modified: 
jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStorageStrategyTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStorageStrategyTest.java?rev=1604169&r1=1604168&r2=1604169&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStorageStrategyTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStorageStrategyTest.java
 Fri Jun 20 13:22:56 2014
@@ -1662,7 +1662,55 @@ public class OrderedContentMirrorStorage
         assertNotNull(":next cannot be null", n.getProperty(NEXT));
         assertEquals(ImmutableList.of("a", "b", "c", "a"),
             n.getProperty(NEXT).getValue(Type.STRINGS));
-    }
+
+        n = EmptyNodeState.EMPTY_NODE.builder();
+        n.setProperty(NEXT, "a", Type.STRING);
+        OrderedContentMirrorStoreStrategy.setPropertyNext(n, "b", 0);
+        assertNotNull(n);
+        assertNotNull(":next cannot be null", n.getProperty(NEXT));
+        assertEquals(ImmutableList.of("b", "", "", ""),
+            n.getProperty(NEXT).getValue(Type.STRINGS));
+
+        n = EmptyNodeState.EMPTY_NODE.builder();
+        n.setProperty(NEXT, "a", Type.STRING);
+        OrderedContentMirrorStoreStrategy.setPropertyNext(n, "b", 1);
+        assertNotNull(n);
+        assertNotNull(":next cannot be null", n.getProperty(NEXT));
+        assertEquals(ImmutableList.of("a", "b", "", ""),
+            n.getProperty(NEXT).getValue(Type.STRINGS));
+
+        n = EmptyNodeState.EMPTY_NODE.builder();
+        n.setProperty(NEXT, "a", Type.STRING);
+        OrderedContentMirrorStoreStrategy.setPropertyNext(n, "b", 2);
+        assertNotNull(n);
+        assertNotNull(":next cannot be null", n.getProperty(NEXT));
+        assertEquals(ImmutableList.of("a", "", "b", ""),
+            n.getProperty(NEXT).getValue(Type.STRINGS));
+
+        n = EmptyNodeState.EMPTY_NODE.builder();
+        n.setProperty(NEXT, "a", Type.STRING);
+        OrderedContentMirrorStoreStrategy.setPropertyNext(n, "b", 3);
+        assertNotNull(n);
+        assertNotNull(":next cannot be null", n.getProperty(NEXT));
+        assertEquals(ImmutableList.of("a", "", "", "b"),
+            n.getProperty(NEXT).getValue(Type.STRINGS));
+
+        n = EmptyNodeState.EMPTY_NODE.builder();
+        n.setProperty(NEXT, ImmutableList.of("a", "b"), Type.STRINGS);
+        OrderedContentMirrorStoreStrategy.setPropertyNext(n, "c", 1);
+        assertNotNull(n);
+        assertNotNull(":next cannot be null", n.getProperty(NEXT));
+        assertEquals(ImmutableList.of("a", "c", "", ""),
+            n.getProperty(NEXT).getValue(Type.STRINGS));
+
+        n = EmptyNodeState.EMPTY_NODE.builder();
+        n.setProperty(NEXT, ImmutableList.of("a", "b"), Type.STRINGS);
+        OrderedContentMirrorStoreStrategy.setPropertyNext(n, "c", 3);
+        assertNotNull(n);
+        assertNotNull(":next cannot be null", n.getProperty(NEXT));
+        assertEquals(ImmutableList.of("a", "b", "", "c"),
+            n.getProperty(NEXT).getValue(Type.STRINGS));
+}
     
     @Test
     public void getNext() {


Reply via email to