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 2006/09/11 07:41:40 UTC
svn commit: r442107 - in /directory/branches/apacheds/optimization2:
core/src/main/java/org/apache/directory/server/core/partition/impl/btree/
core/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/
core/src/test/java/org/apache/...
Author: akarasulu
Date: Sun Sep 10 22:41:39 2006
New Revision: 442107
URL: http://svn.apache.org/viewvc?view=rev&rev=442107
Log:
changes ...
o added more test for greater coverage with btree based duplicates
o fixed bug in optimizer due to integer overflow
o fixed bug in enumeration for duplcates where table was null
o fixd bug in jdbm table dealing with removal operations in btrees for dups
o fixed DumpCommand to now use new Index constructor overload
o fixed MANIFEST.MF to use new 1.0-SNAPSHOT jars instead of RC4 in tools prj
Added:
directory/branches/apacheds/optimization2/core/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTableDupsBTreeTest.java
Modified:
directory/branches/apacheds/optimization2/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultOptimizer.java
directory/branches/apacheds/optimization2/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/DupsEnumeration.java
directory/branches/apacheds/optimization2/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTable.java
directory/branches/apacheds/optimization2/server-tools/src/main/java/org/apache/directory/server/tools/DumpCommand.java
directory/branches/apacheds/optimization2/server-tools/src/main/manifest/MANIFEST.MF
Modified: directory/branches/apacheds/optimization2/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultOptimizer.java
URL: http://svn.apache.org/viewvc/directory/branches/apacheds/optimization2/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultOptimizer.java?view=diff&rev=442107&r1=442106&r2=442107
==============================================================================
--- directory/branches/apacheds/optimization2/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultOptimizer.java (original)
+++ directory/branches/apacheds/optimization2/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultOptimizer.java Sun Sep 10 22:41:39 2006
@@ -178,7 +178,7 @@
*/
private BigInteger getConjunctionScan( BranchNode node ) throws NamingException
{
- BigInteger count = BigInteger.valueOf( Integer.MAX_VALUE );
+ BigInteger count = MAX;
ArrayList children = node.getChildren();
for ( int ii = 0; ii < children.size(); ii++ )
@@ -243,6 +243,12 @@
ExprNode child = ( ExprNode ) children.get( ii );
annotate( child );
total = total.add( ( BigInteger ) child.get( "count" ) );
+ }
+
+ // we don't want values bigger than Integer.MAX_VALUE
+ if ( total.compareTo( MAX ) > 0 )
+ {
+ total = MAX;
}
return total;
Modified: directory/branches/apacheds/optimization2/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/DupsEnumeration.java
URL: http://svn.apache.org/viewvc/directory/branches/apacheds/optimization2/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/DupsEnumeration.java?view=diff&rev=442107&r1=442106&r2=442107
==============================================================================
--- directory/branches/apacheds/optimization2/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/DupsEnumeration.java (original)
+++ directory/branches/apacheds/optimization2/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/DupsEnumeration.java Sun Sep 10 22:41:39 2006
@@ -86,6 +86,7 @@
*/
public DupsEnumeration( JdbmTable table, NoDupsEnumeration list ) throws NamingException
{
+ this.table = table;
underlying = list;
// Protect against closed cursors
Modified: directory/branches/apacheds/optimization2/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTable.java
URL: http://svn.apache.org/viewvc/directory/branches/apacheds/optimization2/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTable.java?view=diff&rev=442107&r1=442106&r2=442107
==============================================================================
--- directory/branches/apacheds/optimization2/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTable.java (original)
+++ directory/branches/apacheds/optimization2/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTable.java Sun Sep 10 22:41:39 2006
@@ -897,7 +897,7 @@
if ( storedValues instanceof BTreeRedirect )
{
BTree tree = getBTree( ( BTreeRedirect ) storedValues );
-
+ Object first = null;
while ( values.hasMore() )
{
Object val = values.next();
@@ -905,10 +905,15 @@
if ( removeDupFromBTree( tree, val ) )
{
count--;
+
+ if ( first == null )
+ {
+ first = val;
+ }
}
}
- return storedValues;
+ return first;
}
throw new IllegalStateException( "When using duplicate keys either a TreeSet or BTree is used for values." );
@@ -944,7 +949,7 @@
{
BTree tree = getBTree( ( BTreeRedirect ) returned );
this.count -= tree.size();
- removeAll( tree );
+ return removeAll( tree );
}
throw new IllegalStateException( "When using duplicate keys either a TreeSet or BTree is used for values." );
@@ -1506,6 +1511,22 @@
}
else
{
+ /*
+ * Calls to getPrevious() will return a lower key even
+ * if there exists a key equal to the one searched
+ * for. Since isGreaterThan when false really means
+ * 'less than or equal to' we must check to see if
+ * the key in front is equal to the key argument provided.
+ */
+ success = browser.getNext( tuple );
+ if ( success )
+ {
+ Object biggerKey = tuple.getKey();
+ if ( comparator.compareValue( key, biggerKey ) == 0 )
+ {
+ return true;
+ }
+ }
return false;
}
}
@@ -1530,12 +1551,13 @@
boolean success = browser.getNext( tuple );
if ( success )
{
- return true;
- }
- else
- {
- return false;
+ if ( comparator.compareValue( key, tuple.getKey() ) == 0 )
+ {
+ return true;
+ }
}
+
+ return false;
}
catch ( IOException e )
{
@@ -1568,7 +1590,11 @@
{
try
{
- Object removed = tree.remove( value );
+ Object removed = null;
+ if ( tree.find( value ) != null )
+ {
+ removed = tree.remove( value );
+ }
return null != removed;
}
catch ( IOException e )
@@ -1603,8 +1629,9 @@
}
- private void removeAll( BTree tree ) throws NamingException
+ private Object removeAll( BTree tree ) throws NamingException
{
+ Object first = null;
jdbm.helper.Tuple jdbmTuple = new jdbm.helper.Tuple();
TupleBrowser browser;
try
@@ -1613,6 +1640,10 @@
while( browser.getNext( jdbmTuple ) )
{
tree.remove( jdbmTuple.getKey() );
+ if ( first == null )
+ {
+ first = jdbmTuple.getKey();
+ }
}
}
catch ( IOException e )
@@ -1622,6 +1653,8 @@
lne.setRootCause( e );
throw lne;
}
+
+ return first;
}
}
Added: directory/branches/apacheds/optimization2/core/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTableDupsBTreeTest.java
URL: http://svn.apache.org/viewvc/directory/branches/apacheds/optimization2/core/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTableDupsBTreeTest.java?view=auto&rev=442107
==============================================================================
--- directory/branches/apacheds/optimization2/core/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTableDupsBTreeTest.java (added)
+++ directory/branches/apacheds/optimization2/core/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTableDupsBTreeTest.java Sun Sep 10 22:41:39 2006
@@ -0,0 +1,654 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.directory.server.core.partition.impl.btree.jdbm;
+
+
+import java.io.File;
+import java.io.Serializable;
+import java.math.BigInteger;
+
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+
+import org.apache.directory.server.core.partition.impl.btree.Tuple;
+import org.apache.directory.server.core.partition.impl.btree.TupleComparator;
+import org.apache.directory.server.core.schema.SerializableComparator;
+import org.apache.directory.shared.ldap.util.ArrayEnumeration;
+import org.apache.directory.shared.ldap.util.BigIntegerComparator;
+
+import jdbm.RecordManager;
+import jdbm.recman.BaseRecordManager;
+
+import junit.framework.TestCase;
+
+
+/**
+ * Tests for JdbmTable.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+public class JdbmTableDupsBTreeTest extends TestCase implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+ private transient File tempFile = null;
+ private transient RecordManager rm = null;
+ private final BigIntegerComparator biComparator = new BigIntegerComparator();
+ private final SerializableComparator serializableComparator = new SerializableComparator( "integerMatchingRule" )
+ {
+ private static final long serialVersionUID = 1L;
+
+ public int compare( Object o1, Object o2 )
+ {
+ return biComparator.compare( o1, o2 );
+ }
+ };
+ private TupleComparator comparator = new TupleComparator()
+ {
+ private static final long serialVersionUID = 1L;
+
+ public int compareKey( Object key1, Object key2 )
+ {
+ return biComparator.compare( key1, key2 );
+ }
+
+ public int compareValue( Object value1, Object value2 )
+ {
+ return biComparator.compare( value1, value2 );
+ }
+
+ public SerializableComparator getKeyComparator()
+ {
+ return serializableComparator;
+ }
+
+ public SerializableComparator getValueComparator()
+ {
+ return serializableComparator;
+ }
+ };
+
+
+ transient JdbmTable table;
+
+
+ /**
+ * Here's what the table looks like:
+ * <pre>
+ * .-.-.
+ * |1|0|
+ * |1|1|
+ * |1|2|
+ * |2|1|
+ * |4|1|
+ * |5|1|
+ * .-.-.
+ * </pre>
+ */
+ public void setUp() throws Exception
+ {
+ tempFile = File.createTempFile( "jdbm", "test" );
+ rm = new BaseRecordManager( tempFile.getAbsolutePath() );
+
+ // make sure the table never uses a btree for duplicates
+ table = new JdbmTable( "test", true, 1, rm, comparator );
+
+ for ( BigInteger ii = BigInteger.ZERO; ii.intValue() < 3; ii = ii.add( BigInteger.ONE ) )
+ {
+ table.put( BigInteger.ONE, ii );
+ }
+
+ table.put( new BigInteger( "2" ), BigInteger.ONE );
+ table.put( new BigInteger( "4" ), BigInteger.ONE );
+ table.put( new BigInteger( "5" ), BigInteger.ONE );
+ }
+
+
+ /**
+ * Tests the has() methods for correct behavoir:
+ * <ul>
+ * <li>has(Object)</li>
+ * <li>has(Object, boolean)</li>
+ * <li>has(Object, Object)</li>
+ * <li>has(Object, Object, boolean)</li>
+ * </ul>
+ *
+ * @throws NamingException
+ */
+ public void testHas() throws Exception
+ {
+ // test the has( Object ) method
+ assertTrue( table.has( BigInteger.ONE ) );
+ assertTrue( table.has( new BigInteger("2") ) );
+ assertTrue( table.has( new BigInteger("4") ) );
+ assertTrue( table.has( new BigInteger("5") ) );
+ assertFalse( table.has( new BigInteger("3") ) );
+ assertFalse( table.has( BigInteger.ZERO ) );
+ assertFalse( table.has( new BigInteger( "999" ) ) );
+
+ // test the has( Object, Object ) method
+ assertTrue( table.has( BigInteger.ONE, BigInteger.ONE ) );
+ assertTrue( table.has( new BigInteger("2"), BigInteger.ONE ) );
+ assertTrue( table.has( new BigInteger("4"), BigInteger.ONE ) );
+ assertTrue( table.has( new BigInteger("5"), BigInteger.ONE ) );
+ assertFalse( table.has( new BigInteger("5"), BigInteger.ZERO ) );
+ assertFalse( table.has( new BigInteger("3"), BigInteger.ONE ) );
+ assertFalse( table.has( BigInteger.ONE, new BigInteger("999") ) );
+ assertFalse( table.has( new BigInteger( "999" ), BigInteger.ONE ) );
+
+ // test the has( Object, boolean ) method
+ assertFalse( table.has( BigInteger.ZERO, false ) ); // we do not have a key less than or equal to 0
+ assertTrue( table.has( BigInteger.ONE, false ) ); // we do have a key less than or equal to 1
+ assertTrue( table.has( BigInteger.ZERO, true ) ); // we do have a key greater than or equal to 0
+ assertTrue( table.has( BigInteger.ONE, true ) ); // we do have a key greater than or equal to 1
+ assertTrue( table.has( new BigInteger( "5" ), true ) ); // we do have a key greater than or equal to 5
+ assertFalse( table.has( new BigInteger( "6" ), true ) ); // we do NOT have a key greater than or equal to 11
+ assertFalse( table.has( new BigInteger( "999" ), true ) ); // we do NOT have a key greater than or equal to 12
+
+ // test the has( Object, Object, boolean ) method
+ assertTrue( table.has( BigInteger.ONE, BigInteger.ZERO, true ) );
+ assertTrue( table.has( BigInteger.ONE, BigInteger.ONE, true ) );
+ assertTrue( table.has( BigInteger.ONE, new BigInteger("2"), true ) );
+ assertFalse( table.has( BigInteger.ONE, new BigInteger("3"), true ) );
+ assertTrue( table.has( BigInteger.ONE, BigInteger.ZERO, false ) );
+ assertFalse( table.has( BigInteger.ONE, new BigInteger("-1"), false ) );
+ }
+
+
+ /**
+ * Tests the count() methods for correct behavoir:
+ * <ul>
+ * <li>count()</li>
+ * <li>count(Object)</li>
+ * <li>count(Object, boolean)</li>
+ * </ul>
+ *
+ * @throws Exception
+ */
+ public void testCount() throws Exception
+ {
+ // test the count() method
+ assertEquals( 6, table.count() );
+
+ // test the count(Object) method
+ assertEquals( 3, table.count( BigInteger.ONE ) );
+ assertEquals( 0, table.count( BigInteger.ZERO ) );
+ assertEquals( 1, table.count( new BigInteger( "2" ) ) );
+
+ // test the count( Object, boolean ) method
+ // note for speed this count method returns the same as count()
+ assertEquals( table.count(), table.count( BigInteger.ONE, true ) );
+ }
+
+
+ /**
+ * Tests the get() method for correct behavoir.
+ *
+ * @throws Exception
+ */
+ public void testGet() throws Exception
+ {
+ assertEquals( BigInteger.ZERO, table.get( BigInteger.ONE ) );
+ assertEquals( BigInteger.ONE, table.get( new BigInteger( "2" ) ) );
+ assertEquals( null, table.get( new BigInteger( "3" ) ) );
+ assertEquals( BigInteger.ONE, table.get( new BigInteger( "4" ) ) );
+ assertEquals( BigInteger.ONE, table.get( new BigInteger( "5" ) ) );
+ }
+
+
+ /**
+ * Tests the listTuples() methods for correct behavoir:
+ * <ul>
+ * <li>listTuples()</li>
+ * <li>listTuples(Object)</li>
+ * <li>listTuples(Object,boolean)</li>
+ * <li>listTuples(Object,Object,boolean)</li>
+ * </ul>
+ *
+ * @throws Exception
+ */
+ public void testListTuples() throws Exception
+ {
+ Tuple tuple;
+
+ // -------------------------------------------------------------------
+ // test the listTuples() method
+ // -------------------------------------------------------------------
+
+ NamingEnumeration tuples = table.listTuples();
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( BigInteger.ONE, tuple.getKey() );
+ assertEquals( BigInteger.ZERO, tuple.getValue() );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( BigInteger.ONE, tuple.getKey() );
+ assertEquals( BigInteger.ONE, tuple.getValue() );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( BigInteger.ONE, tuple.getKey() );
+ assertEquals( new BigInteger( "2" ), tuple.getValue() );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( new BigInteger( "2" ), tuple.getKey() );
+ assertEquals( BigInteger.ONE, tuple.getValue() );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( new BigInteger( "4" ), tuple.getKey() );
+ assertEquals( BigInteger.ONE, tuple.getValue() );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( new BigInteger( "5" ), tuple.getKey() );
+ assertEquals( BigInteger.ONE, tuple.getValue() );
+
+ assertFalse( tuples.hasMore() );
+
+ // -------------------------------------------------------------------
+ // test the listTuples(Object) method
+ // -------------------------------------------------------------------
+
+ tuples = table.listTuples( BigInteger.ZERO );
+ assertFalse( tuples.hasMore() );
+
+ tuples = table.listTuples( new BigInteger( "2" ) );
+ assertTrue( tuples.hasMore() );
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( new BigInteger( "2" ), tuple.getKey() );
+ assertEquals( BigInteger.ONE, tuple.getValue() );
+ assertFalse( tuples.hasMore() );
+
+ tuples = table.listTuples( BigInteger.ONE );
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( BigInteger.ONE, tuple.getKey() );
+ assertEquals( BigInteger.ZERO, tuple.getValue() );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( BigInteger.ONE, tuple.getKey() );
+ assertEquals( BigInteger.ONE, tuple.getValue() );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( BigInteger.ONE, tuple.getKey() );
+ assertEquals( new BigInteger( "2" ), tuple.getValue() );
+
+ assertFalse( tuples.hasMore() );
+
+ // -------------------------------------------------------------------
+ // test the listTuples(Object, boolean) method
+ // -------------------------------------------------------------------
+
+ tuples = table.listTuples( BigInteger.ZERO, false );
+ assertFalse( tuples.hasMore() );
+
+
+ tuples = table.listTuples( BigInteger.ONE, false );
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( BigInteger.ONE, tuple.getKey() );
+ assertEquals( new BigInteger( "2" ), tuple.getValue() );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( BigInteger.ONE, tuple.getKey() );
+ assertEquals( BigInteger.ONE, tuple.getValue() );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( BigInteger.ONE, tuple.getKey() );
+ assertEquals( BigInteger.ZERO, tuple.getValue() );
+ assertFalse( tuples.hasMore() );
+
+
+ tuples = table.listTuples( new BigInteger( "2" ), false );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( new BigInteger( "2" ), tuple.getKey() );
+ assertEquals( BigInteger.ONE, tuple.getValue() );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( BigInteger.ONE, tuple.getKey() );
+ assertEquals( new BigInteger( "2" ), tuple.getValue() );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( BigInteger.ONE, tuple.getKey() );
+ assertEquals( BigInteger.ONE, tuple.getValue() );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( BigInteger.ONE, tuple.getKey() );
+ assertEquals( BigInteger.ZERO, tuple.getValue() );
+ assertFalse( tuples.hasMore() );
+
+
+ tuples = table.listTuples( new BigInteger( "6" ), true );
+ assertFalse( tuples.hasMore() );
+
+
+ tuples = table.listTuples( new BigInteger( "5" ), true );
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( new BigInteger( "5" ), tuple.getKey() );
+ assertEquals( BigInteger.ONE, tuple.getValue() );
+ assertFalse( tuples.hasMore() );
+
+
+ tuples = table.listTuples( new BigInteger( "4" ), true );
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( new BigInteger( "4" ), tuple.getKey() );
+ assertEquals( BigInteger.ONE, tuple.getValue() );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( new BigInteger( "5" ), tuple.getKey() );
+ assertEquals( BigInteger.ONE, tuple.getValue() );
+ assertFalse( tuples.hasMore() );
+
+ // -------------------------------------------------------------------
+ // test the listTuples(Object,Object,boolean) method
+ // -------------------------------------------------------------------
+
+ tuples = table.listTuples( BigInteger.ZERO, BigInteger.ZERO, true );
+ assertFalse( tuples.hasMore() );
+
+ tuples = table.listTuples( BigInteger.ZERO, BigInteger.ZERO, false );
+ assertFalse( tuples.hasMore() );
+
+ tuples = table.listTuples( new BigInteger( "2" ), BigInteger.ZERO, false );
+ assertFalse( tuples.hasMore() );
+
+ tuples = table.listTuples( new BigInteger( "2" ), new BigInteger( "99" ), true );
+ assertFalse( tuples.hasMore() );
+
+ tuples = table.listTuples( new BigInteger( "2" ), BigInteger.ONE, false );
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( new BigInteger( "2" ), tuple.getKey() );
+ assertEquals( BigInteger.ONE, tuple.getValue() );
+ assertFalse( tuples.hasMore() );
+
+ tuples = table.listTuples( new BigInteger( "2" ), new BigInteger( "99" ), false );
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( new BigInteger( "2" ), tuple.getKey() );
+ assertEquals( BigInteger.ONE, tuple.getValue() );
+ assertFalse( tuples.hasMore() );
+
+
+ tuples = table.listTuples( BigInteger.ONE, new BigInteger( "3" ), true );
+ assertFalse( tuples.hasMore() );
+
+
+ tuples = table.listTuples( BigInteger.ONE, new BigInteger( "-1" ), false );
+ assertFalse( tuples.hasMore() );
+
+
+ tuples = table.listTuples( BigInteger.ONE, new BigInteger( "1" ), true );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( BigInteger.ONE, tuple.getKey() );
+ assertEquals( BigInteger.ONE, tuple.getValue() );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( BigInteger.ONE, tuple.getKey() );
+ assertEquals( new BigInteger( "2" ), tuple.getValue() );
+
+ assertFalse( tuples.hasMore() );
+
+
+ tuples = table.listTuples( BigInteger.ONE, new BigInteger( "1" ), false );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( BigInteger.ONE, tuple.getKey() );
+ assertEquals( BigInteger.ONE, tuple.getValue() );
+
+ assertTrue( tuples.hasMore() ) ;
+ tuple = ( Tuple ) tuples.next();
+ assertEquals( BigInteger.ONE, tuple.getKey() );
+ assertEquals( BigInteger.ZERO, tuple.getValue() );
+
+ assertFalse( tuples.hasMore() );
+
+ }
+
+
+ /**
+ * Tests the listValues() method for correct behavoir.
+ */
+ public void testListValues() throws Exception
+ {
+ // -------------------------------------------------------------------
+ // test the listValues(Object) method
+ // -------------------------------------------------------------------
+
+ NamingEnumeration values = table.listValues( BigInteger.ZERO );
+ assertFalse( values.hasMore() );
+
+ values = table.listValues( new BigInteger( "2" ) );
+ assertTrue( values.hasMore() );
+ Object value = values.next();
+ assertEquals( BigInteger.ONE, value );
+ assertFalse( values.hasMore() );
+
+ values = table.listValues( BigInteger.ONE );
+ assertTrue( values.hasMore() ) ;
+ value = values.next();
+ assertEquals( BigInteger.ZERO, value );
+
+ assertTrue( values.hasMore() ) ;
+ value = values.next();
+ assertEquals( BigInteger.ONE, value );
+
+ assertTrue( values.hasMore() ) ;
+ value = values.next();
+ assertEquals( new BigInteger( "2" ), value );
+
+ assertFalse( values.hasMore() );
+ }
+
+
+ /**
+ * Tests the put() methods for correct behavior:
+ * <ul>
+ * <li>put(Object, Object)</li>
+ * <li>put(Object, NamingEnumeration)</li>
+ * </ul>
+ */
+ public void testPut() throws Exception
+ {
+ // put(Object,Object) already tested in setUp() tests the
+ // this instead tests the NamingEnumeration overload
+
+ NamingEnumeration values = new ArrayNE( new Object[] {
+ new BigInteger( "3" ),
+ new BigInteger( "4" ),
+ new BigInteger( "5" ),
+ new BigInteger( "6" ),
+ } );
+
+ table.put( BigInteger.ONE, values );
+ assertFalse( values.hasMore() );
+
+ values = table.listValues( BigInteger.ONE );
+
+ assertTrue( values.hasMore() );
+ assertEquals( BigInteger.ZERO, values.next() );
+
+ assertTrue( values.hasMore() );
+ assertEquals( BigInteger.ONE, values.next() );
+
+ assertTrue( values.hasMore() );
+ assertEquals( new BigInteger( "2" ), values.next() );
+
+ assertTrue( values.hasMore() );
+ assertEquals( new BigInteger( "3" ), values.next() );
+
+ assertTrue( values.hasMore() );
+ assertEquals( new BigInteger( "4" ), values.next() );
+
+ assertTrue( values.hasMore() );
+ assertEquals( new BigInteger( "5" ), values.next() );
+
+ assertTrue( values.hasMore() );
+ assertEquals( new BigInteger( "6" ), values.next() );
+ assertFalse( values.hasMore() );
+
+
+ values = new ArrayNE( new Object[] {
+ new BigInteger( "3" ),
+ new BigInteger( "4" ),
+ new BigInteger( "5" ),
+ new BigInteger( "6" ),
+ } );
+
+ table.put( BigInteger.ZERO, values );
+ assertFalse( values.hasMore() );
+
+ values = table.listValues( BigInteger.ZERO );
+
+ assertTrue( values.hasMore() );
+ assertEquals( new BigInteger( "3" ), values.next() );
+
+ assertTrue( values.hasMore() );
+ assertEquals( new BigInteger( "4" ), values.next() );
+
+ assertTrue( values.hasMore() );
+ assertEquals( new BigInteger( "5" ), values.next() );
+
+ assertTrue( values.hasMore() );
+ assertEquals( new BigInteger( "6" ), values.next() );
+ assertFalse( values.hasMore() );
+ }
+
+
+ /**
+ * Tests the remove(Object) for correct behavoir:
+ */
+ public void testRemoveObject() throws Exception
+ {
+ // -------------------------------------------------------------------
+ // tests the remove(Object) method
+ // -------------------------------------------------------------------
+
+ try
+ {
+ table.remove( BigInteger.ZERO );
+ fail( "should not get here trying to remove non-existent key" );
+ }
+ catch ( IllegalArgumentException e )
+ {
+ }
+
+ Object value = table.remove( new BigInteger( "2" ) );
+ assertEquals( BigInteger.ONE, value );
+ assertEquals( 5, table.count() );
+
+ value = table.remove( BigInteger.ONE );
+ assertEquals( BigInteger.ZERO, value ); // return first value of dups
+ assertEquals( 2, table.count() );
+ }
+
+
+ /**
+ * Tests the remove(Object,Object) for correct behavoir:
+ */
+ public void testRemoveObjectObject() throws Exception
+ {
+ // -------------------------------------------------------------------
+ // tests the remove(Object) method
+ // -------------------------------------------------------------------
+
+ Object value = table.remove( BigInteger.ZERO, BigInteger.ZERO );
+ assertNull( value );
+
+ value = table.remove( new BigInteger( "2" ), BigInteger.ONE );
+ assertEquals( BigInteger.ONE, value );
+ assertEquals( 5, table.count() );
+
+ value = table.remove( BigInteger.ONE, new BigInteger( "2" ) );
+ assertEquals( new BigInteger( "2" ), value );
+ assertEquals( 4, table.count() );
+ }
+
+
+ /**
+ * Tests the remove(Object,NamingEnumeration) for correct behavoir:
+ */
+ public void testRemoveObjectNamingEnumeration() throws Exception
+ {
+ NamingEnumeration values = new ArrayNE( new Object[] {
+ new BigInteger( "1" ),
+ new BigInteger( "2" )
+ } );
+
+ Object value = table.remove( BigInteger.ONE, values );
+ assertEquals( BigInteger.ONE, value );
+ assertEquals( 4, table.count() );
+ }
+
+
+// private void printTuples( NamingEnumeration tuples ) throws NamingException
+// {
+// while ( tuples.hasMore() )
+// {
+// Tuple tuple = ( Tuple ) tuples.next();
+// System.out.println( "(" + tuple.getKey() + ", " + tuple.getValue() + ")" );
+// }
+// }
+
+
+ class ArrayNE extends ArrayEnumeration implements NamingEnumeration
+ {
+ public ArrayNE( Object[] array )
+ {
+ super( array );
+ }
+
+ public void close() throws NamingException
+ {
+ }
+
+ public boolean hasMore() throws NamingException
+ {
+ return hasMoreElements();
+ }
+
+ public Object next() throws NamingException
+ {
+ return nextElement();
+ }
+ }
+}
+
+
\ No newline at end of file
Modified: directory/branches/apacheds/optimization2/server-tools/src/main/java/org/apache/directory/server/tools/DumpCommand.java
URL: http://svn.apache.org/viewvc/directory/branches/apacheds/optimization2/server-tools/src/main/java/org/apache/directory/server/tools/DumpCommand.java?view=diff&rev=442107&r1=442106&r2=442107
==============================================================================
--- directory/branches/apacheds/optimization2/server-tools/src/main/java/org/apache/directory/server/tools/DumpCommand.java (original)
+++ directory/branches/apacheds/optimization2/server-tools/src/main/java/org/apache/directory/server/tools/DumpCommand.java Sun Sep 10 22:41:39 2006
@@ -132,7 +132,7 @@
JdbmMasterTable master = new JdbmMasterTable( recMan );
AttributeType attributeType = bootstrapRegistries.getAttributeTypeRegistry().lookup( "apacheUpdn" );
- JdbmIndex idIndex = new JdbmIndex( attributeType, partitionDirectory, 1000 );
+ JdbmIndex idIndex = new JdbmIndex( attributeType, partitionDirectory, 1000, 1000 );
out.println( "#---------------------" );
NamingEnumeration list = master.listTuples();
Modified: directory/branches/apacheds/optimization2/server-tools/src/main/manifest/MANIFEST.MF
URL: http://svn.apache.org/viewvc/directory/branches/apacheds/optimization2/server-tools/src/main/manifest/MANIFEST.MF?view=diff&rev=442107&r1=442106&r2=442107
==============================================================================
--- directory/branches/apacheds/optimization2/server-tools/src/main/manifest/MANIFEST.MF (original)
+++ directory/branches/apacheds/optimization2/server-tools/src/main/manifest/MANIFEST.MF Sun Sep 10 22:41:39 2006
@@ -2,16 +2,16 @@
Main-Class: org.apache.directory.server.tools.ApachedsTools
Class-Path: logger.jar daemon.jar bootstrapper.jar
../lib/antlr-2.7.2.jar
- ../lib/apacheds-kerberos-shared-1.0-RC4.jar
- ../lib/apacheds-protocol-changepw-1.0-RC4.jar
- ../lib/apacheds-protocol-shared-1.0-RC4.jar
- ../lib/apacheds-protocol-kerberos-1.0-RC4.jar
- ../lib/apacheds-protocol-ldap-1.0-RC4.jar
- ../lib/apacheds-protocol-ntp-1.0-RC4.jar
- ../lib/apacheds-core-1.0-RC4.jar
- ../lib/apacheds-core-shared-1.0-RC4.jar
- ../lib/apacheds-server-jndi-1.0-RC4.jar
- ../lib/apacheds-server-main-1.0-RC4.jar
+ ../lib/apacheds-kerberos-shared-1.0-SNAPSHOT.jar
+ ../lib/apacheds-protocol-changepw-1.0-SNAPSHOT.jar
+ ../lib/apacheds-protocol-shared-1.0-SNAPSHOT.jar
+ ../lib/apacheds-protocol-kerberos-1.0-SNAPSHOT.jar
+ ../lib/apacheds-protocol-ldap-1.0-SNAPSHOT.jar
+ ../lib/apacheds-protocol-ntp-1.0-SNAPSHOT.jar
+ ../lib/apacheds-core-1.0-SNAPSHOT.jar
+ ../lib/apacheds-core-shared-1.0-SNAPSHOT.jar
+ ../lib/apacheds-server-jndi-1.0-SNAPSHOT.jar
+ ../lib/apacheds-server-main-1.0-SNAPSHOT.jar
../lib/commons-collections-3.0.jar
../lib/commons-lang-2.0.jar
../lib/commons-logging-1.0.4.jar