o Slightly fixed the testRenameEscaped() test
o Reworked the rename() operation in AbstractStore
git-svn-id: https://svn.apache.org/repos/asf/directory/apacheds/branches/apacheds-no-reverse-index@1142155 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmStoreTest.java b/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmStoreTest.java
index 3d0c8ce..89cf2a1 100644
--- a/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmStoreTest.java
+++ b/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmStoreTest.java
@@ -745,7 +745,7 @@
Long id = store.getEntryId( dn2 );
assertNotNull( id );
Entry entry2 = store.lookup( id );
- assertEquals( "ja+es", entry2.get( "sn" ).getString() );
+ assertEquals( "Ja\\+es", entry2.get( "sn" ).getString() );
}
diff --git a/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/AbstractStore.java b/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/AbstractStore.java
index 807e4e5..fa2ac59 100644
--- a/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/AbstractStore.java
+++ b/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/AbstractStore.java
@@ -1272,7 +1272,7 @@
entry = lookup( id );
}
- Dn updn = entry.getDn();
+ Dn entryDn = entry.getDn();
newRdn.apply( schemaManager );
@@ -1284,15 +1284,12 @@
* Also we make sure that the presence index shows the existence of the
* new Rdn attribute within this entry.
*/
-
for ( Ava newAtav : newRdn )
{
String newNormType = newAtav.getNormType();
Object newNormValue = newAtav.getNormValue().getValue();
- AttributeType newRdnAttrType = schemaManager.lookupAttributeTypeRegistry( newNormType );
-
- entry.add( newRdnAttrType, newAtav.getNormValue() );
+ entry.add( newAtav.getAttributeType(), newAtav.getUpValue() );
if ( hasUserIndexOn( newNormType ) )
{
@@ -1326,7 +1323,7 @@
if ( deleteOldRdn )
{
- Rdn oldRdn = updn.getRdn();
+ Rdn oldRdn = entryDn.getRdn();
for ( Ava oldAtav : oldRdn )
{
@@ -1347,9 +1344,10 @@
{
String oldNormType = oldAtav.getNormType();
String oldNormValue = oldAtav.getNormValue().getString();
- AttributeType oldRdnAttrType = schemaManager.lookupAttributeTypeRegistry( oldNormType );
- entry.remove( oldRdnAttrType, oldNormValue );
+ AttributeType oldRdnAttrType = oldAtav.getAttributeType();
+ entry.remove( oldRdnAttrType, oldAtav.getNormValue() );
+ // Remove the RDN value from the user index, if any
if ( hasUserIndexOn( oldNormType ) )
{
Index<?, E, ID> index = getUserIndex( oldNormType );
@@ -1359,7 +1357,7 @@
* If there is no value for id in this index due to our
* drop above we remove the oldRdnAttr from the presence idx
*/
- if ( null == index.reverseLookup( id ) )
+ if ( presenceIdx.forward( oldNormValue, id ) )
{
presenceIdx.drop( oldNormType, id );
}
@@ -1375,11 +1373,22 @@
* We only need to update the Rdn index.
* No need to calculate the new Dn.
*/
+ List<ID> parentIds = getParentIds( entryDn );
+ ID rootId = getRootId();
+ ID parentId = rootId;
+
+ if ( parentIds.size() > 2 )
+ {
+ parentId = parentIds.get( parentIds.size() - 1 );
+ }
- ID parentId = getParentId( id );
- rdnIdx.drop( id );
- ParentIdAndRdn<ID> key = new ParentIdAndRdn<ID>( parentId, newRdn );
- rdnIdx.add( key, id );
+ // Drop the RDN
+ ParentIdAndRdn<ID> key = new ParentIdAndRdn<ID>( parentId, entryDn.getRdn() );
+
+ rdnIdx.drop( key, id );
+
+ ParentIdAndRdn<ID> newKey = new ParentIdAndRdn<ID>( parentId, newRdn );
+ rdnIdx.add( newKey, id );
master.put( id, entry );