From bef3516093c8486b911ac87187ed69217701f4ef Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 12 Mar 2015 12:39:27 +0000
Subject: [PATCH] IndexOutputBuffer.java: Removed useless ComparatorBuffer interface. Renamed compare(int, int) to compareInts(int, int). Extracted method compareArrays(). Inlined compareLengthThenIndexID(), replaced by two successive calls to compareInts(). Extracted compare(byte[] array1, int offset1, int length1, int indexID1, byte[] array2, int offset2, int length2, int indexID2) + inlined two other compare() methods that are now referencing the newly extracted compare() method.

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexOutputBuffer.java |  194 ++++++++++--------------------------------------
 1 files changed, 42 insertions(+), 152 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexOutputBuffer.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexOutputBuffer.java
index c5640ce..c341a6a 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexOutputBuffer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexOutputBuffer.java
@@ -438,7 +438,7 @@
     int yKeyLen = readInt(buffer, yoffSet);
     int yKey = INT_SIZE + yoffSet;
 
-    int cmp = indexComparator.compare(buffer, xKey, xKeyLen, xIndexID, yKey, yKeyLen, yIndexID);
+    int cmp = indexComparator.compare(buffer, xKey, xKeyLen, xIndexID, buffer, yKey, yKeyLen, yIndexID);
     return evaluateReturnCode(cmp, op);
   }
 
@@ -450,7 +450,7 @@
     int xKeyLen = readInt(buffer, xoffSet);
     int xKey = INT_SIZE + xoffSet;
 
-    int cmp = indexComparator.compare(buffer, xKey, xKeyLen, xIndexID, yKey, yKey.length, yIndexID);
+    int cmp = indexComparator.compare(buffer, xKey, xKeyLen, xIndexID, yKey, 0, yKey.length, yIndexID);
     return evaluateReturnCode(cmp, op);
   }
 
@@ -745,164 +745,44 @@
     }
   }
 
-
   /**
-   * Interface that defines two methods used to compare keys used in this
-   * class. The Comparator interface cannot be used in this class, so this
+   * Used to compare keys when they are non-DN indexes.
+   * <p>
+   * The Comparator interface cannot be used in this class, so this
    * special one is used that knows about the special properties of this class.
-   *
-   * @param <T> object to use in the compare
    */
-  public static interface ComparatorBuffer<T> {
-
-
-     /**
-     * Compare two offsets in an object, usually a byte array.
-     *
-     * @param o The object.
-     * @param offset The first offset.
-     * @param length The first length.
-     * @param indexID The first index id.
-     * @param otherOffset The second offset.
-     * @param otherLength The second length.
-     * @param otherIndexID The second index id.
-     * @return a negative integer, zero, or a positive integer as the first
-     *         offset value is less than, equal to, or greater than the second.
-     */
-    int compare(T o, int offset, int length, int indexID, int otherOffset,
-                int otherLength, int otherIndexID);
-
-
-    /**
-     * Compare an offset in an object with the specified object.
-     *
-     * @param o The first object.
-     * @param offset The first offset.
-     * @param length The first length.
-     * @param indexID The first index id.
-     * @param other The second object.
-     * @param otherLength The length of the second object.
-     * @param otherIndexID The second index id.
-     * @return a negative integer, zero, or a positive integer as the first
-     *         offset value is less than, equal to, or greater than the second
-     *         object.
-     */
-    int compare(T o, int offset, int length, int indexID, T other,
-                int otherLength, int otherIndexID);
-
-
-    /**
-     * Compare an offset in an object with the specified object.
-     *
-     * @param o The first object.
-     * @param offset The first offset.
-     * @param length The first length.
-     * @param other The second object.
-     * @param otherLen The length of the second object.
-     * @return a negative integer, zero, or a positive integer as the first
-     *         offset value is less than, equal to, or greater than the second
-     *         object.
-     */
-    int compare(T o, int offset, int length, T other,
-                int otherLen);
-
-  }
-
-
-  /**
-   * Implementation of ComparatorBuffer interface. Used to compare keys when
-   * they are non-DN indexes.
-   */
-  public static class IndexComparator implements IndexOutputBuffer.ComparatorBuffer<byte[]>
+  public static class IndexComparator
   {
 
     /**
-     * Compare two offsets in an byte array using the index compare
-     * algorithm.  The specified index ID is used in the comparison if the
-     * byte arrays are equal.
+     * Compare an offset in a byte array and indexID with the specified offset in the other byte array
+     * and other indexID, using the DN compare algorithm.
      *
-     * @param b The byte array.
-     * @param offset The first offset.
-     * @param length The first length.
-     * @param indexID The first index id.
-     * @param otherOffset The second offset.
-     * @param otherLength The second length.
-     * @param otherIndexID The second index id.
-     * @return a negative integer, zero, or a positive integer as the first
-     *         offset value is less than, equal to, or greater than the second.
-     */
-    @Override
-    public int compare(byte[] b, int offset, int length, int indexID,
-                       int otherOffset, int otherLength, int otherIndexID)
-    {
-      for(int i = 0; i < length && i < otherLength; i++)
-      {
-        byte b1 = b[offset + i];
-        byte b2 = b[otherOffset + i];
-        if (b1 > b2)
-        {
-          return 1;
-        }
-        else if (b1 < b2)
-        {
-          return -1;
-        }
-      }
-      return compareLengthThenIndexID(length, indexID, otherLength, otherIndexID);
-    }
-
-    /**
-     * Compare an offset in an byte array with the specified byte array,
-     * using the DN compare algorithm.   The specified index ID is used in the
-     * comparison if the byte arrays are equal.
-     *
-     * @param b The byte array.
-     * @param offset The first offset.
-     * @param length The first length.
-     * @param indexID The first index id.
-     * @param other The second byte array to compare to.
-     * @param otherLength The second byte array's length.
-     * @param otherIndexID The second index id.
+     * @param array1   The first byte array.
+     * @param offset1  The first byte array's offset.
+     * @param length1  The first byte array's length.
+     * @param indexID1 The first index id.
+     * @param array2   The second byte array to compare to.
+     * @param offset1  The second byte array's offset.
+     * @param length2  The second byte array's length.
+     * @param indexID2 The second index id.
      * @return a negative integer, zero, or a positive integer as the first
      *         offset value is less than, equal to, or greater than the second
      *         byte array.
      */
-    @Override
-    public int compare(byte[] b, int offset, int length, int indexID,
-                       byte[] other, int otherLength, int otherIndexID)
+    private int compare(byte[] array1, int offset1, int length1, int indexID1,
+                        byte[] array2, int offset2, int length2, int indexID2)
     {
-      for(int i = 0; i < length && i < otherLength; i++)
+      int cmp = compareInts(indexID1, indexID2);
+      if (cmp == 0)
       {
-        if(b[offset + i] > other[i])
+        cmp = compareInts(length1, length2);
+        if (cmp == 0)
         {
-          return 1;
-        }
-        else if (b[offset + i] < other[i])
-        {
-          return -1;
+          return compareArrays(array1, offset1, length1, array2, offset2, length2);
         }
       }
-      return compareLengthThenIndexID(length, indexID, otherLength, otherIndexID);
-    }
-
-    /**
-     * The arrays are equal, make sure they are in the same index
-     * since multiple suffixes might have the same key.
-     */
-    private int compareLengthThenIndexID(int length, int indexID, int otherLength, int otherIndexID)
-    {
-      if (length == otherLength)
-      {
-        return compare(indexID, otherIndexID);
-      }
-      else if (length > otherLength)
-      {
-        return 1;
-      }
-      else
-      {
-        return -1;
-      }
+      return cmp;
     }
 
     /**
@@ -918,25 +798,35 @@
      *         offset value is less than, equal to, or greater than the second
      *         byte array.
      */
-    @Override
-    public int compare(byte[] b, int offset, int length, byte[] other,
-                       int otherLength)
+    public int compare(byte[] b, int offset, int length, byte[] other, int otherLength)
     {
-      for(int i = 0; i < length && i < otherLength; i++)
+      final int cmp = compareInts(length, otherLength);
+      if (cmp != 0)
       {
-        if(b[offset + i] > other[i])
+        return cmp;
+      }
+      return compareArrays(b, offset, length, other, 0, otherLength);
+    }
+
+    private int compareArrays(byte[] array1, int offset1, int length1, byte[] array2, int offset2, int length2)
+    {
+      for (int i = 0; i < length1 && i < length2; i++)
+      {
+        byte b1 = array1[offset1 + i];
+        byte b2 = array2[offset2 + i];
+        if (b1 > b2)
         {
           return 1;
         }
-        else if (b[offset + i] < other[i])
+        else if (b1 < b2)
         {
           return -1;
         }
       }
-      return compare(length, otherLength);
+      return 0;
     }
 
-    private int compare(int i1, int i2)
+    private int compareInts(int i1, int i2)
     {
       if (i1 == i2)
       {

--
Gitblit v1.10.0