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 2016/07/04 15:26:49 UTC

svn commit: r1751315 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/multiplex/ main/java/org/apache/jackrabbit/oak/spi/mount/ test/java/org/apache/jackrabbit/oak/plugins/multiplex/

Author: chetanm
Date: Mon Jul  4 15:26:49 2016
New Revision: 1751315

URL: http://svn.apache.org/viewvc?rev=1751315&view=rev
Log:
OAK-3404 - [multiplex] Path to logical store mapping

Add a way to determine whether two paths are 'wrap' a Mount. This is
useful when determining whether a store needs to be included in the
query execution or not.

Author - Robert Munteanu

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfo.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/MountInfoProvider.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProviderTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfo.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfo.java?rev=1751315&r1=1751314&r2=1751315&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfo.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfo.java Mon Jul  4 15:26:49 2016
@@ -54,6 +54,16 @@ final class MountInfo {
         }
         return false;
     }
+    
+    public boolean isWrapped(String from, String to) {
+        for ( String path : includedPaths ) {
+            if ( from.compareTo(path) < 0 && path.compareTo(to) < 0 ) {
+                return true;
+            }
+        }
+        
+        return false;
+    }
 
     @Override
     public String toString() {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProvider.java?rev=1751315&r1=1751314&r2=1751315&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProvider.java Mon Jul  4 15:26:49 2016
@@ -20,6 +20,7 @@
 package org.apache.jackrabbit.oak.plugins.multiplex;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -71,6 +72,25 @@ public class SimpleMountInfoProvider imp
     public boolean hasNonDefaultMounts() {
         return hasMounts;
     }
+    
+    @Override
+    public Collection<Mount> getMountsContainedBetweenPaths(String fromPath, String toPath) {
+
+        List<Mount> matching = Lists.newArrayList();
+        List<MountInfo> allMountInfos = Lists.newArrayList();
+        allMountInfos.add(new MountInfo(Mount.DEFAULT, Collections.singletonList("/")));
+        allMountInfos.addAll(mountInfos);
+        
+        boolean hasUncertainPaths = fromPath == null || toPath == null;
+        
+        for ( MountInfo mountInfo : allMountInfos ) {
+            if ( !hasUncertainPaths && mountInfo.isWrapped(fromPath, toPath)) {
+                matching.add(mountInfo.getMount());
+            }
+        }
+        
+        return matching;
+    }
 
     //~----------------------------------------< builder >
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/MountInfoProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/MountInfoProvider.java?rev=1751315&r1=1751314&r2=1751315&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/MountInfoProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/MountInfoProvider.java Mon Jul  4 15:26:49 2016
@@ -45,6 +45,11 @@ public interface MountInfoProvider {
         public boolean hasNonDefaultMounts() {
             return false;
         }
+        
+        @Override
+        public Collection<Mount> getMountsContainedBetweenPaths(String fromPath, String toPath) {
+            return Collections.singleton(Mount.DEFAULT);
+        }
     };
 
     /**
@@ -75,4 +80,25 @@ public interface MountInfoProvider {
      * Return true if there are explicit mounts configured
      */
     boolean hasNonDefaultMounts();
+    
+    /**
+     * Returns all mounts which are contained between the specified <tt>fromPath</tt> and <tt>toPath</tt>
+     * 
+     * <p>If either of the path parameters is null, all stores are returned</p>
+     * 
+     * <p>For instance, assume that we have the following mounts:</p>
+     * 
+     * <ol>
+     *  <li>first:/b</li>
+     *  <li>second:/d</li>
+     *  <li>third:/e</li>
+     * </ol>
+     * 
+     * <p>A call to <tt>infoProvider.getMountsContainedBetweenPaths("/c","/f")</tt> would return stores <tt>second</tt> and <tt>third</tt>.
+     * 
+     * @param fromPath the start path
+     * @param toPath the end path
+     * @return a Collection for stores, never <code>null</code>
+     */
+    Collection<Mount> getMountsContainedBetweenPaths(String fromPath, String toPath);
 }

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoTest.java?rev=1751315&r1=1751314&r2=1751315&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoTest.java Mon Jul  4 15:26:49 2016
@@ -37,5 +37,14 @@ public class MountInfoTest {
         assertFalse(md.isMounted("/x/y"));
         assertFalse(md.isMounted("/x/y/foo"));
     }
+    
+    @Test
+    public void isWrapped() {
+        MountInfo mi = new MountInfo(new Mount("foo"), of("/c", "/f"));
+        assertTrue(mi.isWrapped("/a", "/g")); // wraps both
+        assertTrue(mi.isWrapped("/b", "/d")); // wraps one
+        assertFalse(mi.isWrapped("/a", "/b")); // wraps none ('outside c-f')
+        assertFalse(mi.isWrapped("/d", "/e")); // wraps none ('inside c-f')
+    }
 
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProviderTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProviderTest.java?rev=1751315&r1=1751314&r2=1751315&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProviderTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProviderTest.java Mon Jul  4 15:26:49 2016
@@ -26,7 +26,6 @@ import org.apache.jackrabbit.oak.spi.mou
 import org.apache.jackrabbit.oak.spi.mount.MountInfoProvider;
 import org.junit.Test;
 
-import static com.google.common.collect.ImmutableList.of;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -83,5 +82,18 @@ public class SimpleMountInfoProviderTest
         assertTrue(mip.getMountByName("bar").isReadOnly());
         assertFalse(mip.getMountByName("foo").isReadOnly());
     }
-
+    
+    @Test
+    public void mountsContainedBetweenPaths() {
+        
+        MountInfoProvider mip = SimpleMountInfoProvider.newBuilder()
+                .mount("first", "/b")
+                .mount("second", "/d")
+                .mount("third", "/h")
+                .build();
+        
+        Collection<Mount> mountsContainedBetweenPaths = mip.getMountsContainedBetweenPaths("/a", "/f");
+        
+        assertEquals(2, mountsContainedBetweenPaths.size());
+    }
 }
\ No newline at end of file