From 836daf9ab712183520854b08b4dc90279490b27e Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Tue, 19 May 2015 09:50:20 +0000
Subject: [PATCH] Code simplifications with indexes

---
 opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VerifyJob.java      |    5 -
 opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java |  111 +++++++++++++++----------------------
 opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Importer.java       |   11 +--
 3 files changed, 49 insertions(+), 78 deletions(-)

diff --git a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java
index 660aad4..9d224e9 100644
--- a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java
+++ b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java
@@ -108,9 +108,7 @@
     }
   }
 
-  /**
-   * This class implements an attribute indexer for matching rules in a Backend.
-   */
+  /** This class implements an attribute indexer for matching rules in a Backend. */
   static final class MatchingRuleIndex extends DefaultIndex
   {
     private final AttributeType attributeType;
@@ -127,49 +125,45 @@
     void indexEntry(Entry entry, Set<ByteString> keys)
     {
       List<Attribute> attributes = entry.getAttribute(attributeType, true);
-      if (attributes != null)
-      {
-        indexAttribute(attributes, keys);
-      }
+      indexAttribute(attributes, keys);
+    }
+
+    Set<ByteString> indexEntry(Entry entry)
+    {
+      final Set<ByteString> keys = new HashSet<>();
+      indexEntry(entry, keys);
+      return keys;
     }
 
     private void modifyEntry(Entry oldEntry, Entry newEntry, Map<ByteString, Boolean> modifiedKeys)
     {
-      List<Attribute> oldAttributes = oldEntry.getAttribute(attributeType, true);
-      if (oldAttributes != null)
+      for (ByteString key : indexEntry(oldEntry))
       {
-        final Set<ByteString> keys = new HashSet<ByteString>();
-        indexAttribute(oldAttributes, keys);
-        for (ByteString key : keys)
-        {
-          modifiedKeys.put(key, false);
-        }
+        modifiedKeys.put(key, false);
       }
 
-      List<Attribute> newAttributes = newEntry.getAttribute(attributeType, true);
-      if (newAttributes != null)
+      for (ByteString key : indexEntry(newEntry))
       {
-        final Set<ByteString> keys = new HashSet<ByteString>();
-        indexAttribute(newAttributes, keys);
-        for (ByteString key : keys)
+        final Boolean needsAdding = modifiedKeys.get(key);
+        if (needsAdding == null)
         {
-          final Boolean needsAdding = modifiedKeys.get(key);
-          if (needsAdding == null)
-          {
-            // This value has been added.
-            modifiedKeys.put(key, true);
-          }
-          else if (!needsAdding)
-          {
-            // This value has not been added or removed.
-            modifiedKeys.remove(key);
-          }
+          // This value has been added.
+          modifiedKeys.put(key, true);
+        }
+        else if (!needsAdding)
+        {
+          // This value has not been added or removed.
+          modifiedKeys.remove(key);
         }
       }
     }
 
     private void indexAttribute(List<Attribute> attributes, Set<ByteString> keys)
     {
+      if (attributes == null)
+      {
+        return;
+      }
       for (Attribute attr : attributes)
       {
         if (!attr.isVirtual())
@@ -202,9 +196,7 @@
   /** The key bytes used for the presence index as a {@link ByteString}. */
   static final ByteString PRESENCE_KEY = ByteString.valueOf("+");
 
-  /**
-   * A special indexer for generating presence indexes.
-   */
+  /** A special indexer for generating presence indexes. */
   private static final Indexer PRESENCE_INDEXER = new Indexer()
   {
     @Override
@@ -253,10 +245,9 @@
     final int indexEntryLimit = config.getIndexEntryLimit();
     final IndexingOptions indexingOptions = new IndexingOptionsImpl(config.getSubstringLength());
 
-    final Map<String, MatchingRuleIndex> indexes = new HashMap<>();
-
+    Collection<Indexer> indexers = new ArrayList<>();
     for(IndexType indexType : config.getIndexType()) {
-      Collection<? extends Indexer> indexers;
+      MatchingRule rule;
       switch (indexType)
       {
       case PRESENCE:
@@ -267,31 +258,26 @@
             getExtensibleIndexers(config.getAttribute(), config.getIndexExtensibleMatchingRule(), indexingOptions);
         break;
       case APPROXIMATE:
-        indexers =
-            throwIfNoMatchingRule(attributeType, indexType, attributeType.getApproximateMatchingRule()).createIndexers(
-                indexingOptions);
+        rule = throwIfNoMatchingRule(attributeType, indexType, attributeType.getApproximateMatchingRule());
+        indexers.addAll(rule.createIndexers(indexingOptions));
         break;
       case EQUALITY:
-        indexers =
-            throwIfNoMatchingRule(attributeType, indexType, attributeType.getEqualityMatchingRule()).createIndexers(
-                indexingOptions);
+        rule = throwIfNoMatchingRule(attributeType, indexType, attributeType.getEqualityMatchingRule());
+        indexers.addAll(rule.createIndexers(indexingOptions));
         break;
       case ORDERING:
-        indexers =
-            throwIfNoMatchingRule(attributeType, indexType, attributeType.getOrderingMatchingRule()).createIndexers(
-                indexingOptions);
+        rule = throwIfNoMatchingRule(attributeType, indexType, attributeType.getOrderingMatchingRule());
+        indexers.addAll(rule.createIndexers(indexingOptions));
         break;
       case SUBSTRING:
-        indexers =
-            throwIfNoMatchingRule(attributeType, indexType, attributeType.getSubstringMatchingRule()).createIndexers(
-                indexingOptions);
+        rule = throwIfNoMatchingRule(attributeType, indexType, attributeType.getSubstringMatchingRule());
+        indexers.addAll(rule.createIndexers(indexingOptions));
         break;
       default:
        throw new ConfigException(ERR_CONFIG_INDEX_TYPE_NEEDS_MATCHING_RULE.get(attributeType, indexType.toString()));
       }
-      buildIndexesForIndexers(entryContainer, attributeType, state, indexes, indexEntryLimit, indexers);
     }
-    return indexes;
+    return buildIndexesForIndexers(entryContainer, attributeType, state, indexEntryLimit, indexers);
   }
 
   private static MatchingRule throwIfNoMatchingRule(AttributeType attributeType, IndexType type, MatchingRule rule)
@@ -304,9 +290,10 @@
     return rule;
   }
 
-  private static void buildIndexesForIndexers(EntryContainer entryContainer, AttributeType attributeType, State state,
-      Map<String, MatchingRuleIndex> indexes, int indexEntryLimit, Collection<? extends Indexer> indexers)
+  private static Map<String, MatchingRuleIndex> buildIndexesForIndexers(EntryContainer entryContainer,
+      AttributeType attributeType, State state, int indexEntryLimit, Collection<? extends Indexer> indexers)
   {
+    final Map<String, MatchingRuleIndex> indexes = new HashMap<>();
     for (Indexer indexer : indexers)
     {
       final String indexID = indexer.getIndexID();
@@ -315,6 +302,7 @@
         indexes.put(indexID, new MatchingRuleIndex(entryContainer, attributeType, state, indexer, indexEntryLimit));
       }
     }
+    return indexes;
   }
 
   private static Collection<Indexer> getExtensibleIndexers(AttributeType attributeType, Set<String> extensibleRules,
@@ -431,7 +419,7 @@
   {
     for (MatchingRuleIndex index : indexIdToIndexes.values())
     {
-      for (ByteString key : indexEntry(index, entry))
+      for (ByteString key : index.indexEntry(entry))
       {
         buffer.put(index, key, entryID);
       }
@@ -451,23 +439,15 @@
   {
     for (MatchingRuleIndex index : indexIdToIndexes.values())
     {
-      for (ByteString key : indexEntry(index, entry))
+      for (ByteString key : index.indexEntry(entry))
       {
         buffer.remove(index, key, entryID);
       }
     }
   }
 
-  private Set<ByteString> indexEntry(MatchingRuleIndex index, Entry entry)
-  {
-    final Set<ByteString> keys = new HashSet<>();
-    index.indexEntry(entry, keys);
-    return keys;
-  }
-
   /**
-   * Update the index to reflect a sequence of modifications in a Modify
-   * operation.
+   * Update the index to reflect a sequence of modifications in a Modify operation.
    *
    * @param buffer The index buffer used to buffer up the index changes.
    * @param entryID The ID of the entry that was modified.
@@ -480,7 +460,7 @@
   {
     for (MatchingRuleIndex index : indexIdToIndexes.values())
     {
-      TreeMap<ByteString, Boolean> modifiedKeys = new TreeMap<ByteString, Boolean>();
+      TreeMap<ByteString, Boolean> modifiedKeys = new TreeMap<>();
       index.modifyEntry(oldEntry, newEntry, modifiedKeys);
       for (Map.Entry<ByteString, Boolean> modifiedKey : modifiedKeys.entrySet())
       {
@@ -785,7 +765,6 @@
       {
         updateIndex(updatedIndex, newConfiguration.getIndexEntryLimit(), ccr);
       }
-
     }
     catch (Exception e)
     {
diff --git a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Importer.java b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Importer.java
index e905e90..2772f39 100644
--- a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Importer.java
+++ b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Importer.java
@@ -56,7 +56,6 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
@@ -1407,7 +1406,6 @@
   {
     private final Storage storage;
     private final Map<IndexKey, IndexOutputBuffer> indexBufferMap = new HashMap<>();
-    private final Set<ByteString> keySet = new HashSet<>();
     private final IndexKey dnIndexKey = new IndexKey(DN_TYPE, DN2ID_INDEX_NAME, 1);
 
     public ImportTask(final Storage storage)
@@ -1550,10 +1548,7 @@
     void processAttribute0(MatchingRuleIndex index, Entry entry, EntryID entryID, IndexKey indexKey, boolean insert)
         throws InterruptedException
     {
-      keySet.clear();
-      index.indexEntry(entry, keySet);
-
-      for (ByteString key : keySet)
+      for (ByteString key : index.indexEntry(entry))
       {
         processKey(index, key, entryID, indexKey, insert);
       }
@@ -3306,8 +3301,8 @@
       if (obj instanceof IndexKey)
       {
         IndexKey oKey = (IndexKey) obj;
-        if (attributeType.equals(oKey.getAttributeType())
-            && indexID.equals(oKey.getIndexID()))
+        if (attributeType.equals(oKey.attributeType)
+            && indexID.equals(oKey.indexID))
         {
           return true;
         }
diff --git a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VerifyJob.java b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VerifyJob.java
index 4d56ff0..98b82ea 100644
--- a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VerifyJob.java
+++ b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VerifyJob.java
@@ -35,7 +35,6 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.IdentityHashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -957,9 +956,7 @@
   {
     for (MatchingRuleIndex index : attrIndex.getNameToIndexes().values())
     {
-      Set<ByteString> keys = new HashSet<ByteString>();
-      index.indexEntry(entry, keys);
-      for (ByteString key : keys)
+      for (ByteString key : index.indexEntry(entry))
       {
         verifyAttributeInIndex(index, txn, key, entryID);
       }

--
Gitblit v1.10.0