From c2d8ca68325a5efa959e15a99387acc73da7aaba Mon Sep 17 00:00:00 2001
From: Fabio Pistolesi <fabio.pistolesi@forgerock.com>
Date: Tue, 02 Jun 2015 11:11:23 +0000
Subject: [PATCH] OPENDJ-1956 CR-7100 Missing entry/entries after import to newbackend

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexOutputBuffer.java |  138 +++++++--------------------------------------
 1 files changed, 23 insertions(+), 115 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 893ecdf..ce20836 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
@@ -30,6 +30,8 @@
 import static org.opends.server.util.StaticUtils.*;
 
 import java.io.ByteArrayOutputStream;
+import java.util.Arrays;
+import java.util.Comparator;
 
 import org.forgerock.opendj.ldap.ByteSequence;
 import org.opends.server.backends.pluggable.OnDiskMergeBufferImporter.IndexKey;
@@ -228,8 +230,25 @@
   /**
    * Sort the buffer.
    */
-  public void sort() {
-    sort(0, keys);
+  public void sort()
+  {
+    Integer[] keyArray = new Integer[keys];
+
+    for (int i = 0; i < keys; i++)
+    {
+      keyArray[i] = readInt(i * INT_SIZE);
+    }
+    Arrays.sort(keyArray, new Comparator<Integer>()
+      {
+        public int compare(Integer i1, Integer i2)
+        {
+          return offsetToRecord(i1).compareTo(offsetToRecord(i2));
+        }
+      });
+    for (int i = 0; i < keys; i++)
+    {
+      writeInt(buffer, i * INT_SIZE, keyArray[i]);
+    }
   }
 
   /**
@@ -325,9 +344,9 @@
     return readInt(position * INT_SIZE);
   }
 
-  private int compare(int xPosition, int yPosition)
+  private ImportRecord offsetToRecord(int offset)
   {
-    return toRecord(xPosition).compareTo(toRecord(yPosition));
+    return ImportRecord.fromBufferAndOffset(buffer, offset);
   }
 
   private ImportRecord toRecord(int position)
@@ -453,117 +472,6 @@
     return answer;
   }
 
-  private int med3(int a, int b, int c)
-  {
-    ImportRecord ra = toRecord(a);
-    ImportRecord rb = toRecord(b);
-    ImportRecord rc = toRecord(c);
-    return ra.compareTo(rb) < 0
-        ? (rb.compareTo(rc) < 0 ? b : ra.compareTo(rc) < 0 ? c : a)
-        : (rb.compareTo(rc) > 0 ? b : ra.compareTo(rc) > 0 ? c : a);
-  }
-
-  private void sort(int off, int len)
-  {
-    if (len < 7) {
-      for (int i=off; i<len+off; i++)
-      {
-        for (int j=i; j>off && compare(j-1, j)>0; j--)
-        {
-          swap(j, j-1);
-        }
-      }
-      return;
-    }
-
-    int m = off + (len >> 1);
-    if (len > 7) {
-      int l = off;
-      int n = off + len - 1;
-      if (len > 40) {
-        int s = len/8;
-        l = med3(l, l+s, l+2*s);
-        m = med3(m-s, m,  m+s);
-        n = med3(n-2*s, n-s, n);
-      }
-      m = med3(l, m, n);
-    }
-
-    int a = off, b = a, c = off + len - 1, d = c;
-    while(true)
-    {
-      ImportRecord rm = toRecord(m);
-      while (b <= c)
-      {
-        int cmp = toRecord(b).compareTo(rm);
-        if (cmp > 0)
-        {
-          break;
-        }
-        else if (cmp == 0)
-        {
-          swap(a++, b);
-        }
-        b++;
-      }
-
-      while (c >= b) {
-        int cmp = toRecord(c).compareTo(rm);
-        if (cmp < 0)
-        {
-          break;
-        }
-        else if (cmp == 0)
-        {
-          swap(c, d--);
-        }
-        c--;
-      }
-
-      if (b > c)
-      {
-        break;
-      }
-      swap(b++, c--);
-    }
-
-    // Swap partition elements back to middle
-    int s, n = off + len;
-    s = Math.min(a-off, b-a );
-    vectorSwap(off, b-s, s);
-    s = Math.min(d-c,   n-d-1);
-    vectorSwap(b, n-s, s);
-
-    s = b - a;
-    // Recursively sort non-partition-elements
-    if (s > 1)
-    {
-      sort(off, s);
-    }
-    s = d - c;
-    if (s > 1)
-    {
-      sort(n-s, s);
-    }
-  }
-
-  private void swap(int a, int b)
-  {
-    int aOffset = a * INT_SIZE;
-    int bOffset = b * INT_SIZE;
-    int tmp = readInt(bOffset);
-    System.arraycopy(buffer, aOffset, buffer, bOffset, INT_SIZE);
-    writeInt(buffer, aOffset, tmp);
-  }
-
-  private void vectorSwap(int a, int b, int n)
-  {
-    for (int i=0; i<n; i++, a++, b++)
-    {
-      swap(a, b);
-    }
-  }
-
   /**
    * Set the index key associated with an index buffer.
    *

--
Gitblit v1.10.0