Skip to content
Snippets Groups Projects
Commit 67b372d4 authored by buczekp's avatar buczekp
Browse files

[LMS-1263] added loading dependent samples properties to sample lister;

extended http invoker client test output

SVN: 13440
parent 66cb8ab3
No related branches found
No related tags found
No related merge requests found
...@@ -79,6 +79,8 @@ public final class TrackingServer extends AbstractServer<ITrackingServer> implem ...@@ -79,6 +79,8 @@ public final class TrackingServer extends AbstractServer<ITrackingServer> implem
final Session session = getSession(sessionToken); final Session session = getSession(sessionToken);
final ISampleLister sampleLister = businessObjectFactory.createSampleLister(session); final ISampleLister sampleLister = businessObjectFactory.createSampleLister(session);
return sampleLister.list(new ListOrSearchSampleCriteria(criteria)); final ListOrSearchSampleCriteria listerCriteria = new ListOrSearchSampleCriteria(criteria);
listerCriteria.setEnrichDependentSamplesWithProperties(true);
return sampleLister.list(listerCriteria);
} }
} }
...@@ -169,7 +169,7 @@ public interface ISampleListingQuery extends TransactionQuery, IPropertyListingQ ...@@ -169,7 +169,7 @@ public interface ISampleListingQuery extends TransactionQuery, IPropertyListingQ
@Select(sql = "select s.id, s.perm_id, s.code, s.expe_id, s.grou_id, s.dbin_id, " @Select(sql = "select s.id, s.perm_id, s.code, s.expe_id, s.grou_id, s.dbin_id, "
+ " s.registration_timestamp, s.pers_id_registerer, " + " s.registration_timestamp, s.pers_id_registerer, "
+ " s.samp_id_generated_from, s.samp_id_part_of, s.saty_id, s.inva_id " + " s.samp_id_generated_from, s.samp_id_part_of, s.saty_id, s.inva_id "
+ " from samples s where s.saty_id=?{1} and s.id > ?{2} order by s.code", fetchSize = FETCH_SIZE) + " from samples s where s.saty_id=?{1} and s.id > ?{2}", fetchSize = FETCH_SIZE)
public DataIterator<SampleRecord> getNewSamplesForSampleType(long sampleTypeId, public DataIterator<SampleRecord> getNewSamplesForSampleType(long sampleTypeId,
int lastSeenSampleId); int lastSeenSampleId);
......
...@@ -217,8 +217,35 @@ final class SampleListingWorker ...@@ -217,8 +217,35 @@ final class SampleListingWorker
watch.start(); watch.start();
} }
// Only enrich the "primary" samples (matching the criteria) with properties, not if (criteria.isEnrichDependentSamplesWithProperties() == false)
// dependent samples. {
// only 'primary' samples were retrieved up to this point
enrichRetrievedSamplesWithProperties(watch);
}
retrieveDependentSamplesRecursively();
resolveParents();
resolveContainers();
if (criteria.isEnrichDependentSamplesWithProperties())
{
// dependent samples will also be enriched
enrichRetrievedSamplesWithProperties(watch);
}
return sampleList;
}
//
// Private worker methods
//
private void enrichRetrievedSamplesWithProperties(StopWatch watch)
{
// Initialize property collections of all samples retrieved up to this point
// (without this enricher will not work properly).
for (Sample sample : sampleMap.values())
{
sample.setProperties(new ArrayList<IEntityProperty>());
}
if (samplePropertiesEnricherOrNull != null) if (samplePropertiesEnricherOrNull != null)
{ {
samplePropertiesEnricherOrNull.enrich(sampleMap.keySet(), samplePropertiesEnricherOrNull.enrich(sampleMap.keySet(),
...@@ -236,18 +263,8 @@ final class SampleListingWorker ...@@ -236,18 +263,8 @@ final class SampleListingWorker
.toString())); .toString()));
} }
} }
retrieveDependentSamplesRecursively();
resolveParents();
resolveContainers();
return sampleList;
} }
//
// Private worker methods
//
private void loadGroups() private void loadGroups()
{ {
// all groups are needed for parent samples identifiers // all groups are needed for parent samples identifiers
...@@ -394,6 +411,9 @@ final class SampleListingWorker ...@@ -394,6 +411,9 @@ final class SampleListingWorker
{ {
return null; return null;
} }
// uncomment if we want all dependent samples to be loaded
// maxSampleContainerResolutionDepth = Integer.MAX_VALUE;
// maxSampleParentResolutionDepth = Integer.MAX_VALUE;
Long sampleTypeId = Long sampleTypeId =
referencedEntityDAO.getSampleTypeIdForSampleTypeCode(criteria.getSampleTypeCode()); referencedEntityDAO.getSampleTypeIdForSampleTypeCode(criteria.getSampleTypeCode());
return query.getNewSamplesForSampleType(sampleTypeId, criteria.getLastSeenSampleId()); return query.getNewSamplesForSampleType(sampleTypeId, criteria.getLastSeenSampleId());
...@@ -471,7 +491,6 @@ final class SampleListingWorker ...@@ -471,7 +491,6 @@ final class SampleListingWorker
sample.setPermlink(PermlinkUtilities.createPermlinkURL(baseIndexURLOrNull, sample.setPermlink(PermlinkUtilities.createPermlinkURL(baseIndexURLOrNull,
EntityKind.SAMPLE, row.perm_id)); EntityKind.SAMPLE, row.perm_id));
sample.setRegistrationDate(row.registration_timestamp); sample.setRegistrationDate(row.registration_timestamp);
sample.setProperties(new ArrayList<IEntityProperty>());
if (row.inva_id != null) if (row.inva_id != null)
{ {
final Invalidation invalidation = new Invalidation(); final Invalidation invalidation = new Invalidation();
......
...@@ -21,10 +21,15 @@ import java.util.Collection; ...@@ -21,10 +21,15 @@ import java.util.Collection;
import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
/** /**
* Extended {@link ListSampleCriteria} with 4th filter option for detailed sample search and 5th * Extended {@link ListSampleCriteria} with 2 new filter options:
* option for tracking samples.<br> * <ul>
* <li>detailed sample search
* <li>tracking new samples of particular type
* </ul>
* Additionally one can decide if dependent samples that are loaded (parents and containers) should
* be enriched with properties. By default only 'primary' samples are enriched.<br>
* <br> * <br>
* NOTE: not serializable * NOTE: This bean is not serializable.
* *
* @author Piotr Buczek * @author Piotr Buczek
*/ */
...@@ -38,6 +43,8 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria ...@@ -38,6 +43,8 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria
private Collection<Long> sampleIds; private Collection<Long> sampleIds;
private boolean enrichDependentSamplesWithProperties = false;
/** Creates criteria that delegates to given {@link ListSampleCriteria}. */ /** Creates criteria that delegates to given {@link ListSampleCriteria}. */
public ListOrSearchSampleCriteria(ListSampleCriteria listCriteria) public ListOrSearchSampleCriteria(ListSampleCriteria listCriteria)
{ {
...@@ -122,4 +129,14 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria ...@@ -122,4 +129,14 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria
return listCriteria == null ? false : listCriteria.isIncludeInstance(); return listCriteria == null ? false : listCriteria.isIncludeInstance();
} }
public boolean isEnrichDependentSamplesWithProperties()
{
return enrichDependentSamplesWithProperties;
}
public void setEnrichDependentSamplesWithProperties(boolean enrichDependentSamplesWithProperties)
{
this.enrichDependentSamplesWithProperties = enrichDependentSamplesWithProperties;
}
} }
...@@ -24,10 +24,12 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; ...@@ -24,10 +24,12 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
/** /**
* Criteria for listing <i>samples</i>. This class offers 3 kinds of filters, but only one can be * Criteria for listing <i>samples</i>. This class offers 3 kinds of filters, but only one can be
* used at the same time: <br> * used at the same time:
* filter 1: samples of particular type in a specified group and/or shared <br> * <ol>
* filter 2: samples belonging to a container sample<br> * <li>samples of particular type in a specified group and/or shared
* filter 3: samples from the experiment<br> * <li>samples belonging to a container sample
* <li>samples from the experiment
* </ol>
* *
* @author Izabela Adamczyk * @author Izabela Adamczyk
* @author Tomasz Pylak * @author Tomasz Pylak
...@@ -36,7 +38,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; ...@@ -36,7 +38,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
public class ListSampleCriteria implements IsSerializable, Serializable public class ListSampleCriteria implements IsSerializable, Serializable
{ {
private static final long serialVersionUID = ServiceVersionHolder.VERSION; private static final long serialVersionUID = ServiceVersionHolder.VERSION;
// --------- filter 1 fields // --------- filter 1 fields
private SampleType sampleType; private SampleType sampleType;
......
...@@ -4,6 +4,8 @@ import java.util.ArrayList; ...@@ -4,6 +4,8 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import ch.systemsx.cisd.common.spring.HttpInvokerUtils; import ch.systemsx.cisd.common.spring.HttpInvokerUtils;
import ch.systemsx.cisd.openbis.generic.shared.ICommonServer; import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
...@@ -12,6 +14,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder; ...@@ -12,6 +14,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; 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.Person; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
...@@ -107,30 +110,110 @@ public class OpenbisClientTest ...@@ -107,30 +110,110 @@ public class OpenbisClientTest
new TrackingSampleCriteria(sampleTypeCode, lastSeenSampleId); new TrackingSampleCriteria(sampleTypeCode, lastSeenSampleId);
final List<Sample> samples = final List<Sample> samples =
trackingServer.listSamples(session.getSessionToken(), sampleCriteria); trackingServer.listSamples(session.getSessionToken(), sampleCriteria);
outputFoundEntities(samples, EntityKind.SAMPLE); System.out.println(TrackingHelper.trackedEntitiesInformation(samples, EntityKind.SAMPLE));
final TrackingDataSetCriteria dataSetCriteria = final TrackingDataSetCriteria dataSetCriteria =
new TrackingDataSetCriteria(sampleTypeCode, lastSeenDataSetId); new TrackingDataSetCriteria(sampleTypeCode, lastSeenDataSetId);
final List<ExternalData> dataSets = final List<ExternalData> dataSets =
trackingServer.listDataSets(session.getSessionToken(), dataSetCriteria); trackingServer.listDataSets(session.getSessionToken(), dataSetCriteria);
outputFoundEntities(dataSets, EntityKind.DATA_SET); System.out
.println(TrackingHelper.trackedEntitiesInformation(dataSets, EntityKind.DATA_SET));
} }
private static void outputFoundEntities(List<? extends IEntityInformationHolder> entities, /**
EntityKind entityKind) * Helper class encapsulating methods used for producing readable information about entities
* returned by {@link ITrackingServer} methods.
*
* @author Piotr Buczek
*/
private static class TrackingHelper
{ {
if (entities == null || entities.size() == 0)
private static final String INDENT = " ";
private static String trackedEntitiesInformation(
List<? extends IEntityInformationHolder> entities, EntityKind entityKind)
{ {
System.out.println(String.format("No %ss found.", entityKind.getDescription())); if (entities == null || entities.size() == 0)
} else {
return String.format("\nNo %ss tracked.", entityKind.getDescription());
} else
{
List<String> entityInfo = new ArrayList<String>(entities.size());
for (IEntityInformationHolder entity : entities)
{
entityInfo.add(toString(entity));
}
return String.format("\nTracked %d %s(s): \n%s", entityInfo.size(), entityKind
.getDescription(), StringUtils.join(entityInfo, "\n"));
}
}
private static String toString(IEntityInformationHolder entity)
{ {
List<String> codes = new ArrayList<String>(entities.size()); switch (entity.getEntityKind())
for (IEntityInformationHolder entity : entities)
{ {
codes.add(entity.getCode()); case SAMPLE:
return toString((Sample) entity);
case DATA_SET:
return toString((ExternalData) entity);
default:
throw new IllegalArgumentException(entity.getEntityKind()
+ " is not supported ");
} }
System.out.println(String.format("Found %d %ss: %s", codes.size(), entityKind }
.getDescription(), StringUtils.join(codes, ", ")));
private static String toString(Sample sample)
{
return toString(sample, INDENT);
}
private static String toString(Sample sample, String indent)
{
final StringBuilder sb = new StringBuilder();
ToStringBuilder builder = new ToStringBuilder(sample, ToStringStyle.SHORT_PREFIX_STYLE);
builder.append("id", sample.getId());
builder.append(" code", sample.getCode());
builder.append(" identifier", sample.getIdentifier());
builder.append(" type", sample.getSampleType());
builder.append(" properties", toString(sample.getProperties()));
sb.append(builder.toString());
final String newIndent = indent + INDENT;
if (sample.getContainer() != null)
{
sb.append("\n" + indent + "container");
sb.append(toString(sample.getContainer(), newIndent));
}
if (sample.getGeneratedFrom() != null)
{
sb.append("\n" + indent + "parent");
sb.append(toString(sample.getGeneratedFrom(), newIndent));
}
return sb.toString();
}
private static String toString(ExternalData dataSet)
{
final StringBuilder sb = new StringBuilder();
ToStringBuilder builder =
new ToStringBuilder(dataSet, ToStringStyle.SHORT_PREFIX_STYLE);
builder.append("id", dataSet.getId());
builder.append(" code", dataSet.getCode());
builder.append(" type", dataSet.getDataSetType());
builder.append(" properties", toString(dataSet.getProperties()));
sb.append(builder.toString());
final String indent = INDENT;
if (dataSet.getSample() != null)
{
sb.append("\n" + indent + toString(dataSet.getSample()));
}
return sb.toString();
}
private static String toString(List<IEntityProperty> properties)
{
// output just collection size or null if initialized
return properties == null ? null : new Integer(properties.size()).toString();
} }
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment