From 5ce37304338fc81da78fced35938872f5f37e000 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Mon, 01 Jun 2015 09:30:53 +0000
Subject: [PATCH] OPENDJ-2016 Implement new on disk merge import strategy based on storage engine

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeStorageImporter.java |   36 ++++++++++++++++++++++++++++++++++--
 1 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeStorageImporter.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeStorageImporter.java
index af3cb55..13200de 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeStorageImporter.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeStorageImporter.java
@@ -1765,7 +1765,7 @@
         else if (treeName.getIndexId().equals(ID2CHILDREN_COUNT_NAME))
         {
           // key conflicts == sum values
-          // TODO JNR
+          return new AddLongMerger(entryContainer.getID2ChildrenCount());
         }
         else if (treeName.getIndexId().equals(DN2ID_INDEX_NAME)
             || treeName.getIndexId().equals(DN2URI_INDEX_NAME)
@@ -1874,7 +1874,10 @@
     @Override
     public V merge()
     {
+      // copy before cleaning state
       final boolean mustThrow = moreThanOne;
+      final V mergedValue = first;
+
       // clean up state
       first = null;
       moreThanOne = false;
@@ -1883,7 +1886,7 @@
       {
         throw new IllegalArgumentException();
       }
-      return first;
+      return mergedValue;
     }
   }
 
@@ -1969,6 +1972,35 @@
     }
   }
 
+  /**
+   * {@link MergingConsumer} that accepts {@link ByteSequence} objects
+   * and produces a {@link ByteSequence} representing the added {@code long}s.
+   */
+  private static final class AddLongMerger implements MergingConsumer<ByteString>
+  {
+    private final ID2Count id2ChildrenCount;
+    private long count;
+
+    AddLongMerger(ID2Count id2ChildrenCount)
+    {
+      this.id2ChildrenCount = id2ChildrenCount;
+    }
+
+    @Override
+    public void accept(ByteString value)
+    {
+      this.count += id2ChildrenCount.fromValue(value);
+    }
+
+    @Override
+    public ByteString merge()
+    {
+      final ByteString result = id2ChildrenCount.toValue(count);
+      count = 0;
+      return result;
+    }
+  }
+
   /** Task used to migrate excluded branch. */
   private final class MigrateExcludedTask extends ImportTask
   {

--
Gitblit v1.10.0