You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2008/03/16 06:04:59 UTC

svn commit: r637541 - in /directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src: main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/ test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/

Author: akarasulu
Date: Sat Mar 15 22:04:48 2008
New Revision: 637541

URL: http://svn.apache.org/viewvc?rev=637541&view=rev
Log:
more tests for greater code coverage of dups cursor

Modified:
    directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/DupsCursor.java
    directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/DupsCursorTest.java

Modified: directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/DupsCursor.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/DupsCursor.java?rev=637541&r1=637540&r2=637541&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/DupsCursor.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/DupsCursor.java Sat Mar 15 22:04:48 2008
@@ -15,6 +15,9 @@
 
 /**
  * A Cursor over a BTree which manages duplicate keys.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$
  */
 class DupsCursor<K,V> extends AbstractCursor<Tuple<K,V>>
 {
@@ -88,7 +91,7 @@
                 AvlTree<V> set = values.getAvlTree();
                 dupsCursor = new AvlTreeCursor<V>( set );
             }
-            else if ( values.isBTreeRedirect() )
+            else
             {
                 BTree tree = table.getBTree( values.getBTreeRedirect() );
                 dupsCursor = new KeyCursor<V>( tree, table.getValueComparator() );
@@ -99,13 +102,12 @@
                 return;
             }
 
-            // don't bother advancing the dupsCursor unless we're on same key
-            if ( table.getKeyComparator().compare( containerTuple.getKey(), element.getKey() ) != 0 )
+            // advance the dupsCursor only if we're on same key
+            if ( table.getKeyComparator().compare( containerTuple.getKey(), element.getKey() ) == 0 )
             {
-                return;
+                dupsCursor.before( element.getValue() );
             }
 
-            dupsCursor.before( element.getValue() );
             return;
         }
 
@@ -157,7 +159,7 @@
                 AvlTree<V> set = values.getAvlTree();
                 dupsCursor = new AvlTreeCursor<V>( set );
             }
-            else if ( values.isBTreeRedirect() )
+            else
             {
                 BTree tree = table.getBTree( values.getBTreeRedirect() );
                 dupsCursor = new KeyCursor<V>( tree, table.getValueComparator() );
@@ -168,13 +170,12 @@
                 return;
             }
 
-            // don't bother advancing the dupsCursor unless we're on same key
-            if ( table.getKeyComparator().compare( containerTuple.getKey(), element.getKey() ) != 0 )
+            // only advance the dupsCursor if we're on same key
+            if ( table.getKeyComparator().compare( containerTuple.getKey(), element.getKey() ) == 0 )
             {
-                return;
+                dupsCursor.after( element.getValue() );
             }
 
-            dupsCursor.after( element.getValue() );
             return;
         }
 
@@ -258,7 +259,7 @@
                 AvlTree<V> set = values.getAvlTree();
                 dupsCursor = new AvlTreeCursor<V>( set );
             }
-            else if ( values.isBTreeRedirect() )
+            else
             {
                 BTree tree = table.getBTree( values.getBTreeRedirect() );
                 dupsCursor = new KeyCursor<V>( tree, table.getValueComparator() );
@@ -316,7 +317,7 @@
                     AvlTree<V> set = values.getAvlTree();
                     dupsCursor = new AvlTreeCursor<V>( set );
                 }
-                else if ( values.isBTreeRedirect() )
+                else
                 {
                     BTree tree = table.getBTree( values.getBTreeRedirect() );
                     dupsCursor = new KeyCursor<V>( tree, table.getValueComparator() );
@@ -363,7 +364,7 @@
                     AvlTree<V> set = values.getAvlTree();
                     dupsCursor = new AvlTreeCursor<V>( set );
                 }
-                else if ( values.isBTreeRedirect() )
+                else
                 {
                     BTree tree = table.getBTree( values.getBTreeRedirect() );
                     dupsCursor = new KeyCursor<V>( tree, table.getValueComparator() );

Modified: directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/DupsCursorTest.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/DupsCursorTest.java?rev=637541&r1=637540&r2=637541&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/DupsCursorTest.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/jdbm-store/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/DupsCursorTest.java Sat Mar 15 22:04:48 2008
@@ -24,6 +24,7 @@
 import org.apache.directory.server.core.partition.impl.btree.Table;
 import org.apache.directory.server.core.partition.impl.btree.Tuple;
 import org.apache.directory.server.core.cursor.Cursor;
+import org.apache.directory.server.core.cursor.InvalidCursorPositionException;
 import org.apache.directory.server.schema.SerializableComparator;
 import org.junit.Before;
 import org.junit.After;
@@ -479,6 +480,65 @@
             ii++;
         }
 
+        // test before to advance just before a key with a single value but
+        // with a null tuple value which should not advance the dupsCursor
+        ii = 5;
+        cursor = table.cursor();
+        cursor.before( new Tuple<Integer,Integer>( 5, null ) );
+        while ( cursor.next() )
+        {
+            if ( ii > 17 && ii < 21 )
+            {
+                assertFalse( table.has( ii ) );
+                continue;
+            }
+
+            Tuple<Integer,Integer> tuple = cursor.get();
+            if ( ii > 12 && ii < 17 )
+            {
+                assertEquals( 13, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            else
+            {
+                assertEquals( ii, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            ii++;
+        }
+
+        // test before to advance just before a key value pair where the key
+        // does not exist - using value so we hit check for key equality
+        ii = 21;
+        cursor = table.cursor();
+        cursor.before( new Tuple<Integer,Integer>( 18, 18 ) );
+        while ( cursor.next() )
+        {
+            if ( ii > 17 && ii < 21 )
+            {
+                assertFalse( table.has( ii ) );
+                continue;
+            }
+
+            Tuple<Integer,Integer> tuple = cursor.get();
+            if ( ii > 12 && ii < 17 )
+            {
+                assertEquals( 13, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            else
+            {
+                assertEquals( ii, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            ii++;
+        }
+
+        // test after to advance just after the end
+        cursor = table.cursor();
+        cursor.after( new Tuple<Integer,Integer>( 111, null ) );
+        assertFalse( cursor.next() );
+
         // test after to advance just before a key with a single value
         ii = 6;
         cursor = table.cursor();
@@ -601,6 +661,319 @@
                 assertEquals( ii, ( int ) tuple.getValue() );
             }
             ii++;
+        }
+
+        // test after to advance just before a key and value where the key
+        // does not exist - used to force key comparison in after()
+        cursor = table.cursor();
+        cursor.after( new Tuple<Integer,Integer>( 18, 18 ) );
+
+        cursor.next();
+        tuple = cursor.get();
+        assertEquals( 21, ( int ) tuple.getKey() );
+        assertEquals( 21, ( int ) tuple.getValue() );
+        ii=22;
+
+        while ( cursor.next() )
+        {
+            if ( ii > 17 && ii < 21 )
+            {
+                assertFalse( table.has( ii ) );
+                continue;
+            }
+
+            tuple = cursor.get();
+            if ( ii > 12 && ii < 17 )
+            {
+                assertEquals( 13, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            else
+            {
+                assertEquals( ii, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            ii++;
+        }
+    }
+
+
+    @Test
+    public void testBeforeAfterOverDupLimit() throws Exception
+    {
+        for ( int ii = 0; ii < SIZE*3 - 1; ii++ )
+        {
+            if ( ii > 12 && ii < 17 + SIZE ) // keys with multiple values
+            {
+                table.put( 13, ii );
+            }
+            else if ( ii > 17 + SIZE  && ii < 21 + SIZE ) // adds hole with no keys for ii
+            {
+            }
+            else // keys with single values
+            {
+                table.put( ii, ii );
+            }
+        }
+
+        // test before to advance just before a key with a single value
+        int ii = 5;
+        Cursor<Tuple<Integer,Integer>> cursor = table.cursor();
+        cursor.before( new Tuple<Integer,Integer>( 5, 5 ) );
+        while ( cursor.next() )
+        {
+            if ( ii > 17 + SIZE && ii < 21 + SIZE )
+            {
+                assertFalse( table.has( ii ) );
+                continue;
+            }
+
+            Tuple<Integer,Integer> tuple = cursor.get();
+            if ( ii > 12 && ii < 17 + SIZE )
+            {
+                assertEquals( 13, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            else
+            {
+                assertEquals( ii, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            ii++;
+        }
+
+        // test before to advance just before a key with a single value but
+        // with a null tuple value which should not advance the dupsCursor
+        ii = 5;
+        cursor = table.cursor();
+        cursor.before( new Tuple<Integer,Integer>( 5, null ) );
+        while ( cursor.next() )
+        {
+            if ( ii > 17 + SIZE && ii < 21 + SIZE )
+            {
+                assertFalse( table.has( ii ) );
+                continue;
+            }
+
+            Tuple<Integer,Integer> tuple = cursor.get();
+            if ( ii > 12 && ii < 17 + SIZE )
+            {
+                assertEquals( 13, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            else
+            {
+                assertEquals( ii, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            ii++;
+        }
+
+        // test before to advance just before a key value pair where the key
+        // does not exist - using value so we hit check for key equality
+        ii = 21 + SIZE;
+        cursor = table.cursor();
+        cursor.before( new Tuple<Integer,Integer>( 18 + SIZE, 18 + SIZE ) );
+        while ( cursor.next() )
+        {
+            if ( ii > 17 + SIZE && ii < 21 + SIZE )
+            {
+                assertFalse( table.has( ii ) );
+                continue;
+            }
+
+            Tuple<Integer,Integer> tuple = cursor.get();
+            if ( ii > 12 && ii < 17 + SIZE )
+            {
+                assertEquals( 13, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            else
+            {
+                assertEquals( ii, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            ii++;
+        }
+
+        // test after to advance just after the end
+        cursor = table.cursor();
+        cursor.after( new Tuple<Integer,Integer>( 111, null ) );
+        assertFalse( cursor.next() );
+
+        // test after to advance just before a key with a single value
+        ii = 6;
+        cursor = table.cursor();
+        cursor.after( new Tuple<Integer,Integer>( 5, null ) );
+        while ( cursor.next() )
+        {
+            if ( ii > 17 + SIZE && ii < 21 + SIZE )
+            {
+                assertFalse( table.has( ii ) );
+                continue;
+            }
+
+            Tuple<Integer,Integer> tuple = cursor.get();
+            if ( ii > 12 && ii < 17 + SIZE )
+            {
+                assertEquals( 13, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            else
+            {
+                assertEquals( ii, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            ii++;
+        }
+
+        // test before to advance just before a key & value with multiple
+        // values for the key - we should advance just before the value
+        cursor = table.cursor();
+        cursor.before( new Tuple<Integer,Integer>( 13, 14 ) );
+
+        cursor.next();
+        Tuple<Integer,Integer> tuple = cursor.get();
+        assertEquals( 13, ( int ) tuple.getKey() );
+        assertEquals( 14, ( int ) tuple.getValue() );
+        ii = 15;
+
+        while ( cursor.next() )
+        {
+            if ( ii > 17 + SIZE && ii < 21 + SIZE )
+            {
+                assertFalse( table.has( ii ) );
+                continue;
+            }
+
+            tuple = cursor.get();
+            if ( ii > 12 && ii < 17 + SIZE )
+            {
+                assertEquals( 13, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            else
+            {
+                assertEquals( ii, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            ii++;
+        }
+
+        // test after to advance just before a key & value with multiple
+        // values for the key - we should advance just before the value
+        cursor = table.cursor();
+        cursor.after( new Tuple<Integer,Integer>( 13, 14 ) );
+
+        cursor.next();
+        tuple = cursor.get();
+        assertEquals( 13, ( int ) tuple.getKey() );
+        assertEquals( 15, ( int ) tuple.getValue() );
+        ii=16;
+
+        while ( cursor.next() )
+        {
+            if ( ii > 17 + SIZE && ii < 21 + SIZE )
+            {
+                assertFalse( table.has( ii ) );
+                continue;
+            }
+
+            tuple = cursor.get();
+            if ( ii > 12 && ii < 17 + SIZE )
+            {
+                assertEquals( 13, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            else
+            {
+                assertEquals( ii, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            ii++;
+        }
+
+        // test after to advance just before a key that does not exist
+        cursor = table.cursor();
+        cursor.after( new Tuple<Integer,Integer>( 18 + SIZE, null ) );
+
+        cursor.next();
+        tuple = cursor.get();
+        assertEquals( 21 + SIZE, ( int ) tuple.getKey() );
+        assertEquals( 21 + SIZE, ( int ) tuple.getValue() );
+        ii=22 + SIZE;
+
+        while ( cursor.next() )
+        {
+            if ( ii > 17 + SIZE && ii < 21 + SIZE )
+            {
+                assertFalse( table.has( ii ) );
+                continue;
+            }
+
+            tuple = cursor.get();
+            if ( ii > 12 && ii < 17 + SIZE )
+            {
+                assertEquals( 13, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            else
+            {
+                assertEquals( ii, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            ii++;
+        }
+
+        // test after to advance just before a key and value where the key
+        // does not exist - used to force key comparison in after()
+        cursor = table.cursor();
+        cursor.after( new Tuple<Integer,Integer>( 18 + SIZE , 18 + SIZE ) );
+
+        cursor.next();
+        tuple = cursor.get();
+        assertEquals( 21 + SIZE, ( int ) tuple.getKey() );
+        assertEquals( 21 + SIZE, ( int ) tuple.getValue() );
+        ii=22+ SIZE;
+
+        while ( cursor.next() )
+        {
+            if ( ii > 17 + SIZE && ii < 21 + SIZE )
+            {
+                assertFalse( table.has( ii ) );
+                continue;
+            }
+
+            tuple = cursor.get();
+            if ( ii > 12 && ii < 17 + SIZE )
+            {
+                assertEquals( 13, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            else
+            {
+                assertEquals( ii, ( int ) tuple.getKey() );
+                assertEquals( ii, ( int ) tuple.getValue() );
+            }
+            ii++;
+        }
+    }
+
+
+    @Test
+    public void testMiscellaneous() throws Exception
+    {
+        Cursor<Tuple<Integer,Integer>> cursor = table.cursor();
+        assertNotNull( cursor );
+        assertTrue( cursor.isElementReused() );
+
+        try
+        {
+            cursor.get();
+            fail( "Should never get here due to invalid cursor position exception." );
+        }
+        catch( InvalidCursorPositionException e )
+        {
         }
     }
 }