From f4b7669232bacc3b33db491da6a6b1cb746c95d0 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Wed, 16 Jun 2010 07:55:53 +0000
Subject: [PATCH] minor: improvements of code for handling batches

SVN: 16540
---
 .../db/search/DefaultFullTextIndexer.java     |  9 +----
 .../GenericDataSetTypeSlaveServerPlugin.java  |  4 +--
 .../GenericSampleTypeSlaveServerPlugin.java   |  7 ++--
 .../plugin/generic/server/GenericServer.java  |  6 ++--
 .../server/batch/BatchOperationExecutor.java  | 34 +++++++++----------
 5 files changed, 24 insertions(+), 36 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java
index 828545ece13..7364db57578 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java
@@ -129,14 +129,7 @@ final class DefaultFullTextIndexer implements IFullTextIndexer
 
     private int getNextIndex(int index, int maxIndex)
     {
-        int result = index + batchSize;
-        if (result < maxIndex)
-        {
-            return result;
-        } else
-        {
-            return maxIndex;
-        }
+        return Math.min(index + batchSize, maxIndex);
     }
 
     private static final FullTextSession getFullTextSession(final Session hibernateSession)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericDataSetTypeSlaveServerPlugin.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericDataSetTypeSlaveServerPlugin.java
index f7081b17881..97df9049ff7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericDataSetTypeSlaveServerPlugin.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericDataSetTypeSlaveServerPlugin.java
@@ -39,8 +39,6 @@ import ch.systemsx.cisd.openbis.plugin.generic.shared.ResourceNames;
 @Component(ch.systemsx.cisd.openbis.generic.shared.ResourceNames.GENERIC_DATA_SET_TYPE_SLAVE_SERVER_PLUGIN)
 public class GenericDataSetTypeSlaveServerPlugin implements IDataSetTypeSlaveServerPlugin
 {
-    private static final int BATCH_SIZE = 1000;
-
     @Resource(name = ResourceNames.GENERIC_BUSINESS_OBJECT_FACTORY)
     private IGenericBusinessObjectFactory businessObjectFactory;
 
@@ -62,7 +60,7 @@ public class GenericDataSetTypeSlaveServerPlugin implements IDataSetTypeSlaveSer
         assert newDataSets != null && newDataSets.size() > 0 : "Unspecified data set or empty data sets.";
 
         new BatchOperationExecutor<NewDataSet>().executeInBatches(new DataSetBatchUpdate(
-                businessObjectFactory.createExternalDataTable(session), newDataSets), BATCH_SIZE);
+                businessObjectFactory.createExternalDataTable(session), newDataSets));
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericSampleTypeSlaveServerPlugin.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericSampleTypeSlaveServerPlugin.java
index b259533ed43..ccd7eb52b9d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericSampleTypeSlaveServerPlugin.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericSampleTypeSlaveServerPlugin.java
@@ -46,9 +46,6 @@ import ch.systemsx.cisd.openbis.plugin.generic.shared.ResourceNames;
 @Component(ch.systemsx.cisd.openbis.generic.shared.ResourceNames.GENERIC_SAMPLE_TYPE_SLAVE_SERVER_PLUGIN)
 public final class GenericSampleTypeSlaveServerPlugin implements ISampleTypeSlaveServerPlugin
 {
-
-    private static final int BATCH_SIZE = 10000;
-
     @Resource(name = ResourceNames.GENERIC_BUSINESS_OBJECT_FACTORY)
     private IGenericBusinessObjectFactory businessObjectFactory;
 
@@ -83,7 +80,7 @@ public final class GenericSampleTypeSlaveServerPlugin implements ISampleTypeSlav
         assert newSamples != null && newSamples.size() > 0 : "Unspecified sample or empty samples.";
 
         new BatchOperationExecutor<NewSample>().executeInBatches(new SampleBatchRegistration(
-                businessObjectFactory.createSampleTable(session), newSamples), BATCH_SIZE);
+                businessObjectFactory.createSampleTable(session), newSamples));
     }
 
     public void updateSamples(Session session, List<SampleBatchUpdatesDTO> updateSamples)
@@ -92,6 +89,6 @@ public final class GenericSampleTypeSlaveServerPlugin implements ISampleTypeSlav
         assert updateSamples != null && updateSamples.size() > 0 : "Unspecified sample or empty samples.";
 
         new BatchOperationExecutor<SampleBatchUpdatesDTO>().executeInBatches(new SampleBatchUpdate(
-                businessObjectFactory.createSampleTable(session), updateSamples), BATCH_SIZE);
+                businessObjectFactory.createSampleTable(session), updateSamples));
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
index 22fead76f04..c20671abbbf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
@@ -274,10 +274,10 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
                 registerSamples(session, samples);
             } else
             {
-                new BatchOperationExecutor<NewSample>().executeInBatches(
-                        new SampleBatchRegisterOrUpdate(businessObjectFactory
+                new BatchOperationExecutor<NewSample>()
+                        .executeInBatches(new SampleBatchRegisterOrUpdate(businessObjectFactory
                                 .createSampleLister(session), samples.getNewSamples(), samples
-                                .getSampleType(), session), 1000);
+                                .getSampleType(), session));
             }
         }
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/batch/BatchOperationExecutor.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/batch/BatchOperationExecutor.java
index 06353d2a647..dee516fadde 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/batch/BatchOperationExecutor.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/batch/BatchOperationExecutor.java
@@ -1,6 +1,5 @@
 package ch.systemsx.cisd.openbis.plugin.generic.server.batch;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.log4j.Logger;
@@ -9,7 +8,7 @@ import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 
 /**
- * Executes provided operation in batches of chosen size.
+ * Executes provided operation in batches of chosen size (by default 1000).
  * 
  * @author Izabela Adamczyk
  */
@@ -18,27 +17,28 @@ public class BatchOperationExecutor<S>
     private static final Logger operationLog =
             LogFactory.getLogger(LogCategory.OPERATION, BatchOperationExecutor.class);
 
+    private static final int DEFAULT_BATCH_SIZE = 1000;
+
+    public void executeInBatches(IBatchOperation<S> strategy)
+    {
+        executeInBatches(strategy, DEFAULT_BATCH_SIZE);
+    }
+
     public void executeInBatches(IBatchOperation<S> strategy, int batchSize)
     {
         assert strategy != null : "Unspecified operation.";
 
-        List<S> batch = new ArrayList<S>();
-        int counter = 0;
-        for (S entity : strategy.getAllEntities())
-        {
-            batch.add(entity);
-            if (batch.size() >= batchSize)
-            {
-                strategy.execute(batch);
-                counter += batch.size();
-                operationLog.info(String.format("%s %s progress: %d/%d", strategy.getEntityName(),
-                        strategy.getOperationName(), counter, strategy.getAllEntities().size()));
-                batch.clear();
-            }
-        }
-        if (batch.size() > 0)
+        final List<S> allEntities = strategy.getAllEntities();
+        int startIndex = 0;
+        int maxIndex = allEntities.size();
+        while (startIndex < maxIndex)
         {
+            final int endIndex = Math.min(startIndex + batchSize, maxIndex);
+            final List<S> batch = allEntities.subList(startIndex, endIndex);
             strategy.execute(batch);
+            operationLog.info(String.format("%s %s progress: %d/%d", strategy.getEntityName(),
+                    strategy.getOperationName(), endIndex, maxIndex));
+            startIndex += batchSize;
         }
     }
 }
\ No newline at end of file
-- 
GitLab