From 247a0b5876d7bd9bb9ef8285ebaec00feb5f721f Mon Sep 17 00:00:00 2001 From: izabel <izabel> Date: Tue, 8 Jun 2010 07:57:44 +0000 Subject: [PATCH] [LMS-1570] decrease number of loaded samples (load by containers) SVN: 16315 --- .../plugin/generic/server/GenericServer.java | 21 +++++++-- .../server/SampleRegisterOrUpdateUtil.java | 46 +++++++++++++------ .../generic/server/GenericServerTest.java | 25 ++++++++++ 3 files changed, 76 insertions(+), 16 deletions(-) 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 1edcea074df..4ce8a4a0883 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 @@ -57,6 +57,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdateResult; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment; @@ -274,10 +275,24 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen private void registerOrUpdate(final Session session, NewSamplesWithTypes samples) { - List<Sample> existingSamples = + List<Sample> existingSamples = new ArrayList<Sample>(); + List<String> extractCodes = + SampleRegisterOrUpdateUtil.extractCodes(samples.getNewSamples(), false); + List<Sample> list = businessObjectFactory.createSampleLister(session).list( - SampleRegisterOrUpdateUtil.createListSamplesByCodeCriteria(samples - .getNewSamples())); + SampleRegisterOrUpdateUtil.createListSamplesByCodeCriteria(extractCodes)); + existingSamples.addAll(list); + List<String> codes = SampleRegisterOrUpdateUtil.extractCodes(samples.getNewSamples(), true); + ListOrSearchSampleCriteria criteria = + SampleRegisterOrUpdateUtil.createListSamplesByCodeCriteria(codes); + List<Sample> existingContainers = + businessObjectFactory.createSampleLister(session).list(criteria); + for (Sample s : existingContainers) + { + existingSamples.addAll(businessObjectFactory.createSampleLister(session).list( + new ListOrSearchSampleCriteria(ListOrSearchSampleCriteria + .createForContainer(new TechId(s.getId()))))); + } List<NewSample> samplesToUpdate = SampleRegisterOrUpdateUtil.getSamplesToUpdate(samples, existingSamples); List<NewSample> samplesToRegister = new ArrayList<NewSample>(samples.getNewSamples()); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/SampleRegisterOrUpdateUtil.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/SampleRegisterOrUpdateUtil.java index 1a6748dd991..ab9fd599696 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/SampleRegisterOrUpdateUtil.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/SampleRegisterOrUpdateUtil.java @@ -17,10 +17,9 @@ package ch.systemsx.cisd.openbis.plugin.generic.server; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; -import org.apache.commons.lang.StringUtils; - import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSamplesWithTypes; @@ -35,6 +34,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFa */ public class SampleRegisterOrUpdateUtil { + private static final String CODE_SEPARATOR = ":"; + private static final String INSTANCE_SEPARATOR = "/"; /** @@ -60,13 +61,8 @@ public class SampleRegisterOrUpdateUtil /** * Creates {@link ListOrSearchSampleCriteria} narrowing listing result to samples given codes. */ - static ListOrSearchSampleCriteria createListSamplesByCodeCriteria(List<NewSample> samples) + static ListOrSearchSampleCriteria createListSamplesByCodeCriteria(List<String> codes) { - List<String> codes = new ArrayList<String>(); - for (NewSample s : samples) - { - codes.add(extractCodeForSampleListingCriteria(s)); - } String[] codesAsArray = codes.toArray(new String[0]); ListOrSearchSampleCriteria criteria = new ListOrSearchSampleCriteria(codesAsArray); return criteria; @@ -100,11 +96,35 @@ public class SampleRegisterOrUpdateUtil } - private static String extractCodeForSampleListingCriteria(NewSample s) + private static String extractCode(String id) { - SampleIdentifier parsedIdentifier = SampleIdentifierFactory.parse(s.getIdentifier()); - String subcode = parsedIdentifier.getSampleSubCode(); - String code = parsedIdentifier.getSampleCode(); - return StringUtils.isBlank(subcode) ? code : subcode; + assert id != null; + if (id.contains(CODE_SEPARATOR)) + { + return id.substring(0, id.indexOf(CODE_SEPARATOR)); + } else + { + return id; + } + } + + /** + * If <var>withContainers</var> is true, containers codes are extracted, otherwise - sample + * codes. + */ + public static List<String> extractCodes(List<NewSample> newSamples, boolean withContainers) + { + HashSet<String> set = new HashSet<String>(); + for (NewSample s : newSamples) + { + String identifierWithoutInstance = dropDatabaseInstance(s.getIdentifier()); + boolean hasContainer = identifierWithoutInstance.contains(CODE_SEPARATOR); + if (hasContainer == withContainers) + { + SampleIdentifier parsed = SampleIdentifierFactory.parse(s.getIdentifier()); + set.add(extractCode(parsed.getSampleCode())); + } + } + return new ArrayList<String>(set); } } diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java index 585cdfbaeb5..320e5b588a9 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java @@ -232,6 +232,31 @@ public final class GenericServerTest extends AbstractServerTestCase context.assertIsSatisfied(); } + @Test + public final void testRegisterOrUpdateSamplesWithoutUpdate() + { + prepareGetSession(); + final SampleTypePE sampleTypePE = CommonTestUtils.createSampleType(); + final SampleType sampleType = new SampleType(); + sampleType.setCode(sampleTypePE.getCode()); + final List<NewSample> newSamples = new ArrayList<NewSample>(); + newSamples.add(createNewSample("one")); + newSamples.add(createNewSample("two")); + List<NewSamplesWithTypes> samplesWithTypes = new ArrayList<NewSamplesWithTypes>(); + samplesWithTypes.add(new NewSamplesWithTypes(sampleType, newSamples)); + context.checking(new Expectations() + { + { + one(sampleTypeDAO).tryFindSampleTypeByCode(sampleTypePE.getCode()); + will(returnValue(sampleTypePE)); + + one(sampleTypeSlaveServerPlugin).registerSamples(SESSION, newSamples); + } + }); + createServer().registerOrUpdateSamples(SESSION_TOKEN, samplesWithTypes); + context.assertIsSatisfied(); + } + @Test public final void testRegisterSamples() { -- GitLab