You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2012/04/30 17:59:27 UTC

svn commit: r1332268 [2/5] - in /directory/apacheds/trunk: ./ all/ core-annotations/ core-annotations/src/main/java/org/apache/directory/server/core/factory/ core-api/ core-api/src/main/java/org/apache/directory/server/core/api/changelog/ core-api/src/...

Added: directory/apacheds/trunk/ldap-client-test/src/test/java/org/apache/directory/shared/client/api/operations/search/SearchWithIndexTest.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/ldap-client-test/src/test/java/org/apache/directory/shared/client/api/operations/search/SearchWithIndexTest.java?rev=1332268&view=auto
==============================================================================
--- directory/apacheds/trunk/ldap-client-test/src/test/java/org/apache/directory/shared/client/api/operations/search/SearchWithIndexTest.java (added)
+++ directory/apacheds/trunk/ldap-client-test/src/test/java/org/apache/directory/shared/client/api/operations/search/SearchWithIndexTest.java Mon Apr 30 15:59:22 2012
@@ -0,0 +1,218 @@
+package org.apache.directory.shared.client.api.operations.search;
+
+import org.apache.directory.ldap.client.api.LdapNetworkConnection;
+import org.apache.directory.server.annotations.CreateLdapServer;
+import org.apache.directory.server.annotations.CreateTransport;
+import org.apache.directory.server.core.annotations.ContextEntry;
+import org.apache.directory.server.core.annotations.CreateDS;
+import org.apache.directory.server.core.annotations.CreateIndex;
+import org.apache.directory.server.core.annotations.CreatePartition;
+import org.apache.directory.server.core.integ.AbstractLdapTestUnit;
+import org.apache.directory.server.core.integ.FrameworkRunner;
+import org.apache.directory.shared.client.api.LdapApiIntegrationUtils;
+import org.apache.directory.shared.ldap.model.cursor.EntryCursor;
+import org.apache.directory.shared.ldap.model.entry.DefaultEntry;
+import org.apache.directory.shared.ldap.model.entry.Entry;
+import org.apache.directory.shared.ldap.model.message.SearchScope;
+import org.apache.directory.shared.ldap.model.name.Dn;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(FrameworkRunner.class)
+@CreateDS(
+    name="AddPerfDS",
+    partitions =
+    {
+        @CreatePartition(
+            name = "example",
+            suffix = "dc=example,dc=com",
+            contextEntry = @ContextEntry(
+                entryLdif =
+                    "dn: dc=example,dc=com\n" +
+                    "dc: example\n" +
+                    "objectClass: top\n" +
+                    "objectClass: domain\n\n" ),
+            indexes =
+            {
+                @CreateIndex( attribute = "objectClass" ),
+                @CreateIndex( attribute = "sn" ),
+                @CreateIndex( attribute = "cn" ),
+                @CreateIndex( attribute = "displayName" )
+            } )
+            
+    },
+    enableChangeLog = false )
+@CreateLdapServer(transports =
+    {
+        @CreateTransport(protocol = "LDAP"),
+        @CreateTransport(protocol = "LDAPS")
+    })
+public class SearchWithIndexTest extends AbstractLdapTestUnit
+{
+    private LdapNetworkConnection connection;
+    
+    
+    @Before
+    public void setup() throws Exception
+    {
+        connection = (LdapNetworkConnection)LdapApiIntegrationUtils.getPooledAdminConnection( getLdapServer() );
+
+        // Restart the service so that the index is created
+        getService().shutdown();
+        getService().startup();
+    }
+    
+    
+    @After
+    public void shutdown() throws Exception
+    {
+        LdapApiIntegrationUtils.releasePooledAdminConnection( connection, getLdapServer() );
+    }
+
+    /**
+     * Test an add operation performance
+     */
+    @Test
+    @Ignore
+    public void testAddPer2f() throws Exception
+    {
+        Dn dn = new Dn( "cn=test,ou=system" );
+        Entry entry = new DefaultEntry( getService().getSchemaManager(), dn,
+            "ObjectClass: top",
+            "ObjectClass: person",
+            "sn: TEST",
+            "cn: test" );
+    
+        connection.add( entry );
+        int nbIterations = 8000;
+
+        //BufferedWriter out = new BufferedWriter( new FileWriter("/tmp/out.txt") );
+
+        long t0 = System.currentTimeMillis();
+        long t00 = 0L;
+        long tt0 = System.currentTimeMillis();
+        
+        for ( int i = 0; i < nbIterations; i++ )
+        {
+            if ( i % 1000 == 0 )
+            {
+                long tt1 = System.currentTimeMillis();
+    
+                System.out.println( i + ", " + ( tt1 - tt0 ) );
+                tt0 = tt1;
+            }
+    
+            if ( i == 5000 )
+            {
+                t00 = System.currentTimeMillis();
+            }
+    
+            dn = new Dn( "uid=" + i + ",dc=example,dc=com" );
+            entry = new DefaultEntry( getService().getSchemaManager(), dn,
+                "objectClass: top",
+                "objectClass: person",
+                "objectClass: organizationalPerson",
+                "objectClass: inetOrgPerson",
+                "uid", Integer.toString( i ),
+                "mail: A-A-R.Awg-Rosli@acme.com",
+                "title: Snr Operations Technician (D)",
+                "sn: Awg-Rosli",
+                "departmentNumber: SMDS - UIA/G/MMO52D",
+                "cn: Awg-Rosli, Awg-Abd-Rahim SMDS-UIA/G/MMO52D",
+                "description: UI - S",
+                "telephoneNumber: 555-1212",
+                "givenName: Awg-Abd-Rahim",
+                "businessCategory: Ops MDS (Malaysia) Sdn Bhd",
+                "displayName", i + "Awg-Rosli, Awg-Abd-Rahim SMDS-UIA/G/MMO52D",
+                "employeeNumber: A-A-R.Awg-Rosli",
+                "pwdPolicySubEntry: ads-pwdId=cproint,ou=passwordPolicies,ads-interceptorId=authenticationInterceptor,ou=interceptors,ads-directoryServiceId=default,ou=config" );
+    
+            //out.write( LdifUtils.convertToLdif( entry ) );
+            connection.add( entry );
+        }
+        
+        //out.flush();
+        //out.close();
+    
+        long t1 = System.currentTimeMillis();
+    
+        Long deltaWarmed = ( t1 - t00 );
+        System.out.println( "Delta : " + deltaWarmed + "( " + ( ( ( nbIterations - 5000 ) * 1000 ) / deltaWarmed ) + " per s ) /" + ( t1 - t0 ) );
+
+        Entry entry1 = null;
+        Entry entry2 = null;
+        Entry entry3 = null;
+        
+        long ns0 = System.currentTimeMillis();
+        EntryCursor results = connection.search("dc=example,dc=com", "(displayName=1234Awg-Rosli, Awg-Abd-Rahim SMDS-UIA/G/MMO52D)", SearchScope.SUBTREE, "*" );
+        
+        while ( results.next() )
+        {
+            entry1 = results.get();
+            break;
+        }
+        
+        results.close();
+        
+        long ns1 = System.currentTimeMillis();
+        
+        System.out.println( "Delta search : " + ( ns1 - ns0 ) );
+
+        long ns2 = System.currentTimeMillis();
+        results = connection.search("dc=example,dc=com", "(displayName=3456*)", SearchScope.SUBTREE, "*" );
+                
+        while ( results.next() )
+        {
+            entry2 = results.get();
+            break;
+        }
+        results.close();
+        long ns3 = System.currentTimeMillis();
+        
+        System.out.println( "Delta search substring : " + ( ns3 - ns2 ) );
+
+        long ns4 = System.currentTimeMillis();
+        results = connection.search("dc=example,dc=com", "(uid=6789)", SearchScope.SUBTREE, "*" );
+                
+        while ( results.next() )
+        {
+            entry3 = results.get();
+            break;
+        }
+        
+        results.close();
+        long ns5 = System.currentTimeMillis();
+        
+        System.out.println( "Delta search no index : " + ( ns5 - ns4 ) );
+
+        System.out.println( "Entry 1 : " + entry1 );
+        System.out.println( "Entry 2 : " + entry2 );
+        System.out.println( "Entry 3 : " + entry3 );
+        connection.close();
+        
+        // Now, shutdown and restart the server once more
+        getService().shutdown();
+        getService().startup();
+        
+        // and do a search again
+        connection = (LdapNetworkConnection)LdapApiIntegrationUtils.getPooledAdminConnection( getLdapServer() );
+
+        long ns6 = System.currentTimeMillis();
+        results = connection.search("dc=example,dc=com", "(displayName=3456*)", SearchScope.SUBTREE, "*" );
+                
+        while ( results.next() )
+        {
+            entry3 = results.get();
+            break;
+        }
+        
+        results.close();
+        long ns7 = System.currentTimeMillis();
+        System.out.println( "New Delta search substring : " + ( ns7 - ns6 ) );
+
+        connection.close();
+    }
+}

Propchange: directory/apacheds/trunk/ldif-partition/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/ldif-partition:r1324715-1332211

Modified: directory/apacheds/trunk/ldif-partition/src/main/java/org/apache/directory/server/core/partition/ldif/LdifPartition.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/ldif-partition/src/main/java/org/apache/directory/server/core/partition/ldif/LdifPartition.java?rev=1332268&r1=1332267&r2=1332268&view=diff
==============================================================================
--- directory/apacheds/trunk/ldif-partition/src/main/java/org/apache/directory/server/core/partition/ldif/LdifPartition.java (original)
+++ directory/apacheds/trunk/ldif-partition/src/main/java/org/apache/directory/server/core/partition/ldif/LdifPartition.java Mon Apr 30 15:59:22 2012
@@ -34,14 +34,19 @@ import org.apache.directory.server.core.
 import org.apache.directory.server.core.api.interceptor.context.MoveOperationContext;
 import org.apache.directory.server.core.api.interceptor.context.RenameOperationContext;
 import org.apache.directory.server.i18n.I18n;
+import org.apache.directory.server.xdbm.ForwardIndexEntry;
 import org.apache.directory.server.xdbm.IndexCursor;
 import org.apache.directory.server.xdbm.IndexEntry;
+import org.apache.directory.server.xdbm.ParentIdAndRdn;
+import org.apache.directory.server.xdbm.SingletonIndexCursor;
+import org.apache.directory.server.xdbm.search.impl.DescendantCursor;
 import org.apache.directory.shared.ldap.model.constants.SchemaConstants;
 import org.apache.directory.shared.ldap.model.entry.DefaultEntry;
 import org.apache.directory.shared.ldap.model.entry.Entry;
 import org.apache.directory.shared.ldap.model.entry.Modification;
 import org.apache.directory.shared.ldap.model.exception.LdapException;
 import org.apache.directory.shared.ldap.model.exception.LdapInvalidDnException;
+import org.apache.directory.shared.ldap.model.exception.LdapOperationErrorException;
 import org.apache.directory.shared.ldap.model.exception.LdapOperationException;
 import org.apache.directory.shared.ldap.model.ldif.LdifEntry;
 import org.apache.directory.shared.ldap.model.ldif.LdifReader;
@@ -266,7 +271,7 @@ public class LdifPartition extends Abstr
         }
 
         // Get the modified entry and store it in the context for post usage
-        Entry modifiedEntry = lookup( id );
+        Entry modifiedEntry = lookup( id, modifyContext.getDn() );
         modifyContext.setAlteredEntry( modifiedEntry );
 
         // just overwrite the existing file
@@ -297,9 +302,16 @@ public class LdifPartition extends Abstr
         super.move( moveContext );
 
         // Get the modified entry
-        Entry modifiedEntry = lookup( id );
+        Entry modifiedEntry = lookup( id, moveContext.getNewDn() );
 
-        entryMoved( oldDn, modifiedEntry, id );
+        try
+        {
+            entryMoved( oldDn, modifiedEntry, id );
+        }
+        catch ( Exception e )
+        {
+            throw new LdapOperationErrorException( e.getMessage(), e );
+        }
     }
 
 
@@ -314,10 +326,17 @@ public class LdifPartition extends Abstr
         super.moveAndRename( moveAndRenameContext );
 
         // Get the modified entry and store it in the context for post usage
-        Entry modifiedEntry = lookup( id );
+        Entry modifiedEntry = lookup( id, moveAndRenameContext.getNewDn() );
         moveAndRenameContext.setModifiedEntry( modifiedEntry );
 
-        entryMoved( oldDn, modifiedEntry, id );
+        try
+        {
+            entryMoved( oldDn, modifiedEntry, id );
+        }
+        catch ( Exception e )
+        {
+            throw new LdapOperationErrorException( e.getMessage(), e );
+        }
     }
 
 
@@ -333,12 +352,20 @@ public class LdifPartition extends Abstr
         super.rename( renameContext );
 
         // Get the modified entry and store it in the context for post usage
-        Entry modifiedEntry = lookup( id );
+        Dn newDn = oldDn.getParent().add( renameContext.getNewRdn() );
+        Entry modifiedEntry = lookup( id, newDn );
         renameContext.setModifiedEntry( modifiedEntry );
 
         // Now move the potential children for the old entry
         // and remove the old entry
-        entryMoved( oldDn, modifiedEntry, id );
+        try
+        {
+            entryMoved( oldDn, modifiedEntry, id );
+        }
+        catch ( Exception e )
+        {
+            throw new LdapOperationErrorException( e.getMessage(), e );
+        }
     }
 
 
@@ -352,19 +379,30 @@ public class LdifPartition extends Abstr
      * @param deleteOldEntry a flag to tell whether to delete the old entry files
      * @throws Exception
      */
-    private void entryMoved( Dn oldEntryDn, Entry modifiedEntry, Long entryIdOld ) throws LdapException
+    private void entryMoved( Dn oldEntryDn, Entry modifiedEntry, Long entryIdOld ) throws Exception
     {
         // First, add the new entry
         addEntry( modifiedEntry );
+        
+        Long baseId = getEntryId( modifiedEntry.getDn() );
+
+        ParentIdAndRdn<Long> parentIdAndRdn = getRdnIndex().reverseLookup( baseId ); 
+        IndexEntry indexEntry = new ForwardIndexEntry();
+        
+        indexEntry.setId(baseId);
+        indexEntry.setKey( parentIdAndRdn );
+
+        IndexCursor<ParentIdAndRdn<Long>,Entry, Long> cursor = new SingletonIndexCursor<ParentIdAndRdn<Long>, Long>( indexEntry );
+        Long parentId = parentIdAndRdn.getParentId();
+
+        IndexCursor<Long, Entry, Long> scopeCursor = new DescendantCursor( this, baseId, parentId, cursor );
 
         // Then, if there are some children, move then to the new place
         try
         {
-            IndexCursor<Long, Entry, Long> cursor = getSubLevelIndex().forwardCursor( entryIdOld );
-
-            while ( cursor.next() )
+            while ( scopeCursor.next() )
             {
-                IndexEntry<Long, Long> entry = cursor.get();
+                IndexEntry<Long, Long> entry = scopeCursor.get();
 
                 // except the parent entry add the rest of entries
                 if ( entry.getId() != entryIdOld )
@@ -373,13 +411,13 @@ public class LdifPartition extends Abstr
                 }
             }
 
-            cursor.close();
+            scopeCursor.close();
         }
         catch ( Exception e )
         {
             throw new LdapOperationException( e.getMessage(), e );
         }
-
+        
         // And delete the old entry's LDIF file
         File file = getFile( oldEntryDn, DELETE );
         boolean deleted = deleteFile( file );

Modified: directory/apacheds/trunk/ldif-partition/src/main/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartition.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/ldif-partition/src/main/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartition.java?rev=1332268&r1=1332267&r2=1332268&view=diff
==============================================================================
--- directory/apacheds/trunk/ldif-partition/src/main/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartition.java (original)
+++ directory/apacheds/trunk/ldif-partition/src/main/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartition.java Mon Apr 30 15:59:22 2012
@@ -331,7 +331,7 @@ public class SingleFileLdifPartition ext
         IndexCursor<ParentIdAndRdn<Long>,Entry,Long> cursor = rdnIdx.forwardCursor();
         
         IndexEntry<ParentIdAndRdn<Long>, Long> startingPos = new ForwardIndexEntry<ParentIdAndRdn<Long>, Long>();
-        startingPos.setValue( new ParentIdAndRdn<Long>( id, (Rdn[]) null ) );
+        startingPos.setKey( new ParentIdAndRdn<Long>( id, (Rdn[]) null ) );
         cursor.before( startingPos );
         int countChildren = 0;
         
@@ -346,7 +346,7 @@ public class SingleFileLdifPartition ext
             countChildren++;
             
             // And now, the children
-            int nbChildren = element.getValue().getNbChildren();
+            int nbChildren = element.getKey().getNbChildren();
             
             if ( nbChildren > 0 )
             {

Propchange: directory/apacheds/trunk/protocol-changepw/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/protocol-changepw:r1324715-1332211

Propchange: directory/apacheds/trunk/protocol-dhcp/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/protocol-dhcp:r1324715-1332211

Propchange: directory/apacheds/trunk/protocol-dns/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/protocol-dns:r1324715-1332211

Propchange: directory/apacheds/trunk/protocol-kerberos/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/protocol-kerberos:r1324715-1332211

Propchange: directory/apacheds/trunk/protocol-ldap/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/protocol-ldap:r1324715-1332211

Propchange: directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/consumer/ReplicationConsumerImpl.java
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/consumer/ReplicationConsumerImpl.java:r1324715-1332211

Propchange: directory/apacheds/trunk/protocol-ntp/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/protocol-ntp:r1324715-1332211

Propchange: directory/apacheds/trunk/protocol-shared/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/protocol-shared:r1324715-1332211

Propchange: directory/apacheds/trunk/server-annotations/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/server-annotations:r1324715-1332211

Propchange: directory/apacheds/trunk/server-config/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/server-config:r1324715-1332211

Modified: directory/apacheds/trunk/server-config/src/main/java/org/apache/directory/server/config/ConfigPartitionReader.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/server-config/src/main/java/org/apache/directory/server/config/ConfigPartitionReader.java?rev=1332268&r1=1332267&r2=1332268&view=diff
==============================================================================
--- directory/apacheds/trunk/server-config/src/main/java/org/apache/directory/server/config/ConfigPartitionReader.java (original)
+++ directory/apacheds/trunk/server-config/src/main/java/org/apache/directory/server/config/ConfigPartitionReader.java Mon Apr 30 15:59:22 2012
@@ -728,8 +728,6 @@ public class ConfigPartitionReader
         // Prepare the search request
         AttributeType adsdAt = schemaManager.getAttributeType( SchemaConstants.OBJECT_CLASS_AT );
         EqualityNode<?> filter = new EqualityNode( adsdAt, new StringValue( name ) );
-        SearchControls controls = new SearchControls();
-        controls.setSearchScope( scope.ordinal() );
         IndexCursor<Long, Entry, Long> cursor = null;
 
         // Create a container for all the read beans
@@ -738,7 +736,7 @@ public class ConfigPartitionReader
         try
         {
             // Do the search
-            cursor = se.cursor( baseDn, AliasDerefMode.NEVER_DEREF_ALIASES, filter, controls );
+            cursor = se.cursor( baseDn, AliasDerefMode.NEVER_DEREF_ALIASES, filter, scope );
 
             // First, check if we have some entries to process.
             if ( !cursor.next() )

Propchange: directory/apacheds/trunk/server-config/src/main/java/org/apache/directory/server/config/ConfigPartitionReader.java
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/server-config/src/main/java/org/apache/directory/server/config/ConfigPartitionReader.java:r1324715-1332211

Propchange: directory/apacheds/trunk/server-config/src/main/resources/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/server-config/src/main/resources:r1324715-1332211

Propchange: directory/apacheds/trunk/server-config/src/test/java/org/apache/directory/server/config/ConfigPartitionReaderTest.java
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/server-config/src/test/java/org/apache/directory/server/config/ConfigPartitionReaderTest.java:r1324715-1332211

Propchange: directory/apacheds/trunk/server-integ/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/server-integ:r1324715-1332211

Modified: directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/ReferralSearchIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/ReferralSearchIT.java?rev=1332268&r1=1332267&r2=1332268&view=diff
==============================================================================
--- directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/ReferralSearchIT.java (original)
+++ directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/ReferralSearchIT.java Mon Apr 30 15:59:22 2012
@@ -124,306 +124,334 @@ import org.junit.runner.RunWith;
 })
 public class ReferralSearchIT extends AbstractLdapTestUnit
 {
-
-@Before
-public void setupReferrals() throws Exception
-{
-    String ldif =
-        "dn: c=europ,ou=Countries,ou=system\n" +
-            "objectClass: top\n" +
-            "objectClass: referral\n" +
-            "objectClass: extensibleObject\n" +
-            "c: europ\n" +
-            "ref: ldap://localhost:" + getLdapServer().getPort() + "/c=france,ou=system\n\n" +
-
-            "dn: c=america,ou=Countries,ou=system\n" +
-            "objectClass: top\n" +
-            "objectClass: referral\n" +
-            "objectClass: extensibleObject\n" +
-            "c: america\n" +
-            "ref: ldap://localhost:" + getLdapServer().getPort() + "/c=usa,ou=system\n\n";
-
-    LdifReader reader = new LdifReader( new StringReader( ldif ) );
-
-    while ( reader.hasNext() )
-    {
-        LdifEntry entry = reader.next();
-        getLdapServer().getDirectoryService().getAdminSession().add(
-            new DefaultEntry( getLdapServer().getDirectoryService().getSchemaManager(), entry.getEntry() ) );
-    }
-}
-
-
-@Test
-public void testSearchBaseIsReferral() throws Exception
-{
-    DirContext ctx = getWiredContextThrowOnRefferal( getLdapServer() );
-    SearchControls controls = new SearchControls();
-    controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
-
-    try
-    {
-        ctx.search( "ou=RemoteUsers,ou=system", "(objectClass=*)", controls );
-        fail( "should never get here" );
-    }
-    catch ( ReferralException e )
-    {
-        assertEquals( "ldap://fermi:10389/ou=users,ou=system??sub", e.getReferralInfo() );
-        assertTrue( e.skipReferral() );
-        assertEquals( "ldap://hertz:10389/ou=users,dc=example,dc=com??sub", e.getReferralInfo() );
-        assertTrue( e.skipReferral() );
-        assertEquals( "ldap://maxwell:10389/ou=users,ou=system??sub", e.getReferralInfo() );
-        assertFalse( e.skipReferral() );
-    }
-}
-
-
-@Test
-public void testSearchBaseParentIsReferral() throws Exception
-{
-    DirContext ctx = getWiredContextThrowOnRefferal( getLdapServer() );
-    SearchControls controls = new SearchControls();
-    controls.setSearchScope( SearchControls.OBJECT_SCOPE );
-
-    try
+    @Before
+    public void setupReferrals() throws Exception
     {
-        ctx.search( "cn=alex karasulu,ou=RemoteUsers,ou=system", "(objectClass=*)", controls );
+        String ldif =
+            "dn: c=europ,ou=Countries,ou=system\n" +
+                "objectClass: top\n" +
+                "objectClass: referral\n" +
+                "objectClass: extensibleObject\n" +
+                "c: europ\n" +
+                "ref: ldap://localhost:" + getLdapServer().getPort() + "/c=france,ou=system\n\n" +
+    
+                "dn: c=america,ou=Countries,ou=system\n" +
+                "objectClass: top\n" +
+                "objectClass: referral\n" +
+                "objectClass: extensibleObject\n" +
+                "c: america\n" +
+                "ref: ldap://localhost:" + getLdapServer().getPort() + "/c=usa,ou=system\n\n";
+    
+        LdifReader reader = new LdifReader( new StringReader( ldif ) );
+    
+        while ( reader.hasNext() )
+        {
+            LdifEntry entry = reader.next();
+            getLdapServer().getDirectoryService().getAdminSession().add(
+                new DefaultEntry( getLdapServer().getDirectoryService().getSchemaManager(), entry.getEntry() ) );
+        }
     }
-    catch ( ReferralException e )
+    
+    
+    @Test
+    public void testSearchBaseIsReferral() throws Exception
     {
-        assertEquals( "ldap://fermi:10389/cn=alex%20karasulu,ou=users,ou=system??base", e.getReferralInfo() );
-        assertTrue( e.skipReferral() );
-        assertEquals( "ldap://hertz:10389/cn=alex%20karasulu,ou=users,dc=example,dc=com??base", e.getReferralInfo() );
-        assertTrue( e.skipReferral() );
-        assertEquals( "ldap://maxwell:10389/cn=alex%20karasulu,ou=users,ou=system??base", e.getReferralInfo() );
-        assertFalse( e.skipReferral() );
-    }
-}
-
-
-@Test
-public void testSearchBaseAncestorIsReferral() throws Exception
-{
-    DirContext ctx = getWiredContextThrowOnRefferal( getLdapServer() );
-    SearchControls controls = new SearchControls();
-    controls.setSearchScope( SearchControls.OBJECT_SCOPE );
+        DirContext ctx = getWiredContextThrowOnRefferal( getLdapServer() );
+        SearchControls controls = new SearchControls();
+        controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
 
-    try
-    {
-        ctx.search( "cn=alex karasulu,ou=apache,ou=RemoteUsers,ou=system", "(objectClass=*)", controls );
+        try
+        {
+            ctx.search( "ou=RemoteUsers,ou=system", "(objectClass=*)", controls );
+            fail( "should never get here" );
+        }
+        catch ( ReferralException e )
+        {
+            assertEquals( "ldap://fermi:10389/ou=users,ou=system??sub", e.getReferralInfo() );
+            assertTrue( e.skipReferral() );
+            assertEquals( "ldap://hertz:10389/ou=users,dc=example,dc=com??sub", e.getReferralInfo() );
+            assertTrue( e.skipReferral() );
+            assertEquals( "ldap://maxwell:10389/ou=users,ou=system??sub", e.getReferralInfo() );
+            assertFalse( e.skipReferral() );
+        }
+        finally
+        {
+            ctx.close();
+        }
     }
-    catch ( ReferralException e )
+    
+    
+    @Test
+    public void testSearchBaseParentIsReferral() throws Exception
     {
-        assertEquals( "ldap://fermi:10389/cn=alex%20karasulu,ou=apache,ou=users,ou=system??base", e.getReferralInfo() );
-        assertTrue( e.skipReferral() );
-        assertEquals( "ldap://hertz:10389/cn=alex%20karasulu,ou=apache,ou=users,dc=example,dc=com??base", e
-            .getReferralInfo() );
-        assertTrue( e.skipReferral() );
-        assertEquals( "ldap://maxwell:10389/cn=alex%20karasulu,ou=apache,ou=users,ou=system??base", e
-            .getReferralInfo() );
-        assertFalse( e.skipReferral() );
+        DirContext ctx = getWiredContextThrowOnRefferal( getLdapServer() );
+        SearchControls controls = new SearchControls();
+        controls.setSearchScope( SearchControls.OBJECT_SCOPE );
+    
+        try
+        {
+            ctx.search( "cn=alex karasulu,ou=RemoteUsers,ou=system", "(objectClass=*)", controls );
+        }
+        catch ( ReferralException e )
+        {
+            assertEquals( "ldap://fermi:10389/cn=alex%20karasulu,ou=users,ou=system??base", e.getReferralInfo() );
+            assertTrue( e.skipReferral() );
+            assertEquals( "ldap://hertz:10389/cn=alex%20karasulu,ou=users,dc=example,dc=com??base", e.getReferralInfo() );
+            assertTrue( e.skipReferral() );
+            assertEquals( "ldap://maxwell:10389/cn=alex%20karasulu,ou=users,ou=system??base", e.getReferralInfo() );
+            assertFalse( e.skipReferral() );
+        }
+        finally
+        {
+            ctx.close();
+        }
     }
-}
-
-
-@Test
-public void testSearchContinuations() throws Exception
-{
-    DirContext ctx = getWiredContext( getLdapServer() );
-
-    SearchControls controls = new SearchControls();
-    controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
-    NamingEnumeration<SearchResult> list = ctx.search( "ou=system", "(objectClass=*)", controls );
-    Map<String, SearchResult> results = new HashMap<String, SearchResult>();
-    while ( list.hasMore() )
+    
+    
+    @Test
+    public void testSearchBaseAncestorIsReferral() throws Exception
     {
-        SearchResult result = list.next();
-        results.put( result.getName(), result );
+        DirContext ctx = getWiredContextThrowOnRefferal( getLdapServer() );
+        SearchControls controls = new SearchControls();
+        controls.setSearchScope( SearchControls.OBJECT_SCOPE );
+    
+        try
+        {
+            ctx.search( "cn=alex karasulu,ou=apache,ou=RemoteUsers,ou=system", "(objectClass=*)", controls );
+        }
+        catch ( ReferralException e )
+        {
+            assertEquals( "ldap://fermi:10389/cn=alex%20karasulu,ou=apache,ou=users,ou=system??base", e.getReferralInfo() );
+            assertTrue( e.skipReferral() );
+            assertEquals( "ldap://hertz:10389/cn=alex%20karasulu,ou=apache,ou=users,dc=example,dc=com??base", e
+                .getReferralInfo() );
+            assertTrue( e.skipReferral() );
+            assertEquals( "ldap://maxwell:10389/cn=alex%20karasulu,ou=apache,ou=users,ou=system??base", e
+                .getReferralInfo() );
+            assertFalse( e.skipReferral() );
+        }
+        finally
+        {
+            ctx.close();
+        }
     }
-
-    assertNotNull( results.get( "ou=users" ) );
-
-    // -------------------------------------------------------------------
-    // Now we will throw exceptions when searching for referrals 
-    // -------------------------------------------------------------------
-
-    ctx.addToEnvironment( Context.REFERRAL, "throw" );
-    list = ctx.search( "ou=system", "(objectClass=*)", controls );
-    results = new HashMap<String, SearchResult>();
-
-    try
+    
+    
+    @Test
+    public void testSearchContinuations() throws Exception
     {
+        DirContext ctx = getWiredContext( getLdapServer() );
+    
+        SearchControls controls = new SearchControls();
+        controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
+        NamingEnumeration<SearchResult> list = ctx.search( "ou=system", "(objectClass=*)", controls );
+        Map<String, SearchResult> results = new HashMap<String, SearchResult>();
         while ( list.hasMore() )
         {
             SearchResult result = list.next();
             results.put( result.getName(), result );
         }
-    }
-    catch ( ReferralException e )
-    {
-        // As we use the uuidIndex the order of search continuations returned by
-        // the server is not deterministic. So we collect all referrals first into
-        // an hashset and check afterwards if the expected URLs are included.
-        Set<Object> s = new HashSet<Object>();
-        s.add( e.getReferralInfo() );
-        while ( e.skipReferral() )
+    
+        assertNotNull( results.get( "ou=users" ) );
+    
+        // -------------------------------------------------------------------
+        // Now we will throw exceptions when searching for referrals 
+        // -------------------------------------------------------------------
+    
+        ctx.addToEnvironment( Context.REFERRAL, "throw" );
+        list = ctx.search( "ou=system", "(objectClass=*)", controls );
+        results = new HashMap<String, SearchResult>();
+    
+        try
         {
-            try
+            while ( list.hasMore() )
             {
-                Context ctx2 = e.getReferralContext();
-                ctx2.list( "" );
+                SearchResult result = list.next();
+                results.put( result.getName(), result );
             }
-            catch ( NamingException ne )
+        }
+        catch ( ReferralException e )
+        {
+            // As we use the uuidIndex the order of search continuations returned by
+            // the server is not deterministic. So we collect all referrals first into
+            // an hashset and check afterwards if the expected URLs are included.
+            Set<Object> s = new HashSet<Object>();
+            s.add( e.getReferralInfo() );
+            
+            while ( e.skipReferral() )
             {
-                if ( ne instanceof ReferralException )
+                try
                 {
-                    e = ( ReferralException ) ne;
-                    s.add( e.getReferralInfo() );
+                    Context ctx2 = e.getReferralContext();
+                    ctx2.list( "" );
                 }
-                else
+                catch ( NamingException ne )
                 {
-                    break;
+                    if ( ne instanceof ReferralException )
+                    {
+                        e = ( ReferralException ) ne;
+                        s.add( e.getReferralInfo() );
+                    }
+                    else
+                    {
+                        break;
+                    }
                 }
             }
+    
+            assertEquals( 5, s.size() );
+            assertTrue( s.contains( "ldap://fermi:10389/ou=users,ou=system??sub" ) );
+            assertTrue( s.contains( "ldap://hertz:10389/ou=users,dc=example,dc=com??sub" ) );
+            assertTrue( s.contains( "ldap://maxwell:10389/ou=users,ou=system??sub" ) );
         }
-
-        assertEquals( 5, s.size() );
-        assertTrue( s.contains( "ldap://fermi:10389/ou=users,ou=system??sub" ) );
-        assertTrue( s.contains( "ldap://hertz:10389/ou=users,dc=example,dc=com??sub" ) );
-        assertTrue( s.contains( "ldap://maxwell:10389/ou=users,ou=system??sub" ) );
-    }
-
-    assertNull( results.get( "ou=remoteusers" ) );
-
-    // try again but this time with single level scope
-
-    controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
-    list = ctx.search( "ou=system", "(objectClass=*)", controls );
-    results = new HashMap<String, SearchResult>();
-
-    try
-    {
-        while ( list.hasMore() )
+    
+        assertNull( results.get( "ou=remoteusers" ) );
+        list.close();
+    
+        // try again but this time with single level scope
+    
+        controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
+        list = ctx.search( "ou=system", "(objectClass=*)", controls );
+        results = new HashMap<String, SearchResult>();
+    
+        try
         {
-            SearchResult result = list.next();
-            results.put( result.getName(), result );
+            while ( list.hasMore() )
+            {
+                SearchResult result = list.next();
+                results.put( result.getName(), result );
+            }
+        }
+        catch ( ReferralException e )
+        {
+            assertEquals( "ldap://fermi:10389/ou=users,ou=system??base", e.getReferralInfo() );
+            assertTrue( e.skipReferral() );
+            assertEquals( "ldap://hertz:10389/ou=users,dc=example,dc=com??base", e.getReferralInfo() );
+            assertTrue( e.skipReferral() );
+            assertEquals( "ldap://maxwell:10389/ou=users,ou=system??base", e.getReferralInfo() );
+        }
+        
+        list.close();
+        ctx.close();
+
+        assertNull( results.get( "ou=remoteusers" ) );
+    }
+    
+    
+    /**
+     * Test of an search operation with a referral
+     *
+     * search for "cn=alex karasulu" on "c=america, ou=system"
+     * we should get a referral URL thrown, which point to
+     * "c=usa, ou=system", and ask for a subtree search
+     */
+    @Test
+    public void testSearchWithReferralThrow() throws Exception
+    {
+        DirContext ctx = getWiredContextThrowOnRefferal( getLdapServer() );
+    
+        try
+        {
+            SearchControls controls = new SearchControls();
+            controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
+            ctx.search( "c=america,ou=Countries,ou=system", "(cn=alex karasulu)", controls );
+            fail( "Should fail here throwing a ReferralException" );
+        }
+        catch ( ReferralException re )
+        {
+            String referral = ( String ) re.getReferralInfo();
+            assertEquals( "ldap://localhost:" + getLdapServer().getPort() + "/c=usa,ou=system??sub", referral );
+        }
+        finally
+        {
+            ctx.close();
         }
     }
-    catch ( ReferralException e )
-    {
-        assertEquals( "ldap://fermi:10389/ou=users,ou=system??base", e.getReferralInfo() );
-        assertTrue( e.skipReferral() );
-        assertEquals( "ldap://hertz:10389/ou=users,dc=example,dc=com??base", e.getReferralInfo() );
-        assertTrue( e.skipReferral() );
-        assertEquals( "ldap://maxwell:10389/ou=users,ou=system??base", e.getReferralInfo() );
-    }
-
-    assertNull( results.get( "ou=remoteusers" ) );
-}
-
-
-/**
- * Test of an search operation with a referral
- *
- * search for "cn=alex karasulu" on "c=america, ou=system"
- * we should get a referral URL thrown, which point to
- * "c=usa, ou=system", and ask for a subtree search
- */
-@Test
-public void testSearchWithReferralThrow() throws Exception
-{
-    DirContext ctx = getWiredContextThrowOnRefferal( getLdapServer() );
-
-    try
+    
+    
+    /**
+     * Test of an search operation with a referral
+     *
+     * search for "cn=alex karasulu" on "c=america, ou=system"
+     * we should get a referral URL thrown, which point to
+     * "c=usa, ou=system", and ask for a subtree search
+     */
+    @Test
+    public void testSearchBaseWithReferralThrow() throws Exception
     {
+        DirContext ctx = getWiredContextThrowOnRefferal( getLdapServer() );
+    
         SearchControls controls = new SearchControls();
-        controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
-        ctx.search( "c=america,ou=Countries,ou=system", "(cn=alex karasulu)", controls );
-        fail( "Should fail here throwing a ReferralException" );
-    }
-    catch ( ReferralException re )
-    {
-        String referral = ( String ) re.getReferralInfo();
-        assertEquals( "ldap://localhost:" + getLdapServer().getPort() + "/c=usa,ou=system??sub", referral );
-    }
-}
-
-
-/**
- * Test of an search operation with a referral
- *
- * search for "cn=alex karasulu" on "c=america, ou=system"
- * we should get a referral URL thrown, which point to
- * "c=usa, ou=system", and ask for a subtree search
- */
-@Test
-public void testSearchBaseWithReferralThrow() throws Exception
-{
-    DirContext ctx = getWiredContextThrowOnRefferal( getLdapServer() );
-
-    SearchControls controls = new SearchControls();
-    controls.setSearchScope( SearchControls.OBJECT_SCOPE );
-
-    try
-    {
-        ctx.search( "c=america,ou=Countries,ou=system", "(cn=alex karasulu)", controls );
-        fail( "Should fail here throwing a ReferralException" );
-    }
-    catch ( ReferralException re )
-    {
-        String referral = ( String ) re.getReferralInfo();
-        assertEquals( "ldap://localhost:" + getLdapServer().getPort() + "/c=usa,ou=system??base", referral );
-    }
-}
-
-
-/**
- * Test of an search operation with a referral after the entry
- * has been renamed.
- *
- * search for "cn=alex karasulu" on "c=usa, ou=system"
- * we should get a referral URL thrown, which point to
- * "c=usa, ou=system", and ask for a subtree search
- */
-@Test
-public void testSearchBaseWithReferralThrowAfterRename() throws Exception
-{
-    DirContext ctx = getWiredContextThrowOnRefferal( getLdapServer() );
-
-    SearchControls controls = new SearchControls();
-    controls.setSearchScope( SearchControls.OBJECT_SCOPE );
-
-    try
-    {
-        ctx.search( "c=america,ou=Countries,ou=system", "(cn=alex karasulu)", controls );
-        fail( "Should fail here throwing a ReferralException" );
-    }
-    catch ( ReferralException re )
-    {
-        String referral = ( String ) re.getReferralInfo();
-        assertEquals( "ldap://localhost:" + getLdapServer().getPort() + "/c=usa,ou=system??base", referral );
-    }
-
-    ( ( LdapContext ) ctx ).setRequestControls( new javax.naming.ldap.Control[]
-        { new ManageReferralControl() } );
-
-    // Now let's move the entry
-    ctx.rename( "c=america,ou=Countries,ou=system", "c=USA,ou=Countries,ou=system" );
-
-    controls.setSearchScope( SearchControls.OBJECT_SCOPE );
-
-    ( ( LdapContext ) ctx ).setRequestControls( new javax.naming.ldap.Control[]
-        {} );
-
-    try
-    {
-        ctx.search( "c=usa,ou=Countries,ou=system", "(cn=alex karasulu)", controls );
-        fail( "Should fail here throwing a ReferralException" );
+        controls.setSearchScope( SearchControls.OBJECT_SCOPE );
+    
+        try
+        {
+            ctx.search( "c=america,ou=Countries,ou=system", "(cn=alex karasulu)", controls );
+            fail( "Should fail here throwing a ReferralException" );
+        }
+        catch ( ReferralException re )
+        {
+            String referral = ( String ) re.getReferralInfo();
+            assertEquals( "ldap://localhost:" + getLdapServer().getPort() + "/c=usa,ou=system??base", referral );
+        }
+        finally
+        {
+            ctx.close();
+        }
     }
-    catch ( ReferralException re )
+    
+    
+    /**
+     * Test of an search operation with a referral after the entry
+     * has been renamed.
+     *
+     * search for "cn=alex karasulu" on "c=usa, ou=system"
+     * we should get a referral URL thrown, which point to
+     * "c=usa, ou=system", and ask for a subtree search
+     */
+    @Test
+    public void testSearchBaseWithReferralThrowAfterRename() throws Exception
     {
-        String referral = ( String ) re.getReferralInfo();
-        assertEquals( "ldap://localhost:" + getLdapServer().getPort() + "/c=usa,ou=system??base", referral );
+        DirContext ctx = getWiredContextThrowOnRefferal( getLdapServer() );
+    
+        SearchControls controls = new SearchControls();
+        controls.setSearchScope( SearchControls.OBJECT_SCOPE );
+    
+        try
+        {
+            ctx.search( "c=america,ou=Countries,ou=system", "(cn=alex karasulu)", controls );
+            fail( "Should fail here throwing a ReferralException" );
+        }
+        catch ( ReferralException re )
+        {
+            String referral = ( String ) re.getReferralInfo();
+            assertEquals( "ldap://localhost:" + getLdapServer().getPort() + "/c=usa,ou=system??base", referral );
+        }
+    
+        ( ( LdapContext ) ctx ).setRequestControls( new javax.naming.ldap.Control[]
+            { new ManageReferralControl() } );
+    
+        // Now let's move the entry
+        ctx.rename( "c=america,ou=Countries,ou=system", "c=USA,ou=Countries,ou=system" );
+    
+        controls.setSearchScope( SearchControls.OBJECT_SCOPE );
+    
+        ( ( LdapContext ) ctx ).setRequestControls( new javax.naming.ldap.Control[]
+            {} );
+    
+        try
+        {
+            ctx.search( "c=usa,ou=Countries,ou=system", "(cn=alex karasulu)", controls );
+            fail( "Should fail here throwing a ReferralException" );
+        }
+        catch ( ReferralException re )
+        {
+            String referral = ( String ) re.getReferralInfo();
+            assertEquals( "ldap://localhost:" + getLdapServer().getPort() + "/c=usa,ou=system??base", referral );
+        }
+        finally
+        {
+            ctx.close();
+        }
     }
-}
 }
\ No newline at end of file

Modified: directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchIT.java?rev=1332268&r1=1332267&r2=1332268&view=diff
==============================================================================
--- directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchIT.java (original)
+++ directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchIT.java Mon Apr 30 15:59:22 2012
@@ -835,7 +835,9 @@ public class SearchIT extends AbstractLd
         {
             SearchResult sr = enm.next();
             assertNotNull( sr );
-            assertEquals( "Name in namespace", nameInNamespace, sr.getNameInNamespace() );
+            Dn expectedDn = new Dn( nameInNamespace ).getParent().add( mixedRdn );
+            
+            assertEquals( "Name in namespace", expectedDn, sr.getNameInNamespace() );
         }
         else
         {

Modified: directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchPerfIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchPerfIT.java?rev=1332268&r1=1332267&r2=1332268&view=diff
==============================================================================
--- directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchPerfIT.java (original)
+++ directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchPerfIT.java Mon Apr 30 15:59:22 2012
@@ -6,16 +6,16 @@
  *  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. 
- *  
+ *  under the License.
+ * 
  */
 package org.apache.directory.server.operations.search;
 
@@ -23,6 +23,7 @@ package org.apache.directory.server.oper
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
+import org.apache.directory.ldap.client.api.EntryCursorImpl;
 import org.apache.directory.ldap.client.api.LdapConnection;
 import org.apache.directory.ldap.client.api.LdapNetworkConnection;
 import org.apache.directory.server.annotations.CreateLdapServer;
@@ -31,7 +32,11 @@ import org.apache.directory.server.core.
 import org.apache.directory.server.core.integ.FrameworkRunner;
 import org.apache.directory.shared.ldap.model.cursor.EntryCursor;
 import org.apache.directory.shared.ldap.model.exception.LdapException;
+import org.apache.directory.shared.ldap.model.message.AliasDerefMode;
+import org.apache.directory.shared.ldap.model.message.SearchRequest;
+import org.apache.directory.shared.ldap.model.message.SearchRequestImpl;
 import org.apache.directory.shared.ldap.model.message.SearchScope;
+import org.apache.directory.shared.ldap.model.name.Dn;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -52,10 +57,8 @@ public class SearchPerfIT extends Abstra
      * test a search request perf.
      */
     @Test
-    public void testSearchRequestPerf() throws Exception
+    public void testSearchRequestObjectScopePerf() throws Exception
     {
-        //getLdapServer().getDirectoryService().getInterceptorChain().addFirst( new TimerInterceptor( "Start" ) );
-        //getLdapServer().getDirectoryService().getInterceptorChain().addLast( new TimerInterceptor( "End" ) );
         LdapConnection connection = new LdapNetworkConnection( "localhost", getLdapServer().getPort() );
 
         try
@@ -90,27 +93,251 @@ public class SearchPerfIT extends Abstra
                 cursor.close();
             }
 
+            Dn dn = new Dn( getService().getSchemaManager(), "uid=admin,ou=system" );
+
+            SearchRequest searchRequest = new SearchRequestImpl();
+
+            searchRequest.setBase( dn );
+            searchRequest.setFilter( "(ObjectClass=*)" );
+            searchRequest.setScope( SearchScope.OBJECT );
+            searchRequest.addAttributes( "*" );
+            searchRequest.setDerefAliases( AliasDerefMode.DEREF_ALWAYS );
+
             long t0 = System.currentTimeMillis();
+            long t00 = 0L;
+            long tt0 = System.currentTimeMillis();
             int nbIterations = 200000;
 
             for ( int j = 0; j < nbIterations; j++ )
             {
                 if ( j % 10000 == 0 )
                 {
-                    System.out.println( j );
+                    long tt1 = System.currentTimeMillis();
+                    
+                    System.out.println( j + ", " + ( tt1 - tt0 ) );
+                    tt0 = tt1;
+                }
+                
+                if ( j == 50000 )
+                {
+                    t00 = System.currentTimeMillis();
                 }
 
-                cursor = connection.search( "uid=admin,ou=system", "(ObjectClass=*)", SearchScope.OBJECT, "*" );
+                cursor = new EntryCursorImpl( connection.search( searchRequest ) );
+
+                while ( cursor.next() )
+                {
+                    cursor.get();
+                }
+                
+                cursor.close();
+            }
+
+            long t1 = System.currentTimeMillis();
+
+            Long deltaWarmed = ( t1 - t00 );
+            System.out.println( "Delta : " + deltaWarmed + "( " + ( ( ( nbIterations - 50000 ) * 1000 ) / deltaWarmed )
+                + " per s ) /" + ( t1 - t0 ) );
+        }
+        catch ( LdapException e )
+        {
+            e.printStackTrace();
+            fail( "Should not have caught exception." );
+        }
+        finally
+        {
+            connection.unBind();
+            connection.close();
+        }
+    }
+
+
+    /**
+     * test a search request perf.
+     */
+    @Test
+    public void testSearchRequestOneLevelScopePerf() throws Exception
+    {
+        LdapConnection connection = new LdapNetworkConnection( "localhost", getLdapServer().getPort() );
+
+        try
+        {
+            // Use the client API as JNDI cannot be used to do a search without
+            // first binding. (hmmm, even client API won't allow searching without binding)
+            connection.bind( "uid=admin,ou=system", "secret" );
+
+            // Searches for all the entries in ou=system
+            EntryCursor cursor = connection.search( "ou=system", "(ObjectClass=*)",
+                SearchScope.ONELEVEL, "*" );
+
+            int i = 0;
+
+            while ( cursor.next() )
+            {
+                cursor.get();
+                ++i;
+            }
+
+            cursor.close();
+            assertEquals( 5, i );
+
+            for ( int j = 0; j < 10000; j++ )
+            {
+                cursor = connection.search( "ou=system", "(ObjectClass=*)", SearchScope.ONELEVEL, "*" );
+
+                while ( cursor.next() )
+                {
+                    cursor.get();
+                }
+
+                cursor.close();
+            }
+
+            Dn dn = new Dn( getService().getSchemaManager(), "uid=admin,ou=system" );
+
+            SearchRequest searchRequest = new SearchRequestImpl();
+
+            searchRequest.setBase( dn );
+            searchRequest.setFilter( "(ObjectClass=*)" );
+            searchRequest.setScope( SearchScope.ONELEVEL );
+            searchRequest.addAttributes( "*" );
+            searchRequest.setDerefAliases( AliasDerefMode.DEREF_ALWAYS );
+
+            long t0 = System.currentTimeMillis();
+            long t00 = 0L;
+            long tt0 = System.currentTimeMillis();
+            int nbIterations = 200000;
+
+            for ( int j = 0; j < nbIterations; j++ )
+            {
+                if ( j % 10000 == 0 )
+                {
+                    long tt1 = System.currentTimeMillis();
+                    
+                    System.out.println( j + ", " + ( tt1 - tt0 ) );
+                    tt0 = tt1;
+                }
+                
+                if ( j == 50000 )
+                {
+                    t00 = System.currentTimeMillis();
+                }
+
+                cursor = new EntryCursorImpl( connection.search( searchRequest ) );
+
+                while ( cursor.next() )
+                {
+                    cursor.get();
+                }
+                
+                cursor.close();
+            }
+
+            long t1 = System.currentTimeMillis();
+
+            Long deltaWarmed = ( t1 - t00 );
+            System.out.println( "Delta : " + deltaWarmed + "( " + ( ( ( nbIterations - 50000 ) * 1000 ) / deltaWarmed )
+                + " per s ) /" + ( t1 - t0 ) );
+        }
+        catch ( LdapException e )
+        {
+            e.printStackTrace();
+            fail( "Should not have caught exception." );
+        }
+        finally
+        {
+            connection.unBind();
+            connection.close();
+        }
+    }
+
+
+    /**
+     * test a search request perf.
+     */
+    @Test
+    public void testSearchRequestSubtreeLevelScopePerf() throws Exception
+    {
+        LdapConnection connection = new LdapNetworkConnection( "localhost", getLdapServer().getPort() );
+        connection.setTimeOut( 0 );
+
+        try
+        {
+            // Use the client API as JNDI cannot be used to do a search without
+            // first binding. (hmmm, even client API won't allow searching without binding)
+            connection.bind( "uid=admin,ou=system", "secret" );
+
+            // Searches for all the entries in ou=system
+            EntryCursor cursor = connection.search( "ou=system", "(ObjectClass=*)",
+                SearchScope.SUBTREE, "*" );
+
+            int i = 0;
+
+            while ( cursor.next() )
+            {
+                cursor.get();
+                ++i;
+            }
+
+            cursor.close();
+            assertEquals( 10, i );
+
+            for ( int j = 0; j < 10000; j++ )
+            {
+                cursor = connection.search( "ou=system", "(ObjectClass=*)", SearchScope.SUBTREE, "*" );
+
+                while ( cursor.next() )
+                {
+                    cursor.get();
+                }
+
+                cursor.close();
+            }
+
+            Dn dn = new Dn( getService().getSchemaManager(), "uid=admin,ou=system" );
+
+            SearchRequest searchRequest = new SearchRequestImpl();
+
+            searchRequest.setBase( dn );
+            searchRequest.setFilter( "(ObjectClass=*)" );
+            searchRequest.setScope( SearchScope.SUBTREE );
+            searchRequest.addAttributes( "*" );
+            searchRequest.setDerefAliases( AliasDerefMode.DEREF_ALWAYS );
+
+            long t0 = System.currentTimeMillis();
+            long t00 = 0L;
+            long tt0 = System.currentTimeMillis();
+            int nbIterations = 200000;
+
+            for ( int j = 0; j < nbIterations; j++ )
+            {
+                if ( j % 10000 == 0 )
+                {
+                    long tt1 = System.currentTimeMillis();
+                    
+                    System.out.println( j + ", " + ( tt1 - tt0 ) );
+                    tt0 = tt1;
+                }
+                
+                if ( j == 50000 )
+                {
+                    t00 = System.currentTimeMillis();
+                }
+
+                cursor = new EntryCursorImpl( connection.search( searchRequest ) );
+
                 while ( cursor.next() )
                 {
+                    cursor.get();
                 }
+                
                 cursor.close();
             }
 
             long t1 = System.currentTimeMillis();
 
-            Long deltaWarmed = ( t1 - t0 );
-            System.out.println( "Delta : " + deltaWarmed + "( " + ( ( nbIterations * 1000 ) / deltaWarmed )
+            Long deltaWarmed = ( t1 - t00 );
+            System.out.println( "Delta : " + deltaWarmed + "( " + ( ( ( nbIterations - 50000 ) * 1000 ) / deltaWarmed )
                 + " per s ) /" + ( t1 - t0 ) );
         }
         catch ( LdapException e )

Propchange: directory/apacheds/trunk/server-jndi/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/server-jndi:r1324715-1332211

Propchange: directory/apacheds/trunk/server-replication/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/server-replication:r1324715-1332211

Propchange: directory/apacheds/trunk/server-tools/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/server-tools:r1324715-1332211

Propchange: directory/apacheds/trunk/service/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/service:r1324715-1332211

Propchange: directory/apacheds/trunk/service-builder/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/service-builder:r1324715-1332211

Propchange: directory/apacheds/trunk/test-framework/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/test-framework:r1324715-1332211

Propchange: directory/apacheds/trunk/xdbm-partition/
------------------------------------------------------------------------------
  Merged /directory/apacheds/branches/index-work/xdbm-partition:r1324715-1332211

Modified: directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/AbstractBTreePartition.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/AbstractBTreePartition.java?rev=1332268&r1=1332267&r2=1332268&view=diff
==============================================================================
--- directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/AbstractBTreePartition.java (original)
+++ directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/AbstractBTreePartition.java Mon Apr 30 15:59:22 2012
@@ -23,24 +23,20 @@ package org.apache.directory.server.core
 import java.io.IOException;
 import java.io.OutputStream;
 import java.net.URI;
-import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import javax.naming.directory.SearchControls;
-
 import org.apache.directory.server.constants.ApacheSchemaConstants;
 import org.apache.directory.server.core.api.entry.ClonedServerEntry;
 import org.apache.directory.server.core.api.filtering.BaseEntryFilteringCursor;
 import org.apache.directory.server.core.api.filtering.EntryFilteringCursor;
 import org.apache.directory.server.core.api.interceptor.context.AddOperationContext;
 import org.apache.directory.server.core.api.interceptor.context.DeleteOperationContext;
-import org.apache.directory.server.core.api.interceptor.context.GetRootDseOperationContext;
 import org.apache.directory.server.core.api.interceptor.context.HasEntryOperationContext;
 import org.apache.directory.server.core.api.interceptor.context.ListOperationContext;
 import org.apache.directory.server.core.api.interceptor.context.LookupOperationContext;
@@ -60,14 +56,11 @@ import org.apache.directory.server.xdbm.
 import org.apache.directory.server.xdbm.IndexNotFoundException;
 import org.apache.directory.server.xdbm.MasterTable;
 import org.apache.directory.server.xdbm.ParentIdAndRdn;
-import org.apache.directory.server.xdbm.ReverseIndexEntry;
 import org.apache.directory.server.xdbm.Store;
 import org.apache.directory.server.xdbm.search.Optimizer;
 import org.apache.directory.server.xdbm.search.SearchEngine;
 import org.apache.directory.server.xdbm.search.impl.ChildrenCursor;
-import org.apache.directory.server.xdbm.search.impl.OneLevelScopeCursor;
 import org.apache.directory.shared.ldap.model.constants.SchemaConstants;
-import org.apache.directory.shared.ldap.model.cursor.Cursor;
 import org.apache.directory.shared.ldap.model.entry.Attribute;
 import org.apache.directory.shared.ldap.model.entry.Entry;
 import org.apache.directory.shared.ldap.model.entry.Modification;
@@ -84,6 +77,7 @@ import org.apache.directory.shared.ldap.
 import org.apache.directory.shared.ldap.model.filter.ExprNode;
 import org.apache.directory.shared.ldap.model.message.AliasDerefMode;
 import org.apache.directory.shared.ldap.model.message.ResultCodeEnum;
+import org.apache.directory.shared.ldap.model.message.SearchScope;
 import org.apache.directory.shared.ldap.model.name.Ava;
 import org.apache.directory.shared.ldap.model.name.Dn;
 import org.apache.directory.shared.ldap.model.name.Rdn;
@@ -150,9 +144,6 @@ public abstract class AbstractBTreeParti
     /** a system index on objectClass attribute*/
     protected Index<String, Entry, ID> objectClassIdx;
 
-    /** a system index on the entries of descendants of root Dn */
-    protected Index<ID, Entry, ID> subLevelIdx;
-
     /** the attribute presence index */
     protected Index<String, Entry, ID> presenceIdx;
 
@@ -180,8 +171,8 @@ public abstract class AbstractBTreeParti
     private static final boolean NO_REVERSE = Boolean.FALSE;
     private static final boolean WITH_REVERSE = Boolean.TRUE;
     
-    private static final boolean ADD_CHILD = true;
-    private static final boolean REMOVE_CHILD = false;
+    protected static final boolean ADD_CHILD = true;
+    protected static final boolean REMOVE_CHILD = false;
 
     // ------------------------------------------------------------------------
     // C O N S T R U C T O R S
@@ -296,12 +287,6 @@ public abstract class AbstractBTreeParti
             addIndex( index );
         }
 
-        if ( getSubLevelIndex() == null )
-        {
-            Index<ID, Entry, ID> index = createSystemIndex( ApacheSchemaConstants.APACHE_SUB_LEVEL_AT_OID, partitionPath, WITH_REVERSE );
-            addIndex( index );
-        }
-
         if ( getRdnIndex() == null )
         {
             Index<ParentIdAndRdn<ID>, Entry, ID> index = createSystemIndex( ApacheSchemaConstants.APACHE_RDN_AT_OID, partitionPath, WITH_REVERSE );
@@ -355,7 +340,6 @@ public abstract class AbstractBTreeParti
         // set index shortcuts
         rdnIdx = ( Index<ParentIdAndRdn<ID>, Entry, ID> ) systemIndices.get( ApacheSchemaConstants.APACHE_RDN_AT_OID );
         presenceIdx = ( Index<String, Entry, ID> ) systemIndices.get( ApacheSchemaConstants.APACHE_PRESENCE_AT_OID );
-        subLevelIdx = ( Index<ID, Entry, ID> ) systemIndices.get( ApacheSchemaConstants.APACHE_SUB_LEVEL_AT_OID );
         aliasIdx = ( Index<String, Entry, ID> ) systemIndices.get( ApacheSchemaConstants.APACHE_ALIAS_AT_OID );
         oneAliasIdx = ( Index<ID, Entry, ID> ) systemIndices.get( ApacheSchemaConstants.APACHE_ONE_ALIAS_AT_OID );
         subAliasIdx = ( Index<ID, Entry, ID> ) systemIndices.get( ApacheSchemaConstants.APACHE_SUB_ALIAS_AT_OID );
@@ -550,13 +534,13 @@ public abstract class AbstractBTreeParti
     }
     
     
-    private void dumpRdnIdx( ID id, String tabs ) throws Exception
+    public void dumpRdnIdx( ID id, String tabs ) throws Exception
     {
         // Start with the root
         IndexCursor<ParentIdAndRdn<ID>,Entry,ID> cursor = rdnIdx.forwardCursor();
         
         IndexEntry<ParentIdAndRdn<ID>, ID> startingPos = new ForwardIndexEntry<ParentIdAndRdn<ID>, ID>();
-        startingPos.setValue( new ParentIdAndRdn( id, (Rdn[]) null ) );
+        startingPos.setKey( new ParentIdAndRdn( id, (Rdn[]) null ) );
         cursor.before( startingPos );
         
         while ( cursor.next() )
@@ -575,7 +559,7 @@ public abstract class AbstractBTreeParti
         IndexCursor<ParentIdAndRdn<ID>,Entry,ID> cursor = rdnIdx.forwardCursor();
         
         IndexEntry<ParentIdAndRdn<ID>, ID> startingPos = new ForwardIndexEntry<ParentIdAndRdn<ID>, ID>();
-        startingPos.setValue( new ParentIdAndRdn( id, (Rdn[]) null ) );
+        startingPos.setKey( new ParentIdAndRdn( id, (Rdn[]) null ) );
         cursor.before( startingPos );
         int countChildren = 0;
         
@@ -586,7 +570,7 @@ public abstract class AbstractBTreeParti
             countChildren++;
             
             // And now, the children
-            int nbChildren = entry.getValue().getNbChildren();
+            int nbChildren = entry.getKey().getNbChildren();
             
             if ( nbChildren > 0 )
             {
@@ -683,18 +667,6 @@ public abstract class AbstractBTreeParti
                 addAliasIndices( id, entryDn, aliasAttr.getString() );
             }
 
-            // Update the SubLevel index
-            ID tempId = parentId;
-
-            while ( ( tempId != null ) && ( !tempId.equals( getRootId() ) ) && ( !tempId.equals( getSuffixId() ) ) )
-            {
-                subLevelIdx.add( tempId, id );
-                tempId = getParentId( tempId );
-            }
-
-            // making entry an ancestor/descendent of itself in sublevel index
-            subLevelIdx.add( id, id );
-
             // Update the EntryCsn index
             Attribute entryCsn = entry.get( ENTRY_CSN_AT );
 
@@ -794,7 +766,7 @@ public abstract class AbstractBTreeParti
     }
     
     
-    private void updateRdnIdx( ID parentId, boolean addRemove, int nbDescendant ) throws Exception
+    protected void updateRdnIdx( ID parentId, boolean addRemove, int nbDescendant ) throws Exception
     {
         boolean isFirst = true;
         
@@ -831,6 +803,8 @@ public abstract class AbstractBTreeParti
             }
 
             // Inject the modified element into the index
+            // we first need to drop it so that the key can be replaced
+            rdnIdx.drop( parentId );
             rdnIdx.add( parent, parentId );
             
             parentId = parent.getParentId();
@@ -879,7 +853,6 @@ public abstract class AbstractBTreeParti
             
             dumpRdnIdx();
 
-            subLevelIdx.drop( id );
             entryCsnIdx.drop( entry.get( ENTRY_CSN_AT ).getString(), id );
             entryUuidIdx.drop( entry.get( ENTRY_UUID_AT ).getString(), id );
 
@@ -950,7 +923,7 @@ public abstract class AbstractBTreeParti
             IndexCursor<ParentIdAndRdn<ID>,Entry, ID> cursor = rdnIdx.forwardCursor();
             
             IndexEntry<ParentIdAndRdn<ID>, ID> startingPos = new ForwardIndexEntry<ParentIdAndRdn<ID>, ID>();
-            startingPos.setValue( new ParentIdAndRdn( id, (Rdn[]) null ) );
+            startingPos.setKey( new ParentIdAndRdn( id, (Rdn[]) null ) );
             cursor.before( startingPos );
 
             dumpRdnIdx();
@@ -974,13 +947,13 @@ public abstract class AbstractBTreeParti
     {
         try
         {
-            SearchControls searchCtls = searchContext.getSearchControls();
+            SearchScope scope = searchContext.getScope();
             IndexCursor<ID, Entry, ID> underlying;
             Dn dn = searchContext.getDn();
             AliasDerefMode derefMode = searchContext.getAliasDerefMode();
             ExprNode filter = searchContext.getFilter();
 
-            underlying = searchEngine.cursor( dn, derefMode, filter, searchCtls );
+            underlying = searchEngine.cursor( dn, derefMode, filter, scope );
 
             return new BaseEntryFilteringCursor( new EntryCursorAdaptor<ID>( this, underlying ), searchContext );
         }
@@ -1011,7 +984,7 @@ public abstract class AbstractBTreeParti
             return null;
         }
 
-        Entry entry = lookup( id );
+        Entry entry = lookup( id, lookupContext.getDn() );
 
         // Remove all the attributes if the NO_ATTRIBUTE flag is set and there is no requested attribute
         if ( lookupContext.hasNoAttribute()
@@ -1124,6 +1097,36 @@ public abstract class AbstractBTreeParti
     }
 
 
+    /**
+     * Get back an entry knowing its ID
+     *
+     * @param id The Entry ID we want to get back
+     * @return The found Entry, or null if not found
+     * @throws Exception If the lookup failed for any reason (except a not found entry)
+     */
+    public Entry lookup( ID id, Dn dn ) throws LdapException
+    {
+        try
+        {
+            Entry entry = master.get( id );
+
+            if ( entry != null )
+            {
+                // We have to store the DN in this entry
+                entry.setDn( dn );
+
+                return new ClonedServerEntry( entry );
+            }
+
+            return null;
+        }
+        catch ( Exception e )
+        {
+            throw new LdapOperationErrorException( e.getMessage(), e );
+        }
+    }
+
+
     //---------------------------------------------------------------------------------------------
     // The Modify operation
     //---------------------------------------------------------------------------------------------
@@ -1526,12 +1529,6 @@ public abstract class AbstractBTreeParti
          */
         dropMovedAliasIndices( oldDn );
 
-        /*
-         * Drop the old parent child relationship and add the new one
-         * Set the new parent id for the child replacing the old parent id
-         */
-        updateSubLevelIndex( entryId, oldParentId, newParentId );
-
         // Update the Rdn index
         // First drop the old entry
         ParentIdAndRdn<ID> movedEntry = rdnIdx.reverseLookup( entryId );
@@ -1711,12 +1708,6 @@ public abstract class AbstractBTreeParti
         dropMovedAliasIndices( oldDn );
 
         /*
-         * Drop the old parent child relationship and add the new one
-         * Set the new parent id for the child replacing the old parent id
-         */
-        updateSubLevelIndex( entryId, oldParentId, newParentId );
-
-        /*
          * Update the Rdn index
          */
         // First drop the old entry
@@ -1910,9 +1901,18 @@ public abstract class AbstractBTreeParti
          * No need to calculate the new Dn.
          */
         ID parentId = getParentId( oldId );
+        
+        // Get the old parentIdAndRdn to get the nb of children and descendant
+        ParentIdAndRdn<ID> parentIdAndRdn = rdnIdx.reverseLookup( oldId );
+        
+        // Now we can drop it
         rdnIdx.drop( oldId );
-        ParentIdAndRdn<ID> key = new ParentIdAndRdn<ID>( parentId, newRdn );
-        rdnIdx.add( key, oldId );
+        
+        // Update the descendants
+        parentIdAndRdn.setParentId( parentId );
+        parentIdAndRdn.setRdns( newRdn );
+
+        rdnIdx.add( parentIdAndRdn, oldId );
 
         if ( isSyncOnWrite.get() )
         {
@@ -1944,7 +1944,7 @@ public abstract class AbstractBTreeParti
         {
             ID id = getEntryId( entryContext.getDn() );
 
-            Entry entry = lookup( id );
+            Entry entry = lookup( id, entryContext.getDn() );
 
             return entry != null;
         }
@@ -1973,69 +1973,6 @@ public abstract class AbstractBTreeParti
     }
 
 
-    /**
-     * Updates the SubLevel Index as part of a move operation.
-     *
-     * @param entryId child id to be moved
-     * @param oldParentId old parent's id
-     * @param newParentId new parent's id
-     * @throws Exception
-     */
-    private void updateSubLevelIndex( ID entryId, ID oldParentId, ID newParentId ) throws Exception
-    {
-        ID tempId = oldParentId;
-        List<ID> parentIds = new ArrayList<ID>();
-
-        // find all the parents of the oldParentId
-        while ( ( tempId != null ) && !tempId.equals( getRootId() ) && !tempId.equals( getSuffixId() ) )
-        {
-            parentIds.add( tempId );
-            tempId = getParentId( tempId );
-        }
-
-        // find all the children of the childId
-        Cursor<IndexEntry<ID, ID>> cursor = subLevelIdx.forwardCursor( entryId );
-
-        List<ID> childIds = new ArrayList<ID>();
-        childIds.add( entryId );
-
-        while ( cursor.next() )
-        {
-            childIds.add( cursor.get().getId() );
-        }
-
-        cursor.close();
-
-        // detach the childId and all its children from oldParentId and all it parents excluding the root
-        for ( ID pid : parentIds )
-        {
-            for ( ID cid : childIds )
-            {
-                subLevelIdx.drop( pid, cid );
-            }
-        }
-
-        parentIds.clear();
-        tempId = newParentId;
-
-        // find all the parents of the newParentId
-        while ( ( tempId != null ) && !tempId.equals( getRootId() ) && !tempId.equals( getSuffixId() ) )
-        {
-            parentIds.add( tempId );
-            tempId = getParentId( tempId );
-        }
-
-        // attach the childId and all its children to newParentId and all it parents excluding the root
-        for ( ID id : parentIds )
-        {
-            for ( ID cid : childIds )
-            {
-                subLevelIdx.add( id, cid );
-            }
-        }
-    }
-
-
     // ------------------------------------------------------------------------
     // Index and master table Operations
     // ------------------------------------------------------------------------
@@ -2051,8 +1988,9 @@ public abstract class AbstractBTreeParti
         ID parentId = id;
         ID rootId = getRootId();
 
-        StringBuilder upName = new StringBuilder();
-        boolean isFirst = true;
+        // Create an array of 10 rdns, just in case. We will extend it if needed
+        Rdn[] rdnArray = new Rdn[10];
+        int pos = 0;
 
         do
         {
@@ -2061,23 +1999,22 @@ public abstract class AbstractBTreeParti
 
             for ( Rdn rdn : rdns )
             {
-                if ( isFirst )
-                {
-                    isFirst = false;
-                }
-                else
+                if ( ( pos > 0 ) && (pos % 10 == 0 ) )
                 {
-                    upName.append( ',' );
+                    // extend the array
+                    Rdn[] newRdnArray = new Rdn[pos + 10];
+                    System.arraycopy( rdnArray, 0, newRdnArray, 0, pos );
+                    rdnArray = newRdnArray;
                 }
-
-                upName.append( rdn.getName() );
+                
+                rdnArray[pos++]= rdn;
             }
 
             parentId = cur.getParentId();
         }
         while ( !parentId.equals( rootId ) );
 
-        Dn dn = new Dn( schemaManager, upName.toString() );
+        Dn dn = new Dn( schemaManager, Arrays.copyOf( rdnArray, pos ) );
 
         return dn;
     }
@@ -2343,16 +2280,6 @@ public abstract class AbstractBTreeParti
      * {@inheritDoc}
      */
     @SuppressWarnings("unchecked")
-    public Index<ID, Entry, ID> getSubLevelIndex()
-    {
-        return ( Index<ID, Entry, ID> ) systemIndices.get( ApacheSchemaConstants.APACHE_SUB_LEVEL_AT_OID );
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @SuppressWarnings("unchecked")
     public Index<String, Entry, ID> getAliasIndex()
     {
         return ( Index<String, Entry, ID> ) systemIndices.get( ApacheSchemaConstants.APACHE_ALIAS_AT_OID );

Modified: directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/IndexEnumeration.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/IndexEnumeration.java?rev=1332268&r1=1332267&r2=1332268&view=diff
==============================================================================
--- directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/IndexEnumeration.java (original)
+++ directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/IndexEnumeration.java Mon Apr 30 15:59:22 2012
@@ -170,7 +170,7 @@ public class IndexEnumeration<T> impleme
             // If regex is null just transfer into prefetched from tmp record
             // but if it is not then use it to match.  Successful match shorts
             // while loop.
-            if ( null == re || re.matcher( ( String ) tmp.getValue() ).matches() )
+            if ( null == re || re.matcher( ( String ) tmp.getKey() ).matches() )
             {
                 prefetched.copy( tmp );
                 return;

Modified: directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/AbstractIndexEntry.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/AbstractIndexEntry.java?rev=1332268&r1=1332267&r2=1332268&view=diff
==============================================================================
--- directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/AbstractIndexEntry.java (original)
+++ directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/AbstractIndexEntry.java Mon Apr 30 15:59:22 2012
@@ -28,10 +28,10 @@ import org.apache.directory.shared.ldap.
  * Abstract class managing the object for index entries.
  *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @param <V> The value stored in the Tuple, associated key for the object
+ * @param <K> The key stored in the Tuple, associated key for the object
  * @param <ID> The ID of the object
  */
-public abstract class AbstractIndexEntry<V, ID> implements IndexEntry<V, ID>
+public abstract class AbstractIndexEntry<K, ID> implements IndexEntry<K, ID>
 {
     /** The referenced Entry if loaded from the store */
     private Entry entry;
@@ -51,13 +51,13 @@ public abstract class AbstractIndexEntry
     /**
      * {@inheritDoc}
      */
-    public abstract V getValue();
+    public abstract K getKey();
 
 
     /**
      * {@inheritDoc}
      */
-    public abstract void setValue( V value );
+    public abstract void setKey( K value );
 
 
     /**
@@ -108,7 +108,7 @@ public abstract class AbstractIndexEntry
     /**
      * {@inheritDoc}
      */
-    public void copy( IndexEntry<V, ID> entry )
+    public void copy( IndexEntry<K, ID> entry )
     {
         this.entry = entry.getEntry();
     }

Modified: directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/ForwardIndexEntry.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/ForwardIndexEntry.java?rev=1332268&r1=1332267&r2=1332268&view=diff
==============================================================================
--- directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/ForwardIndexEntry.java (original)
+++ directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/ForwardIndexEntry.java Mon Apr 30 15:59:22 2012
@@ -29,13 +29,13 @@ import org.apache.directory.shared.ldap.
  * indexed Entry if one has already been loaded.
  * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @param <V> The value stored in the Tuple, associated key for the object
+ * @param <V> The key stored in the Tuple, associated key for the object
  * @param <ID> The ID of the object
  */
-public class ForwardIndexEntry<V, ID> extends AbstractIndexEntry<V, ID>
+public class ForwardIndexEntry<K, ID> extends AbstractIndexEntry<K, ID>
 {
     /** The underlying Tuple */
-    private final Tuple<V, ID> tuple = new Tuple<V, ID>();
+    private final Tuple<K, ID> tuple = new Tuple<K, ID>();
 
 
     /**
@@ -55,7 +55,7 @@ public class ForwardIndexEntry<V, ID> ex
      * @param tuple the tuple for the ForwardIndexEntry
      * @param entry the resuscitated Entry if any
      */
-    public void setTuple( Tuple<V, ID> tuple, Entry entry )
+    public void setTuple( Tuple<K, ID> tuple, Entry entry )
     {
         setEntry( entry );
         this.tuple.setKey( tuple.getKey() );
@@ -75,7 +75,7 @@ public class ForwardIndexEntry<V, ID> ex
     /**
      * {@inheritDoc}
      */
-    public V getValue()
+    public K getKey()
     {
         return tuple.getKey();
     }
@@ -93,7 +93,7 @@ public class ForwardIndexEntry<V, ID> ex
     /**
      * {@inheritDoc}
      */
-    public void setValue( V value )
+    public void setKey( K value )
     {
         tuple.setKey( value );
     }
@@ -102,7 +102,7 @@ public class ForwardIndexEntry<V, ID> ex
     /**
      * {@inheritDoc}
      */
-    public Tuple<V, ID> getTuple()
+    public Tuple<K, ID> getTuple()
     {
         return tuple;
     }
@@ -122,10 +122,10 @@ public class ForwardIndexEntry<V, ID> ex
     /**
      * {@inheritDoc}
      */
-    public void copy( IndexEntry<V, ID> entry )
+    public void copy( IndexEntry<K, ID> entry )
     {
         super.copy( entry );
-        tuple.setKey( entry.getValue() );
+        tuple.setKey( entry.getKey() );
         tuple.setValue( entry.getId() );
     }
 

Modified: directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/IndexEntry.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/IndexEntry.java?rev=1332268&r1=1332267&r2=1332268&view=diff
==============================================================================
--- directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/IndexEntry.java (original)
+++ directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/IndexEntry.java Mon Apr 30 15:59:22 2012
@@ -26,29 +26,29 @@ import org.apache.directory.shared.ldap.
 
 /**
  * Interface for index entries. An index entry associate an Entry with 
- * a value (the key) and the Entry ID in the table where it's stored. The Entry
+ * a key and the Entry ID in the table where it's stored. The Entry
  * may be present in this instance once we read it from the table.
  *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @param <V> The value stored in the Tuple, associated key for the object
  * @param <ID> The ID of the object
  */
-public interface IndexEntry<V, ID>
+public interface IndexEntry<K, ID>
 {
     /**
-     * Gets the value referred to by this IndexEntry.
+     * Gets the key referred to by this IndexEntry.
      *
-     * @return the value of the Entry referred to
+     * @return the key of the Entry referred to
      */
-    V getValue();
+    K getKey();
 
 
     /**
-     * Sets the value referred to by this IndexEntry.
+     * Sets the key referred to by this IndexEntry.
      *
-     * @param value the value of the Entry referred to
+     * @param key the key of the Entry referred to
      */
-    void setValue( V value );
+    void setKey( K key );
 
 
     /**
@@ -102,5 +102,5 @@ public interface IndexEntry<V, ID>
      *
      * @param entry the entry to copy fields of
      */
-    void copy( IndexEntry<V, ID> entry );
+    void copy( IndexEntry<K, ID> entry );
 }

Modified: directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/ParentIdAndRdn.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/ParentIdAndRdn.java?rev=1332268&r1=1332267&r2=1332268&view=diff
==============================================================================
--- directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/ParentIdAndRdn.java (original)
+++ directory/apacheds/trunk/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/ParentIdAndRdn.java Mon Apr 30 15:59:22 2012
@@ -125,7 +125,7 @@ public class ParentIdAndRdn<ID extends C
      * 
      * @param rdns the new Rdn
      */
-    public void setRdns( Rdn[] rdns )
+    public void setRdns( Rdn... rdns )
     {
         this.rdns = rdns;
     }
@@ -226,6 +226,8 @@ public class ParentIdAndRdn<ID extends C
         {
             return val;
         }
+        
+        // The ID is the same, check the RDNs now
 
         val = rdns.length - that.rdns.length;
 
@@ -234,47 +236,27 @@ public class ParentIdAndRdn<ID extends C
             return val;
         }
         
-        StringBuilder sb = new StringBuilder();
-        boolean isFirst = true;
-        
-        for ( Rdn rdn : rdns )
+        if ( rdns.length == 1 )
         {
-            if ( isFirst )
-            {
-                sb.append( ',' );
-            }
-            else
-            {
-                isFirst = false;
-            }
+            // Special case : we only have one rdn.
+            val = rdns[0].getNormName().compareTo( that.rdns[0].getNormName() );
             
-            sb.append( rdn.getNormName() );
+            return val;
         }
-        
-        String thisString = sb.toString();
-        
-        isFirst = true;
-        sb = new StringBuilder();
-
-        for ( Rdn rdn : that.rdns )
+        else
         {
-            if ( isFirst )
-            {
-                sb.append( ',' );
-            }
-            else
+            for ( int i = 0; i < rdns.length; i++ )
             {
-                isFirst = false;
+                val = rdns[i].getNormName().compareTo( that.rdns[i].getNormName() );
+            
+                if ( val != 0 )
+                {
+                    return val;
+                }
             }
             
-            sb.append( rdn.getNormName() );
+            return 0;
         }
-        
-        String thatString = sb.toString();
-        
-        val = ( thisString.compareTo( thatString ) );
-        
-        return val;
     }