From 3ab9614db1a1a1a30c271424c4189999bf71b87a Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 07 Mar 2014 10:58:03 +0000
Subject: [PATCH] OPENDJ-1308 Migrate schema support

---
 opendj3-server-dev/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java |   43 +++++++++++++++++++++++++++++++++----------
 1 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java
index a8b8c0e..3fa54eb 100644
--- a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java
+++ b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java
@@ -27,12 +27,13 @@
 package org.opends.server.backends.jeb;
 
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import org.opends.server.api.ExtensibleIndexer;
-import org.opends.server.api.ExtensibleMatchingRule;
+import org.opends.server.api.MatchingRule;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.Entry;
@@ -77,15 +78,13 @@
    * @param extensibleIndexer The extensible indexer to be used.
    */
   public JEExtensibleIndexer(AttributeType attributeType,
-          ExtensibleMatchingRule matchingRule,
+          MatchingRule matchingRule,
           ExtensibleIndexer extensibleIndexer)
   {
     this.attributeType = attributeType;
     this.extensibleIndexer = extensibleIndexer;
   }
 
-
-
    /**
    * Gets a string representation of this object.  The returned value is
    * used to name an index created using this object.
@@ -202,14 +201,38 @@
   {
     if (attrList == null) return;
 
-    for (Attribute attr : attrList)
+    final Set<byte[]> keys = new HashSet<byte[]>();
+    indexAttribute(attrList, keys);
+    computeModifiedKeys(modifiedKeys, insert, keys);
+  }
+
+  /**
+   * Computes a map of index keys and a boolean flag indicating whether the
+   * corresponding key will be inserted or deleted.
+   *
+   * @param modifiedKeys
+   *          A map containing the keys and a boolean. Keys corresponding to the
+   *          boolean value <code>true</code> should be inserted and
+   *          <code>false</code> should be deleted.
+   * @param insert
+   *          <code>true</code> if generated keys should be inserted or
+   *          <code>false</code> otherwise.
+   * @param keys
+   *          The index keys to map.
+   */
+  private static void computeModifiedKeys(Map<byte[], Boolean> modifiedKeys,
+      Boolean insert, final Set<byte[]> keys)
+  {
+    for (byte[] key : keys)
     {
-      if (!attr.isVirtual())
+      Boolean cInsert = modifiedKeys.get(key);
+      if (cInsert == null)
       {
-        for (AttributeValue value : attr)
-        {
-          extensibleIndexer.getKeys(value, modifiedKeys, insert);
-        }
+        modifiedKeys.put(key, insert);
+      }
+      else if (!cInsert.equals(insert))
+      {
+        modifiedKeys.remove(key);
       }
     }
   }

--
Gitblit v1.10.0