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 5d6ae02fa9ba108e0073ded060d7600fc4aa9225..ca7fb9bfb49c42757f9b7c3463ed21a8fe65fffc 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 @@ -231,9 +231,10 @@ public interface ISampleListingQuery extends TransactionQuery, IPropertyListingQ */ @Select(sql = SELECT_FROM_SAMPLES_S + " WHERE s.id IN " + " (SELECT sample_id_parent FROM sample_relationships " - + " WHERE relationship_id=?{1} AND sample_id_child=?{2})", fetchSize = FETCH_SIZE) - public DataIterator<SampleRecord> getParentSamplesForChild(long relationshipId, - long sampleChildId); + + " WHERE relationship_id=?{1} AND sample_id_child = any(?{2}))", parameterBindings = + { TypeMapper.class, LongSetMapper.class }, fetchSize = FETCH_SIZE) + public DataIterator<SampleRecord> getParentSamplesForChildren(long relationshipId, + LongSet sampleChildIds); // // New samples of type 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 43e876b967f305e111e5fa90495015921e37072f..64ddd692da6aff30e5b49feb5a26ed41c03830fe 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 @@ -471,12 +471,8 @@ final class SampleListingWorker extends AbstractLister private Iterable<SampleRecord> tryGetIteratorForParentSamples() { - final TechId childTechId = criteria.getChildSampleId(); - if (childTechId == null) - { - return null; - } - return query.getParentSamplesForChild(parentRelationhipTypeId, childTechId.getId()); + Collection<Long> ids = criteria.getChildrenSampleIds(); + return query.getParentSamplesForChildren(parentRelationhipTypeId, new LongOpenHashSet(ids)); } private Iterable<SampleRecord> tryGetIteratorForSharedSamples() 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 76e20600337e7a6d350e05cd4d41b568750d3a85..32e25a3d3aa535f94f01c8a9ffd24be959fe1832 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 @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto; import java.util.Collection; +import java.util.Collections; import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; @@ -165,6 +166,29 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria return listCriteria == null ? null : listCriteria.getChildSampleId(); } + @Override + public Collection<Long> getChildrenSampleIds() + { + if (listCriteria == null) + { + return null; + } + Collection<Long> childrenSampleIds = listCriteria.getChildrenSampleIds(); + if (childrenSampleIds != null) + { + return childrenSampleIds; + } + TechId childSampleId = listCriteria.getChildSampleId(); + if (childSampleId == null) + { + return Collections.<Long>emptySet(); + } + else + { + return Collections.<Long>singleton(childSampleId.getId()); + } + } + @Override public TechId getExperimentId() { @@ -210,4 +234,5 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria { this.enrichDependentSamplesWithProperties = enrichDependentSamplesWithProperties; } + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListSampleCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListSampleCriteria.java index a40364ce7ba69571c2cc5f2ec921286462bff144..19848e236d9e928a5bd86b0f70b70646442243c9 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListSampleCriteria.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListSampleCriteria.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto; import java.io.Serializable; +import java.util.Collection; import com.google.gwt.user.client.rpc.IsSerializable; @@ -63,6 +64,8 @@ public class ListSampleCriteria implements IsSerializable, Serializable // --------- filter 5 fields private TechId experimentId; + + private Collection<Long> childrenSampleIds; // ---- @@ -87,6 +90,13 @@ public class ListSampleCriteria implements IsSerializable, Serializable return criteria; } + public static ListSampleCriteria createForChildren(final Collection<Long> childrenSampleIds) + { + final ListSampleCriteria criteria = new ListSampleCriteria(); + criteria.setChildrenSampleIds(childrenSampleIds); + return criteria; + } + public static ListSampleCriteria createForExperiment(final TechId experimentId) { final ListSampleCriteria criteria = new ListSampleCriteria(); @@ -124,6 +134,16 @@ public class ListSampleCriteria implements IsSerializable, Serializable this.childSampleId = childSampleId; } + public Collection<Long> getChildrenSampleIds() + { + return childrenSampleIds; + } + + public final void setChildrenSampleIds(Collection<Long> childrenSampleIds) + { + this.childrenSampleIds = childrenSampleIds; + } + public SampleType getSampleType() { return sampleType;