Skip to content
Snippets Groups Projects
Commit 5159a214 authored by brinn's avatar brinn
Browse files

fix: loading the feature vector dataset references if a feature vector dataset...

fix: loading the feature vector dataset references if a feature vector dataset is connected through both, the sample and the parent data set, who in turn is also is connected to the sample
change: use home space if the space code is set to "" in the plate (while null denotes a shared sample)

SVN: 17199
parent 8c67bbc6
No related branches found
No related tags found
No related merge requests found
...@@ -42,5 +42,6 @@ ...@@ -42,5 +42,6 @@
<classpathentry kind="lib" path="/libraries/jhdf5/cisd-jhdf5-batteries_included_lin_win_mac.jar"/> <classpathentry kind="lib" path="/libraries/jhdf5/cisd-jhdf5-batteries_included_lin_win_mac.jar"/>
<classpathentry kind="lib" path="/libraries/hdf5"/> <classpathentry kind="lib" path="/libraries/hdf5"/>
<classpathentry kind="lib" path="/libraries/nativedata"/> <classpathentry kind="lib" path="/libraries/nativedata"/>
<classpathentry kind="lib" path="/libraries/fastutil/fastutil.jar" sourcepath="/libraries/fastutil/fastutil-src.zip"/>
<classpathentry kind="output" path="targets/www/WEB-INF/classes"/> <classpathentry kind="output" path="targets/www/WEB-INF/classes"/>
</classpath> </classpath>
...@@ -16,7 +16,12 @@ ...@@ -16,7 +16,12 @@
package ch.systemsx.cisd.openbis.plugin.screening.server.logic; package ch.systemsx.cisd.openbis.plugin.screening.server.logic;
import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap;
import it.unimi.dsi.fastutil.longs.Long2ObjectSortedMap;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List; import java.util.List;
import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister; import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister;
...@@ -44,7 +49,7 @@ class FeatureVectorDatasetLoader extends ImageDatasetLoader ...@@ -44,7 +49,7 @@ class FeatureVectorDatasetLoader extends ImageDatasetLoader
FeatureVectorDatasetLoader(Session session, FeatureVectorDatasetLoader(Session session,
IScreeningBusinessObjectFactory businessObjectFactory, String dataStoreBaseURL, IScreeningBusinessObjectFactory businessObjectFactory, String dataStoreBaseURL,
List<? extends PlateIdentifier> plates) Collection<? extends PlateIdentifier> plates)
{ {
super(session, businessObjectFactory, dataStoreBaseURL, plates, super(session, businessObjectFactory, dataStoreBaseURL, plates,
ScreeningConstants.IMAGE_DATASET_TYPE, ScreeningConstants.IMAGE_DATASET_TYPE,
...@@ -62,10 +67,8 @@ class FeatureVectorDatasetLoader extends ImageDatasetLoader ...@@ -62,10 +67,8 @@ class FeatureVectorDatasetLoader extends ImageDatasetLoader
private void loadFeatureVectorDatasets() private void loadFeatureVectorDatasets()
{ {
// TODO 2010-05-26, CR, : This is slow if there are a large number of image data sets final Long2ObjectSortedMap<ExternalData> featureVectorDatasetSet =
// Need to add a query to the dataset lister that returns, for a collection of tech ids, a new Long2ObjectLinkedOpenHashMap<ExternalData>();
// child datasets and their parents.
featureVectorDatasets = new ArrayList<ExternalData>();
IDatasetLister datasetLister = IDatasetLister datasetLister =
businessObjectFactory.createDatasetLister(session, dataStoreBaseURL); businessObjectFactory.createDatasetLister(session, dataStoreBaseURL);
...@@ -73,23 +76,33 @@ class FeatureVectorDatasetLoader extends ImageDatasetLoader ...@@ -73,23 +76,33 @@ class FeatureVectorDatasetLoader extends ImageDatasetLoader
{ {
if (ScreeningUtils.isTypeEqual(data, ScreeningConstants.IMAGE_ANALYSIS_DATASET_TYPE)) if (ScreeningUtils.isTypeEqual(data, ScreeningConstants.IMAGE_ANALYSIS_DATASET_TYPE))
{ {
featureVectorDatasets.add(data); featureVectorDatasetSet.put(data.getId(), data);
} else }
}
// Implementation note: some data sets in this loop may overwrite data from the first loop.
// This is intended as we want to keep the parent relationship of the feature vector data
// sets, if they exist.
for (ExternalData data : getDatasets())
{
if (ScreeningUtils.isTypeEqual(data, ScreeningConstants.IMAGE_DATASET_TYPE))
{ {
List<ExternalData> children = // TODO 2010-05-26, CR, : This way to access the database one by one is slow if
// there are a large number of image data sets
// Need to add a query to the dataset lister that returns, for a collection of tech
// ids, a child datasets and their parents.
final List<ExternalData> children =
datasetLister.listByParentTechId(new TechId(data.getId())); datasetLister.listByParentTechId(new TechId(data.getId()));
ArrayList<ExternalData> parentList = new ArrayList<ExternalData>();
parentList.add(data);
for (ExternalData child : children) for (ExternalData child : children)
{ {
child.setParents(parentList); child.setParents(Collections.singleton(data));
featureVectorDatasetSet.put(child.getId(), child);
} }
featureVectorDatasets.addAll(children);
} }
} }
featureVectorDatasets = featureVectorDatasets =
ScreeningUtils.filterExternalDataByType(featureVectorDatasets, ScreeningUtils.filterExternalDataByType(featureVectorDatasetSet.values(),
featureVectorDatasetTypeCode); featureVectorDatasetTypeCode);
} }
...@@ -106,22 +119,21 @@ class FeatureVectorDatasetLoader extends ImageDatasetLoader ...@@ -106,22 +119,21 @@ class FeatureVectorDatasetLoader extends ImageDatasetLoader
protected FeatureVectorDatasetReference asFeatureVectorDataset(ExternalData externalData) protected FeatureVectorDatasetReference asFeatureVectorDataset(ExternalData externalData)
{ {
DataStore dataStore = externalData.getDataStore(); DataStore dataStore = externalData.getDataStore();
if (externalData.getParents() == null || externalData.getParents().size() == 0) if (externalData.getParents() == null || externalData.getParents().isEmpty())
{ {
return new FeatureVectorDatasetReference(externalData.getCode(), return new FeatureVectorDatasetReference(externalData.getCode(),
getDataStoreUrlFromDataStore(dataStore), createPlateIdentifier(externalData), getDataStoreUrlFromDataStore(dataStore), createPlateIdentifier(externalData),
extractPlateGeometry(externalData), externalData.getRegistrationDate(), extractPlateGeometry(externalData), externalData.getRegistrationDate(), null);
null);
} else } else
{ {
// Note: this only works reliably because this class sets the parents of the feature // Note: this only works reliably because this class sets the parents of the feature
// vector data sets itself and sets it to a list with exactly one entry! // vector data sets itself and sets it to a list with exactly one entry!
// (see loadFeatureVectorDatasets() above) // (see loadFeatureVectorDatasets() above)
final ExternalData parentDataset = externalData.getParents().iterator().next(); final ExternalData parentDataset = externalData.getParents().iterator().next();
return new FeatureVectorDatasetReference(externalData.getCode(), return new FeatureVectorDatasetReference(externalData.getCode(),
getDataStoreUrlFromDataStore(dataStore), createPlateIdentifier(parentDataset), getDataStoreUrlFromDataStore(dataStore), createPlateIdentifier(parentDataset),
extractPlateGeometry(parentDataset), externalData.getRegistrationDate(), extractPlateGeometry(parentDataset), externalData.getRegistrationDate(),
asImageDataset(parentDataset)); asImageDataset(parentDataset));
} }
} }
} }
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
package ch.systemsx.cisd.openbis.plugin.screening.server.logic; package ch.systemsx.cisd.openbis.plugin.screening.server.logic;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
...@@ -37,7 +38,7 @@ class ImageDatasetLoader extends PlateDatasetLoader ...@@ -37,7 +38,7 @@ class ImageDatasetLoader extends PlateDatasetLoader
// TODO 2010-05-27, CR : See PlateDatasetLoader todo comment // TODO 2010-05-27, CR : See PlateDatasetLoader todo comment
ImageDatasetLoader(Session session, IScreeningBusinessObjectFactory businessObjectFactory, ImageDatasetLoader(Session session, IScreeningBusinessObjectFactory businessObjectFactory,
String dataStoreBaseURL, List<? extends PlateIdentifier> plates, String dataStoreBaseURL, Collection<? extends PlateIdentifier> plates,
String... datasetTypeCodes) String... datasetTypeCodes)
{ {
super(session, businessObjectFactory, dataStoreBaseURL, plates, super(session, businessObjectFactory, dataStoreBaseURL, plates,
...@@ -51,15 +52,18 @@ class ImageDatasetLoader extends PlateDatasetLoader ...@@ -51,15 +52,18 @@ class ImageDatasetLoader extends PlateDatasetLoader
public List<ImageDatasetReference> getImageDatasets() public List<ImageDatasetReference> getImageDatasets()
{ {
load(); load();
return asImageDatasets(); return filterImageDatasets();
} }
private List<ImageDatasetReference> asImageDatasets() private List<ImageDatasetReference> filterImageDatasets()
{ {
List<ImageDatasetReference> result = new ArrayList<ImageDatasetReference>(); List<ImageDatasetReference> result = new ArrayList<ImageDatasetReference>();
for (ExternalData externalData : getDatasets()) for (ExternalData externalData : getDatasets())
{ {
result.add(asImageDataset(externalData)); if (ScreeningUtils.isTypeEqual(externalData, ScreeningConstants.IMAGE_DATASET_TYPE))
{
result.add(asImageDataset(externalData));
}
} }
return result; return result;
} }
......
...@@ -3,9 +3,12 @@ package ch.systemsx.cisd.openbis.plugin.screening.server.logic; ...@@ -3,9 +3,12 @@ package ch.systemsx.cisd.openbis.plugin.screening.server.logic;
import static ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME; import static ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import org.apache.commons.lang.StringUtils;
import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.common.exceptions.UserFailureException;
import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister; import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister;
import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.ISampleLister; import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.ISampleLister;
...@@ -44,7 +47,7 @@ class PlateDatasetLoader ...@@ -44,7 +47,7 @@ class PlateDatasetLoader
protected final String dataStoreBaseURL; protected final String dataStoreBaseURL;
// Parameter state // Parameter state
private final List<? extends PlateIdentifier> plates; private final Collection<? extends PlateIdentifier> plates;
private final String[] datasetTypeCodes; private final String[] datasetTypeCodes;
...@@ -58,7 +61,7 @@ class PlateDatasetLoader ...@@ -58,7 +61,7 @@ class PlateDatasetLoader
private HashMap<Long, Sample> samplesById; private HashMap<Long, Sample> samplesById;
PlateDatasetLoader(Session session, IScreeningBusinessObjectFactory businessObjectFactory, PlateDatasetLoader(Session session, IScreeningBusinessObjectFactory businessObjectFactory,
String dataStoreBaseURL, List<? extends PlateIdentifier> plates, String dataStoreBaseURL, Collection<? extends PlateIdentifier> plates,
String... datasetTypeCodes) String... datasetTypeCodes)
{ {
this.session = session; this.session = session;
...@@ -122,7 +125,9 @@ class PlateDatasetLoader ...@@ -122,7 +125,9 @@ class PlateDatasetLoader
{ {
for (PlateIdentifier plate : plates) for (PlateIdentifier plate : plates)
{ {
Sample sample = samplesByIdentifier.get(createSampleIdentifier(plate)); Sample sample =
samplesByIdentifier.get(createSampleIdentifier(plate, session
.tryGetHomeGroupCode()));
// Make sure the sample and plate have the same *identifier* not just code // Make sure the sample and plate have the same *identifier* not just code
String plateSpaceCodeOrNull = plate.tryGetSpaceCode(); String plateSpaceCodeOrNull = plate.tryGetSpaceCode();
Space sampleSpaceOrNull = sample.getSpace(); Space sampleSpaceOrNull = sample.getSpace();
...@@ -180,7 +185,7 @@ class PlateDatasetLoader ...@@ -180,7 +185,7 @@ class PlateDatasetLoader
} }
} }
throw new UserFailureException("Sample " + sample.getIdentifier() + " has no property " throw new UserFailureException("Sample '" + sample.getIdentifier() + "' has no property "
+ ScreeningConstants.PLATE_GEOMETRY); + ScreeningConstants.PLATE_GEOMETRY);
} }
...@@ -210,7 +215,7 @@ class PlateDatasetLoader ...@@ -210,7 +215,7 @@ class PlateDatasetLoader
private List<Long> extractSampleIds() private List<Long> extractSampleIds()
{ {
ArrayList<Long> sampleIds = new ArrayList<Long>(); ArrayList<Long> sampleIds = new ArrayList<Long>(samples.size());
for (Sample sample : samples) for (Sample sample : samples)
{ {
sampleIds.add(sample.getId()); sampleIds.add(sample.getId());
...@@ -237,17 +242,31 @@ class PlateDatasetLoader ...@@ -237,17 +242,31 @@ class PlateDatasetLoader
return datastoreUrl; return datastoreUrl;
} }
protected static SampleIdentifier createSampleIdentifier(PlateIdentifier plate) protected static SampleIdentifier createSampleIdentifier(PlateIdentifier plate,
String homeSpaceCodeOrNull)
{ {
SampleOwnerIdentifier owner; SampleOwnerIdentifier owner;
String spaceCode = plate.tryGetSpaceCode(); String spaceCode = plate.tryGetSpaceCode();
if (spaceCode != null) if (StringUtils.isNotBlank(spaceCode))
{ {
SpaceIdentifier space = new SpaceIdentifier(DatabaseInstanceIdentifier.HOME, spaceCode); final SpaceIdentifier space =
new SpaceIdentifier(DatabaseInstanceIdentifier.HOME, spaceCode);
owner = new SampleOwnerIdentifier(space); owner = new SampleOwnerIdentifier(space);
} else } else
{ {
owner = new SampleOwnerIdentifier(DatabaseInstanceIdentifier.createHome()); if (spaceCode == null)
{
owner = new SampleOwnerIdentifier(DatabaseInstanceIdentifier.createHome());
} else
{
if (homeSpaceCodeOrNull == null)
{
throw new UserFailureException("No space given and user has no home space.");
}
final SpaceIdentifier space =
new SpaceIdentifier(DatabaseInstanceIdentifier.HOME, homeSpaceCodeOrNull);
owner = new SampleOwnerIdentifier(space);
}
} }
return SampleIdentifier.createOwnedBy(owner, plate.getPlateCode()); return SampleIdentifier.createOwnedBy(owner, plate.getPlateCode());
} }
......
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