From 8ac57ee1cd50fcc3d02b36bea4ab1335924f1d7a Mon Sep 17 00:00:00 2001
From: Yannick Lecaillez <yannick.lecaillez@forgerock.com>
Date: Mon, 18 May 2015 13:52:40 +0000
Subject: [PATCH] OPENDJ-1864: Ordering matching rules should reuse equality indexes where possible

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java |  150 ++++++++++++--------------------------------------
 1 files changed, 36 insertions(+), 114 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java
index cbe0733..ac49c00 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java
@@ -89,7 +89,6 @@
 import org.forgerock.opendj.config.server.ConfigException;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ResultCode;
-import org.forgerock.opendj.ldap.spi.IndexingOptions;
 import org.forgerock.util.Utils;
 import org.opends.server.admin.std.meta.LocalDBIndexCfgDefn.IndexType;
 import org.opends.server.admin.std.server.LocalDBBackendCfg;
@@ -689,26 +688,7 @@
   {
     for (AttributeIndex attributeIndex : suffix.getAttrIndexMap().values())
     {
-      putInIdContainerMap(attributeIndex.getEqualityIndex());
-      putInIdContainerMap(attributeIndex.getPresenceIndex());
-      putInIdContainerMap(attributeIndex.getSubstringIndex());
-      putInIdContainerMap(attributeIndex.getOrderingIndex());
-      putInIdContainerMap(attributeIndex.getApproximateIndex());
-      Map<String, Collection<Index>> extensibleMap = attributeIndex.getExtensibleIndexes();
-      if (!extensibleMap.isEmpty())
-      {
-        putInIdContainerMap(extensibleMap.get(EXTENSIBLE_INDEXER_ID_SUBSTRING));
-        putInIdContainerMap(extensibleMap.get(EXTENSIBLE_INDEXER_ID_SHARED));
-      }
-    }
-  }
-
-  private void putInIdContainerMap(Collection<Index> indexes)
-  {
-    if (indexes != null)
-    {
-      for (Index index : indexes)
-      {
+      for(Index index : attributeIndex.getAllIndexes()) {
         putInIdContainerMap(index);
       }
     }
@@ -1492,20 +1472,20 @@
     }
 
     @Override
-    void processAttribute(Index index, Entry entry, EntryID entryID, IndexingOptions options,
-        IndexKey indexKey) throws DatabaseException, InterruptedException
+    void processAttribute(Index index, Entry entry, EntryID entryID, IndexKey indexKey)
+        throws DatabaseException, InterruptedException
     {
       if (oldEntry != null)
       {
         deleteKeySet.clear();
-        index.indexEntry(oldEntry, deleteKeySet, options);
+        index.indexEntry(oldEntry, deleteKeySet);
         for (ByteString delKey : deleteKeySet)
         {
           processKey(index, delKey.toByteArray(), entryID, indexKey, false);
         }
       }
       insertKeySet.clear();
-      index.indexEntry(entry, insertKeySet, options);
+      index.indexEntry(entry, insertKeySet);
       for (ByteString key : insertKeySet)
       {
         processKey(index, key.toByteArray(), entryID, indexKey, true);
@@ -1522,7 +1502,7 @@
     private final Map<IndexKey, IndexOutputBuffer> indexBufferMap = new HashMap<IndexKey, IndexOutputBuffer>();
     private final Set<ByteString> insertKeySet = new HashSet<ByteString>();
     private final EntryInformation entryInfo = new EntryInformation();
-    private final IndexKey dnIndexKey = new IndexKey(dnType, ImportIndexType.DN, 1);
+    private final IndexKey dnIndexKey = new IndexKey(dnType, ImportIndexType.DN.toString(), 1);
     private DatabaseEntry keyEntry = new DatabaseEntry();
     private DatabaseEntry valEntry = new DatabaseEntry();
 
@@ -1623,57 +1603,45 @@
     void fillIndexKey(Suffix suffix, AttributeIndex attrIndex, Entry entry, AttributeType attrType, EntryID entryID)
         throws DatabaseException, InterruptedException, DirectoryException, JebException
     {
-      final IndexingOptions options = attrIndex.getIndexingOptions();
-
-      processAttribute(attrIndex.getEqualityIndex(), ImportIndexType.EQUALITY, entry, attrType, entryID, options);
-      processAttribute(attrIndex.getPresenceIndex(), ImportIndexType.PRESENCE, entry, attrType, entryID, options);
-      processAttribute(attrIndex.getSubstringIndex(), ImportIndexType.SUBSTRING, entry, attrType, entryID, options);
-      processAttribute(attrIndex.getOrderingIndex(), ImportIndexType.ORDERING, entry, attrType, entryID, options);
-      processAttribute(attrIndex.getApproximateIndex(), ImportIndexType.APPROXIMATE, entry, attrType, entryID, options);
+      for(Index index : attrIndex.getAllIndexes()) {
+        processAttribute(index,  entry, attrType, entryID);
+      }
 
       for (VLVIndex vlvIdx : suffix.getEntryContainer().getVLVIndexes())
       {
         Transaction transaction = null;
         vlvIdx.addEntry(transaction, entryID, entry);
       }
-      Map<String, Collection<Index>> extensibleMap = attrIndex.getExtensibleIndexes();
-      if (!extensibleMap.isEmpty())
-      {
-        Collection<Index> subIndexes = extensibleMap.get(EXTENSIBLE_INDEXER_ID_SUBSTRING);
-        processAttributes(subIndexes, ImportIndexType.EX_SUBSTRING, entry, attrType, entryID, options);
-        Collection<Index> sharedIndexes = extensibleMap.get(EXTENSIBLE_INDEXER_ID_SHARED);
-        processAttributes(sharedIndexes, ImportIndexType.EX_SHARED, entry, attrType, entryID, options);
-      }
     }
 
-    private void processAttribute(Index index, ImportIndexType presence, Entry entry,
-        AttributeType attributeType, EntryID entryID, IndexingOptions options) throws InterruptedException
+    private void processAttribute(Index index, Entry entry, AttributeType attributeType, EntryID entryID)
+        throws InterruptedException
     {
       if (index != null)
       {
-        IndexKey indexKey = new IndexKey(attributeType, presence, index.getIndexEntryLimit());
-        processAttribute(index, entry, entryID, options, indexKey);
+        processAttribute(index, entry, entryID,
+            new IndexKey(attributeType, index.getName(), index.getIndexEntryLimit()));
       }
     }
 
-    private void processAttributes(Collection<Index> indexes, ImportIndexType indexType, Entry entry,
-        AttributeType attributeType, EntryID entryID, IndexingOptions options) throws InterruptedException
+    private void processAttributes(Collection<Index> indexes, Entry entry, AttributeType attributeType, EntryID entryID)
+        throws InterruptedException
     {
       if (indexes != null)
       {
         for (Index index : indexes)
         {
-          IndexKey indexKey = new IndexKey(attributeType, indexType, index.getIndexEntryLimit());
-          processAttribute(index, entry, entryID, options, indexKey);
+          processAttribute(index, entry, entryID,
+              new IndexKey(attributeType, index.getName(), index.getIndexEntryLimit()));
         }
       }
     }
 
-    void processAttribute(Index index, Entry entry, EntryID entryID, IndexingOptions options,
-        IndexKey indexKey) throws DatabaseException, InterruptedException
+    void processAttribute(Index index, Entry entry, EntryID entryID, IndexKey indexKey)
+        throws DatabaseException, InterruptedException
     {
       insertKeySet.clear();
-      index.indexEntry(entry, insertKeySet, options);
+      index.indexEntry(entry, insertKeySet);
       for (ByteString key : insertKeySet)
       {
         processKey(index, key.toByteArray(), entryID, indexKey, true);
@@ -2754,7 +2722,7 @@
         {
           return;
         }
-        boolean isDN2ID = ImportIndexType.DN.equals(indexKey.getIndexType());
+        boolean isDN2ID = ImportIndexType.DN.toString().equals(indexKey.getIndexName());
         IndexManager indexMgr = new IndexManager(indexKey.getName(), isDN2ID, indexKey.getEntryLimit());
         if (isDN2ID)
         {
@@ -3178,60 +3146,19 @@
         final AttributeType attrType, final boolean onlyDegraded)
         throws DatabaseException
     {
-      fillIndexMap(attrType, attrIndex.getSubstringIndex(), ImportIndexType.SUBSTRING, onlyDegraded);
-      fillIndexMap(attrType, attrIndex.getOrderingIndex(), ImportIndexType.ORDERING, onlyDegraded);
-      fillIndexMap(attrType, attrIndex.getEqualityIndex(), ImportIndexType.EQUALITY, onlyDegraded);
-      fillIndexMap(attrType, attrIndex.getPresenceIndex(), ImportIndexType.PRESENCE, onlyDegraded);
-      fillIndexMap(attrType, attrIndex.getApproximateIndex(), ImportIndexType.APPROXIMATE, onlyDegraded);
-
-      final Map<String, Collection<Index>> extensibleMap = attrIndex.getExtensibleIndexes();
-      if (!extensibleMap.isEmpty())
-      {
-        final Collection<Index> subIndexes = extensibleMap.get(EXTENSIBLE_INDEXER_ID_SUBSTRING);
-        fillIndexMap(attrType, subIndexes, ImportIndexType.EX_SUBSTRING, onlyDegraded);
-        final Collection<Index> sharedIndexes = extensibleMap.get(EXTENSIBLE_INDEXER_ID_SHARED);
-        fillIndexMap(attrType, sharedIndexes, ImportIndexType.EX_SHARED, onlyDegraded);
+      for(Index index : attrIndex.getAllIndexes()) {
+        fillIndexMap(attrType, index, onlyDegraded);
       }
     }
 
-    private void fillIndexMap(final AttributeType attrType, final Collection<Index> indexes,
-        final ImportIndexType importIndexType, final boolean onlyDegraded)
-    {
-      if (indexes != null && !indexes.isEmpty())
-      {
-        final List<Index> mutableCopy = new LinkedList<Index>(indexes);
-        for (final Iterator<Index> it = mutableCopy.iterator(); it.hasNext();)
-        {
-          final Index sharedIndex = it.next();
-          if (!onlyDegraded || !sharedIndex.isTrusted())
-          {
-            if (!rebuildConfig.isClearDegradedState() || sharedIndex.getRecordCount() == 0)
-            {
-              putInIdContainerMap(sharedIndex);
-            }
-          }
-          else
-          {
-            // This index is not a candidate for rebuilding.
-            it.remove();
-          }
-        }
-        if (!mutableCopy.isEmpty())
-        {
-          extensibleIndexMap.put(new IndexKey(attrType, importIndexType, 0), mutableCopy);
-        }
-      }
-    }
-
-    private void fillIndexMap(final AttributeType attrType, final Index index,
-        final ImportIndexType importIndexType, final boolean onlyDegraded)
+    private void fillIndexMap(final AttributeType attrType, final Index index, final boolean onlyDegraded)
     {
       if (index != null
           && (!onlyDegraded || !index.isTrusted())
           && (!rebuildConfig.isClearDegradedState() || index.getRecordCount() == 0))
       {
         putInIdContainerMap(index);
-        final IndexKey key = new IndexKey(attrType, importIndexType, index.getIndexEntryLimit());
+        final IndexKey key = new IndexKey(attrType, index.getName(), index.getIndexEntryLimit());
         indexMap.put(key, index);
       }
     }
@@ -3588,11 +3515,9 @@
         AttributeType attrType = key.getAttributeType();
         if (entry.hasAttribute(attrType))
         {
-          AttributeIndex attributeIndex = entryContainer.getAttributeIndex(attrType);
-          IndexingOptions options = attributeIndex.getIndexingOptions();
           for (Index index : mapEntry.getValue())
           {
-            processAttribute(index, entry, entryID, options, key);
+            processAttribute(index, entry, entryID, key);
           }
         }
       }
@@ -3607,10 +3532,7 @@
         AttributeType attrType = key.getAttributeType();
         if (entry.hasAttribute(attrType))
         {
-          AttributeIndex attributeIndex = entryContainer.getAttributeIndex(attrType);
-          IndexingOptions options = attributeIndex.getIndexingOptions();
-          Index index = mapEntry.getValue();
-          processAttribute(index, entry, entryID, options, key);
+          processAttribute(mapEntry.getValue(), entry, entryID, key);
         }
       }
     }
@@ -4045,7 +3967,7 @@
   {
 
     private final AttributeType attributeType;
-    private final ImportIndexType indexType;
+    private final String indexName;
     private final int entryLimit;
 
     /**
@@ -4059,10 +3981,10 @@
      * @param entryLimit
      *          The entry limit for the index.
      */
-    private IndexKey(AttributeType attributeType, ImportIndexType indexType, int entryLimit)
+    private IndexKey(AttributeType attributeType, String indexName, int entryLimit)
     {
       this.attributeType = attributeType;
-      this.indexType = indexType;
+      this.indexName = indexName;
       this.entryLimit = entryLimit;
     }
 
@@ -4082,7 +4004,7 @@
       {
         IndexKey oKey = (IndexKey) obj;
         if (attributeType.equals(oKey.getAttributeType())
-            && indexType.equals(oKey.getIndexType()))
+            && indexName.equals(oKey.indexName))
         {
           return true;
         }
@@ -4100,7 +4022,7 @@
     @Override
     public int hashCode()
     {
-      return attributeType.hashCode() + indexType.hashCode();
+      return attributeType.hashCode() + indexName.hashCode();
     }
 
     /**
@@ -4118,9 +4040,9 @@
      *
      * @return The index type.
      */
-    public ImportIndexType getIndexType()
+    public String getIndexName()
     {
-      return indexType;
+      return indexName;
     }
 
     /**
@@ -4133,7 +4055,7 @@
     public String getName()
     {
       return attributeType.getPrimaryName() + "."
-          + StaticUtils.toLowerCase(indexType.name());
+          + StaticUtils.toLowerCase(indexName);
     }
 
     /**
@@ -4151,7 +4073,7 @@
     public String toString()
     {
       return getClass().getSimpleName()
-          + "(index=" + attributeType.getNameOrOID() + "." + indexType
+          + "(index=" + attributeType.getNameOrOID() + "." + indexName
           + ", entryLimit=" + entryLimit
           + ")";
     }

--
Gitblit v1.10.0