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 828545ece1377d2f6b72adb632f1e860a394cfc7..7364db575789c7c2ab2e0fbbbb6c219b4841d56f 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 f7081b178816fe4da19049c392edf449ca97f8cf..97df9049ff7a94f893c63ef0b5fcb5b81693845d 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 b259533ed43d9f5a8b9414d3c3f86347be869c8d..ccd7eb52b9df7adb14f76e7bdd27e9f981584a9f 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 22fead76f041f23edf767a245a265ced3a868e31..c20671abbbf0e67ffd1dc22b032c4772fdfa535e 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 06353d2a647d3861f50e3771045e2ad14195d471..dee516faddee20382b59f5944ab041cbad0de8fa 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