diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java index 31dfeab59c6ec71b7b78ba781009602673892b8f..7b40831a49d0e9c57db698a4b249c4cee4913892 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java @@ -340,6 +340,14 @@ public interface ISampleListingQuery extends TransactionQuery, IPropertyListingQ { StringArrayMapper.class }, fetchSize = FETCH_SIZE) public DataIterator<SampleRecord> getSamplesForCodes(String[] sampleCodes); + /** + * Returns the non-empty container samples for the given <var>sampleCodes</var>. + */ + @Select(sql = SELECT_FROM_SAMPLES_S + + " where s.id in (select samp_id_part_of from samples where samp_id_part_of in (select id from samples where code = any(?{1})))", parameterBindings = + { StringArrayMapper.class }, fetchSize = FETCH_SIZE) + public DataIterator<SampleRecord> getContainerSamplesForCodes(String[] sampleCodes); + /** * Returns the samples for the given <var>permIds</var>. */ @@ -347,6 +355,14 @@ public interface ISampleListingQuery extends TransactionQuery, IPropertyListingQ { StringArrayMapper.class }, fetchSize = FETCH_SIZE) public DataIterator<SampleRecord> getSamplesForPermIds(String[] permIds); + /** + * Returns the non-empty container samples for the given <var>sampleCodes</var>. + */ + @Select(sql = SELECT_FROM_SAMPLES_S + + " where s.id in (select samp_id_part_of from samples where samp_id_part_of in (select id from samples where permId = any(?{1})))", parameterBindings = + { StringArrayMapper.class }, fetchSize = FETCH_SIZE) + public DataIterator<SampleRecord> getContainerSamplesForPermIds(String[] permIds); + // // Sample Properties // diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java index 0426f4d24fa08d7ade6ab2cb9539b2c5e6ef5e4e..6e797e6a5c6707fd762c4dfb1fd14f2027e7d32d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java @@ -44,10 +44,10 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.CodeConverter; import ch.systemsx.cisd.openbis.generic.shared.basic.PermlinkUtilities; import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; @@ -218,7 +218,9 @@ final class SampleListingWorker extends AbstractLister loadSampleTypes(); retrievePrimaryBasicSamples(tryGetIteratorForSamplesByIds()); retrievePrimaryBasicSamples(tryGetIteratorForSamplesByCodes()); + retrievePrimaryBasicSamples(tryGetIteratorForContainerSamplesByCodes()); retrievePrimaryBasicSamples(tryGetIteratorForSamplesByPermIds()); + retrievePrimaryBasicSamples(tryGetIteratorForContainerSamplesByPermIds()); retrievePrimaryBasicSamples(tryGetIteratorForSpaceSamples()); retrievePrimaryBasicSamples(tryGetIteratorForSharedSamples()); retrievePrimaryBasicSamples(tryGetIteratorForExperimentSamples()); @@ -351,6 +353,10 @@ final class SampleListingWorker extends AbstractLister private Iterable<SampleRecord> tryGetIteratorForSamplesByCodes() { + if (criteria.isSearchForContainerSamplesOnly()) + { + return null; + } String[] codes = criteria.trySampleCodes(); if (codes == null) { @@ -359,8 +365,26 @@ final class SampleListingWorker extends AbstractLister return query.getSamplesForCodes(codes); } + private Iterable<SampleRecord> tryGetIteratorForContainerSamplesByCodes() + { + if (criteria.isSearchForContainerSamplesOnly()) + { + return null; + } + String[] codes = criteria.trySampleCodes(); + if (codes == null) + { + return null; + } + return query.getContainerSamplesForCodes(codes); + } + private Iterable<SampleRecord> tryGetIteratorForSamplesByPermIds() { + if (criteria.isSearchForContainerSamplesOnly()) + { + return null; + } String[] permIds = criteria.trySamplePermIds(); if (permIds == null) { @@ -369,6 +393,20 @@ final class SampleListingWorker extends AbstractLister return query.getSamplesForPermIds(permIds); } + private Iterable<SampleRecord> tryGetIteratorForContainerSamplesByPermIds() + { + if (false == criteria.isSearchForContainerSamplesOnly()) + { + return null; + } + String[] permIds = criteria.trySamplePermIds(); + if (permIds == null) + { + return null; + } + return query.getContainerSamplesForPermIds(permIds); + } + private Iterable<SampleRecord> tryGetIteratorForSpaceSamples() { if (criteria.isIncludeSpace() == false) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListOrSearchSampleCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListOrSearchSampleCriteria.java index cdcd0b8d8a9523248f5133930092143a986ecee6..65152963b7734c3cd7b072a509608dc7f13d24ea 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListOrSearchSampleCriteria.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListOrSearchSampleCriteria.java @@ -48,6 +48,8 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria private final String[] permIds; + private final boolean searchForContainerSamplesOnly; + private boolean enrichDependentSamplesWithProperties = false; /** Creates criteria that delegates to given {@link ListSampleCriteria}. */ @@ -57,6 +59,7 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria this.listCriteria = listCriteria; this.sampleCodes = null; this.permIds = null; + this.searchForContainerSamplesOnly = false; } /** Creates criteria that delegates to given {@link TrackingSampleCriteria}. */ @@ -66,6 +69,7 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria this.newTrackingCriteria = newTrackingCriteria; this.sampleCodes = null; this.permIds = null; + this.searchForContainerSamplesOnly = false; } /** Creates criteria for detailed search of samples with given ids. */ @@ -75,19 +79,27 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria this.sampleIds = sampleIds; this.sampleCodes = null; this.permIds = null; + this.searchForContainerSamplesOnly = false; } /** Creates criteria for detailed search of samples with codes. */ public ListOrSearchSampleCriteria(final String[] codes, final boolean codesArePermIds) + { + this(codes, codesArePermIds, false); + } + + /** Creates criteria for detailed search of samples with codes. */ + public ListOrSearchSampleCriteria(String[] codes, boolean codesArePermIds, + boolean searchForContainerSamplesOnly) { // Need to add the type to disambiguate method signatures for erased generic types. assert codes != null; + this.searchForContainerSamplesOnly = searchForContainerSamplesOnly; if (codesArePermIds) { this.sampleCodes = null; this.permIds = codes; - } else { this.sampleCodes = codes; @@ -104,6 +116,7 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria this.sampleCodes = codes; this.permIds = permIds; + this.searchForContainerSamplesOnly = false; } // search @@ -232,4 +245,8 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria this.enrichDependentSamplesWithProperties = enrichDependentSamplesWithProperties; } + public boolean isSearchForContainerSamplesOnly() + { + return searchForContainerSamplesOnly; + } } 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 2690a9f265ab3e803974cdf1d0de7bea3138233b..0848420fe865563ede64e370f07a9e77618237dc 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 @@ -322,7 +322,7 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen // for contained samples add container samples codes codes = SampleRegisterOrUpdateUtil.extractContainerCodes(newSamples); ListOrSearchSampleCriteria criteria = - SampleRegisterOrUpdateUtil.createListSamplesByCodeCriteria(codes); + SampleRegisterOrUpdateUtil.createListContainerSamplesByCodeCriteria(codes); List<Sample> existingContainers = sampleLister.list(criteria); for (Sample s : existingContainers) { 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 a8c450f4c76314ff3de541ff7d1e55510ae94b96..f1f56d39afb7be4881d9b3c6c095043b0b38ebbc 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 @@ -228,8 +228,18 @@ public class SampleRegisterOrUpdateUtil return extractCode(sampleIdentifier.getSampleCode()); } else { - SampleIdentifier parsedContainerIdentifier = SampleIdentifierFactory.parse(containerIdentifier); + SampleIdentifier parsedContainerIdentifier = + SampleIdentifierFactory.parse(containerIdentifier); return extractCode(parsedContainerIdentifier.getSampleCode()); } } + + public static ListOrSearchSampleCriteria createListContainerSamplesByCodeCriteria( + List<String> codes) + { + String[] codesAsArray = codes.toArray(new String[0]); + ListOrSearchSampleCriteria criteria = + new ListOrSearchSampleCriteria(codesAsArray, false, true); + return criteria; + } }