From 4fcf7352331d37415081a6eb5bc06c2f7f2fbb2c Mon Sep 17 00:00:00 2001
From: tpylak <tpylak>
Date: Tue, 1 Sep 2009 07:38:18 +0000
Subject: [PATCH] LMS-1119 dataset lister: sql bugfixes, fetch dataset
 properties, rename IEntitySetPropertyListingQuery ->
 IEntityPropertySetListingQuery

SVN: 12341
---
 .../grid/entity/PropertyTypesFilterUtil.java  |  4 +-
 .../server/CommonBusinessObjectFactory.java   |  7 +-
 .../bo/common/EntityPropertiesEnricher.java   |  4 +-
 ...va => IEntityPropertySetListingQuery.java} |  2 +-
 .../PropertiesSetListingQueryFallback.java    |  8 +-
 ...ropertiesSetListingQueryFullTableScan.java |  2 +-
 .../PropertiesSetListingQueryOneByOne.java    | 16 ++--
 .../bo/datasetlister/DatasetLister.java       | 89 ++++++++++++++++++-
 .../bo/datasetlister/DatasetListerDAO.java    | 17 ++--
 .../IDatasetListingFullQuery.java             |  2 +-
 .../datasetlister/IDatasetListingQuery.java   |  7 +-
 .../bo/samplelister/SampleListerDAO.java      | 19 ++--
 .../samplelister/SampleListingQueryTest.java  |  2 +-
 .../SampleSetListingQueryTest.java            |  6 +-
 14 files changed, 134 insertions(+), 51 deletions(-)
 rename openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/{IEntitySetPropertyListingQuery.java => IEntityPropertySetListingQuery.java} (97%)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/entity/PropertyTypesFilterUtil.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/entity/PropertyTypesFilterUtil.java
index f17d4c2c126..824418692cd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/entity/PropertyTypesFilterUtil.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/entity/PropertyTypesFilterUtil.java
@@ -80,7 +80,7 @@ public class PropertyTypesFilterUtil
             Set<BasicEntityType> entityTypes)
     {
         Set<String> entityTypesCodes = extractCodes(entityTypes);
-        List<PropertyType> result = new ArrayList<PropertyType>();
+        Set<PropertyType> result = new HashSet<PropertyType>();
         for (final PropertyType propertyType : propertyTypes)
         {
             List<? extends EntityTypePropertyType<?>> assignments =
@@ -95,7 +95,7 @@ public class PropertyTypesFilterUtil
                 }
             }
         }
-        return result;
+        return new ArrayList<PropertyType>(result);
     }
 
     private static Set<String> extractCodes(Set<BasicEntityType> entityTypes)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonBusinessObjectFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonBusinessObjectFactory.java
index c7f48105cc9..202f6cb728b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonBusinessObjectFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonBusinessObjectFactory.java
@@ -75,14 +75,15 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 public final class CommonBusinessObjectFactory extends AbstractBusinessObjectFactory implements
         ICommonBusinessObjectFactory
 {
-    private SampleListerDAO sampleListerDAO;
+    private final SampleListerDAO sampleListerDAO;
 
-    private DatasetListerDAO datasetListerDAO;
+    private final DatasetListerDAO datasetListerDAO;
 
     public CommonBusinessObjectFactory(IDAOFactory daoFactory, IDataStoreServiceFactory dssFactory)
     {
         super(daoFactory, dssFactory);
-        sampleListerDAO = SampleListerDAO.createDAO(daoFactory);
+        this.sampleListerDAO = SampleListerDAO.create(daoFactory);
+        this.datasetListerDAO = DatasetListerDAO.create(daoFactory);
     }
 
     public final IAttachmentBO createAttachmentBO(final Session session)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/EntityPropertiesEnricher.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/EntityPropertiesEnricher.java
index 881310b099a..29615d730d5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/EntityPropertiesEnricher.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/EntityPropertiesEnricher.java
@@ -42,10 +42,10 @@ public final class EntityPropertiesEnricher implements IEntityPropertiesEnricher
 {
     private final IPropertyListingQuery query;
 
-    private final IEntitySetPropertyListingQuery setQuery;
+    private final IEntityPropertySetListingQuery setQuery;
 
     public EntityPropertiesEnricher(final IPropertyListingQuery query,
-            final IEntitySetPropertyListingQuery setQuery)
+            final IEntityPropertySetListingQuery setQuery)
     {
         this.query = query;
         this.setQuery = setQuery;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/IEntitySetPropertyListingQuery.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/IEntityPropertySetListingQuery.java
similarity index 97%
rename from openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/IEntitySetPropertyListingQuery.java
rename to openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/IEntityPropertySetListingQuery.java
index 4cfeaa263b5..f2a18f40a5e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/IEntitySetPropertyListingQuery.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/IEntityPropertySetListingQuery.java
@@ -23,7 +23,7 @@ import it.unimi.dsi.fastutil.longs.LongSet;
  *
  * @author Franz-Josef Elmer
  */
-public interface IEntitySetPropertyListingQuery
+public interface IEntityPropertySetListingQuery
 {
 
     /**
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/PropertiesSetListingQueryFallback.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/PropertiesSetListingQueryFallback.java
index 966d7069ab8..b6024d940e3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/PropertiesSetListingQueryFallback.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/PropertiesSetListingQueryFallback.java
@@ -21,17 +21,17 @@ import it.unimi.dsi.fastutil.longs.LongSet;
 import ch.rinn.restrictions.Friend;
 
 /**
- * A fallback implementation of {@link IEntitySetPropertyListingQuery} for database engines who
+ * A fallback implementation of {@link IEntityPropertySetListingQuery} for database engines who
  * don't support querying for identifier sets.
  * 
  * @author Bernd Rinn
  */
 @Friend(toClasses = IEntityPropertyListingQuery.class)
-public class PropertiesSetListingQueryFallback implements IEntitySetPropertyListingQuery
+public class PropertiesSetListingQueryFallback implements IEntityPropertySetListingQuery
 {
-    private final IEntitySetPropertyListingQuery oneByOneDelegate;
+    private final IEntityPropertySetListingQuery oneByOneDelegate;
 
-    private final IEntitySetPropertyListingQuery fullTableScanDelegate;
+    private final IEntityPropertySetListingQuery fullTableScanDelegate;
 
     private final QueryStrategyChooser strategyChooser;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/PropertiesSetListingQueryFullTableScan.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/PropertiesSetListingQueryFullTableScan.java
index 689ce89356b..42cf4988650 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/PropertiesSetListingQueryFullTableScan.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/PropertiesSetListingQueryFullTableScan.java
@@ -35,7 +35,7 @@ import ch.rinn.restrictions.Friend;
  */
 @Friend(toClasses =
     { IEntityPropertyListingQuery.class })
-class PropertiesSetListingQueryFullTableScan implements IEntitySetPropertyListingQuery
+class PropertiesSetListingQueryFullTableScan implements IEntityPropertySetListingQuery
 {
     private final IEntityPropertyListingQuery query;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/PropertiesSetListingQueryOneByOne.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/PropertiesSetListingQueryOneByOne.java
index 3f42f348f8a..1d0e03fb19e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/PropertiesSetListingQueryOneByOne.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/PropertiesSetListingQueryOneByOne.java
@@ -16,26 +16,24 @@
 
 package ch.systemsx.cisd.openbis.generic.server.business.bo.common;
 
+import it.unimi.dsi.fastutil.longs.LongIterator;
+import it.unimi.dsi.fastutil.longs.LongSet;
+
 import java.util.Iterator;
 
 import net.lemnik.eodsql.DataIterator;
 
-import it.unimi.dsi.fastutil.longs.LongIterator;
-import it.unimi.dsi.fastutil.longs.LongSet;
-
 import ch.rinn.restrictions.Friend;
-import ch.systemsx.cisd.openbis.generic.server.business.bo.common.VocabularyTermRecord;
-import ch.systemsx.cisd.openbis.generic.server.business.bo.common.GenericEntityPropertyRecord;
-import ch.systemsx.cisd.openbis.generic.server.business.bo.common.MaterialEntityPropertyRecord;
 
 /**
- * An implementation of {@link IEntitySetPropertyListingQuery} that gets the entity properties one
+ * An implementation of {@link IEntityPropertySetListingQuery} that gets the entity properties one
  * by one.
  * 
  * @author Bernd Rinn
  */
-@Friend(toClasses = IEntitySetPropertyListingQuery.class)
-class PropertiesSetListingQueryOneByOne implements IEntitySetPropertyListingQuery
+@Friend(toClasses =
+    { IEntityPropertySetListingQuery.class, IEntityPropertyListingQuery.class })
+class PropertiesSetListingQueryOneByOne implements IEntityPropertySetListingQuery
 {
     private final IEntityPropertyListingQuery query;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java
index 3e368e9d334..1aee5a57292 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java
@@ -19,24 +19,39 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister;
 import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
 import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
 
+import java.util.ArrayList;
 import java.util.List;
 
+import net.lemnik.eodsql.DataIterator;
+
+import org.apache.log4j.Logger;
+
+import ch.systemsx.cisd.common.logging.LogCategory;
+import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.common.types.BooleanOrUnknown;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.CodeRecord;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.EntityPropertiesEnricher;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.IEntityPropertiesEnricher;
+import ch.systemsx.cisd.openbis.generic.server.business.bo.common.IEntityPropertiesHolderResolver;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LocatorType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
 
 /**
  * @author Tomasz Pylak
  */
 public class DatasetLister implements IDatasetLister
 {
+    private final static Logger operationLog =
+            LogFactory.getLogger(LogCategory.OPERATION, DatasetLister.class);
+
     //
     // Input
     //
@@ -51,6 +66,10 @@ public class DatasetLister implements IDatasetLister
 
     private final IDatasetListingQuery query;
 
+    private final IDatasetSetListingQuery setQuery;
+
+    private final IEntityPropertiesEnricher propertiesEnricher;
+
     //
     // Working data structures
     //
@@ -79,7 +98,7 @@ public class DatasetLister implements IDatasetLister
     // For unit tests
     DatasetLister(final long databaseInstanceId, final DatabaseInstance databaseInstance,
             final IDatasetListingQuery query, final IDatasetSetListingQuery setQuery,
-            IEntityPropertiesEnricher propertiesEnricherOrNull)
+            IEntityPropertiesEnricher propertiesEnricher)
     {
         assert databaseInstance != null;
         assert query != null;
@@ -88,12 +107,76 @@ public class DatasetLister implements IDatasetLister
         this.databaseInstanceId = databaseInstanceId;
         this.databaseInstance = databaseInstance;
         this.query = query;
+        this.setQuery = setQuery;
+        this.propertiesEnricher = propertiesEnricher;
     }
 
     public List<ExternalData> listByExperimentTechId(TechId experimentId)
     {
         loadSmallConnectedTables();
-        return null;
+        DataIterator<DatasetRecord> datasets = query.getDatasetsForExperiment(experimentId.getId());
+        final Long2ObjectMap<ExternalData> resultMap = createDatasets(datasets);
+        propertiesEnricher.enrich(resultMap.keySet(), new IEntityPropertiesHolderResolver()
+            {
+                public ExternalData get(long id)
+                {
+                    return resultMap.get(id);
+                }
+            });
+
+        return asList(resultMap);
+    }
+
+    private static <T> List<T> asList(Long2ObjectMap<T> items)
+    {
+        List<T> result = new ArrayList<T>();
+        org.apache.commons.collections.CollectionUtils.addAll(result, items.values().iterator());
+        return result;
+    }
+
+    private Long2ObjectMap<ExternalData> createDatasets(DataIterator<DatasetRecord> records)
+    {
+        Long2ObjectMap<ExternalData> datasets = new Long2ObjectOpenHashMap<ExternalData>();
+        for (DatasetRecord record : records)
+        {
+            datasets.put(record.id, createDataset(record));
+        }
+        return datasets;
+    }
+
+    private ExternalData createDataset(DatasetRecord record)
+    {
+        ExternalData dataset = new ExternalData();
+        dataset.setCode(record.code);
+        dataset.setComplete(BooleanOrUnknown.tryToResolve(BooleanOrUnknown
+                .valueOf(record.is_complete)));
+        dataset.setDataProducerCode(record.data_producer_code);
+        dataset.setDataSetType(dataSetTypes.get(record.dsty_id));
+        dataset.setDataStore(dataStores.get(record.dast_id));
+        dataset.setDerived(record.is_derived);
+
+        dataset.setFileFormatType(fileFormatTypes.get(record.ffty_id));
+        dataset.setId(record.id);
+        dataset.setLocation(record.location);
+        dataset.setLocatorType(locatorTypes.get(record.loty_id));
+        dataset.setProductionDate(record.production_timestamp);
+        dataset.setRegistrationDate(record.registration_timestamp);
+        dataset.setDataSetProperties(new ArrayList<IEntityProperty>());
+        Sample sample = new Sample();
+        SampleType sampleType = new SampleType();
+        sampleType.setCode("sampleType");
+        sampleType.setDatabaseInstance(databaseInstance);
+        sample.setSampleType(sampleType);
+        dataset.setSample(sample);
+        // dataset.setInvalidation(record.); // from sample
+        // dataset.setPermlink(PermlinkUtilities.createPermlinkURL(baseIndexURL,
+        // EntityKind.DATA_SET, record.code));
+        // dataset.setParent(record.);
+        // dataset.setExperiment(record.);
+        // dataset.setRegistrator(record.);
+        // dataset.setSample(record.);
+
+        return dataset;
     }
 
     private void loadSmallConnectedTables()
@@ -111,7 +194,7 @@ public class DatasetLister implements IDatasetLister
         }
 
         locatorTypes.clear();
-        for (CodeRecord code : query.getLocatorTypes(databaseInstanceId))
+        for (CodeRecord code : query.getLocatorTypes())
         {
             locatorTypes.put(code.id, createLocatorType(code));
         }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerDAO.java
index 0a3e799cdba..edd654f9ca5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerDAO.java
@@ -28,7 +28,7 @@ import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.DatabaseContextUtils;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.GenericEntityPropertyRecord;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.IEntityPropertyListingQuery;
-import ch.systemsx.cisd.openbis.generic.server.business.bo.common.IEntitySetPropertyListingQuery;
+import ch.systemsx.cisd.openbis.generic.server.business.bo.common.IEntityPropertySetListingQuery;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.MaterialEntityPropertyRecord;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.PropertiesSetListingQueryFallback;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.QueryStrategyChooser;
@@ -46,14 +46,15 @@ import ch.systemsx.cisd.openbis.generic.shared.translator.DatabaseInstanceTransl
  * 
  * @author Bernd Rinn
  */
-@Friend(toClasses = IDatasetListingFullQuery.class)
+@Friend(toClasses =
+    { IDatasetListingFullQuery.class, IEntityPropertyListingQuery.class })
 public final class DatasetListerDAO
 {
     /**
      * Creates a new instance based on {@link PersistencyResources} and home
      * {@link DatabaseInstancePE} of specified DAO factory.
      */
-    public static DatasetListerDAO createDAO(IDAOFactory daoFactory)
+    public static DatasetListerDAO create(IDAOFactory daoFactory)
     {
         DatabaseConfigurationContext context = DatabaseContextUtils.getDatabaseContext(daoFactory);
         final boolean supportsSetQuery = DatabaseContextUtils.isSupportingSetQueries(context);
@@ -65,7 +66,7 @@ public final class DatasetListerDAO
 
     private final IDatasetSetListingQuery setQuery;
 
-    private final IEntitySetPropertyListingQuery propertySetQuery;
+    private final IEntityPropertySetListingQuery propertySetQuery;
 
     private final QueryStrategyChooser strategyChooser;
 
@@ -105,7 +106,7 @@ public final class DatasetListerDAO
         return setQuery;
     }
 
-    IEntitySetPropertyListingQuery getPropertySetQuery()
+    IEntityPropertySetListingQuery getPropertySetQuery()
     {
         return propertySetQuery;
     }
@@ -121,7 +122,7 @@ public final class DatasetListerDAO
             });
     }
 
-    private static IEntitySetPropertyListingQuery createSetPropertyQuery(boolean supportsSetQuery,
+    private static IEntityPropertySetListingQuery createSetPropertyQuery(boolean supportsSetQuery,
             IDatasetListingFullQuery query, QueryStrategyChooser strategyChooser)
     {
         if (supportsSetQuery)
@@ -174,10 +175,10 @@ public final class DatasetListerDAO
             };
     }
 
-    private static IEntitySetPropertyListingQuery asEntitySetPropertyListingQuery(
+    private static IEntityPropertySetListingQuery asEntitySetPropertyListingQuery(
             final IDatasetListingFullQuery query)
     {
-        return new IEntitySetPropertyListingQuery()
+        return new IEntityPropertySetListingQuery()
             {
                 public Iterable<GenericEntityPropertyRecord> getEntityPropertyGenericValues(
                         LongSet entityIDs)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingFullQuery.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingFullQuery.java
index 0a906810065..09a038278b6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingFullQuery.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingFullQuery.java
@@ -100,7 +100,7 @@ public interface IDatasetListingFullQuery extends IDatasetListingQuery
      * 
      * @param entityIds The set of sample ids to get the property values for.
      */
-    @Select(sql = "select sp.ds_id as entity_id, etpt.prty_id, m.id, m.code, m.maty_id"
+    @Select(sql = "select pr.ds_id as entity_id, etpt.prty_id, m.id, m.code, m.maty_id"
             + "      from data_set_properties pr"
             + "      join data_set_type_property_types etpt on pr.dstpt_id=etpt.id"
             + "      join materials m on pr.mate_prop_id=m.id where pr.ds_id = any(?{1})", parameterBindings =
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingQuery.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingQuery.java
index 649ad95571c..f9456f45195 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingQuery.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingQuery.java
@@ -55,8 +55,7 @@ public interface IDatasetListingQuery extends TransactionQuery, IPropertyListing
     /**
      * Returns all datasets in the database.
      */
-    @Select(sql = "select * from data d left outer join external_data e on d.id = e.data_id"
-            + " where d.id=?{1}", fetchSize = FETCH_SIZE)
+    @Select(sql = "select * from data d left outer join external_data e on d.id = e.data_id", fetchSize = FETCH_SIZE)
     public DataIterator<DatasetRecord> getDatasets();
 
     @Select(sql = "select id, code from data_set_types where dbin_id=?{1}")
@@ -68,8 +67,8 @@ public interface IDatasetListingQuery extends TransactionQuery, IPropertyListing
     @Select(sql = "select id, code from file_format_types where dbin_id=?{1}")
     public CodeRecord[] getFileFormatTypes(long databaseInstanceId);
 
-    @Select(sql = "select id, code from locator_types where dbin_id=?{1}")
-    public CodeRecord[] getLocatorTypes(long databaseInstanceId);
+    @Select(sql = "select id, code from locator_types")
+    public CodeRecord[] getLocatorTypes();
 
     // private Experiment experiment;
     //
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListerDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListerDAO.java
index baa4cb6ae0b..0a5c40ba8c1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListerDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListerDAO.java
@@ -28,7 +28,7 @@ import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.DatabaseContextUtils;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.GenericEntityPropertyRecord;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.IEntityPropertyListingQuery;
-import ch.systemsx.cisd.openbis.generic.server.business.bo.common.IEntitySetPropertyListingQuery;
+import ch.systemsx.cisd.openbis.generic.server.business.bo.common.IEntityPropertySetListingQuery;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.MaterialEntityPropertyRecord;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.PropertiesSetListingQueryFallback;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.QueryStrategyChooser;
@@ -46,14 +46,15 @@ import ch.systemsx.cisd.openbis.generic.shared.translator.DatabaseInstanceTransl
  * 
  * @author Bernd Rinn
  */
-@Friend(toClasses = ISampleListingFullQuery.class)
+@Friend(toClasses =
+    { ISampleListingFullQuery.class, IEntityPropertyListingQuery.class })
 public final class SampleListerDAO
 {
     /**
      * Creates a new instance based on {@link PersistencyResources} and home
      * {@link DatabaseInstancePE} of specified DAO factory.
      */
-    public static SampleListerDAO createDAO(IDAOFactory daoFactory)
+    public static SampleListerDAO create(IDAOFactory daoFactory)
     {
         DatabaseConfigurationContext context = DatabaseContextUtils.getDatabaseContext(daoFactory);
         final boolean supportsSetQuery = DatabaseContextUtils.isSupportingSetQueries(context);
@@ -65,7 +66,7 @@ public final class SampleListerDAO
 
     private final ISampleSetListingQuery setQuery;
 
-    private final IEntitySetPropertyListingQuery propertySetQuery;
+    private final IEntityPropertySetListingQuery propertySetQuery;
 
     private final QueryStrategyChooser strategyChooser;
 
@@ -105,7 +106,7 @@ public final class SampleListerDAO
         return setQuery;
     }
 
-    IEntitySetPropertyListingQuery getPropertySetQuery()
+    IEntityPropertySetListingQuery getPropertySetQuery()
     {
         return propertySetQuery;
     }
@@ -121,12 +122,12 @@ public final class SampleListerDAO
             });
     }
 
-    private static IEntitySetPropertyListingQuery createSetPropertyQuery(boolean supportsSetQuery,
+    private static IEntityPropertySetListingQuery createSetPropertyQuery(boolean supportsSetQuery,
             ISampleListingFullQuery query, QueryStrategyChooser strategyChooser)
     {
         if (supportsSetQuery)
         {
-            return asEntitySetPropertyListingQuery(query);
+            return asEntityPropertySetListingQuery(query);
         } else
         {
             return new PropertiesSetListingQueryFallback(asEntityPropertyListingQuery(query),
@@ -174,10 +175,10 @@ public final class SampleListerDAO
             };
     }
 
-    private static IEntitySetPropertyListingQuery asEntitySetPropertyListingQuery(
+    private static IEntityPropertySetListingQuery asEntityPropertySetListingQuery(
             final ISampleListingFullQuery query)
     {
-        return new IEntitySetPropertyListingQuery()
+        return new IEntityPropertySetListingQuery()
             {
                 public Iterable<GenericEntityPropertyRecord> getEntityPropertyGenericValues(
                         LongSet entityIDs)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingQueryTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingQueryTest.java
index ecc3d0d53c7..5981eed01e7 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingQueryTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingQueryTest.java
@@ -104,7 +104,7 @@ public class SampleListingQueryTest extends AbstractDAOTest
     @BeforeClass(alwaysRun = true)
     public void init()
     {
-        SampleListerDAO sampleListerDAO = SampleListerDAO.createDAO(daoFactory);
+        SampleListerDAO sampleListerDAO = SampleListerDAO.create(daoFactory);
         dbInstanceId = sampleListerDAO.getDatabaseInstanceId();
         dbInstance = daoFactory.getDatabaseInstanceDAO().getByTechId(new TechId(dbInstanceId));
         group = daoFactory.getGroupDAO().tryFindGroupByCodeAndDatabaseInstance("CISD", dbInstance);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleSetListingQueryTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleSetListingQueryTest.java
index c514d0c2a6c..7719aac1421 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleSetListingQueryTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleSetListingQueryTest.java
@@ -34,7 +34,7 @@ import ch.rinn.restrictions.Friend;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.BaseEntityPropertyRecord;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.EntityListingTestUtils;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.GenericEntityPropertyRecord;
-import ch.systemsx.cisd.openbis.generic.server.business.bo.common.IEntitySetPropertyListingQuery;
+import ch.systemsx.cisd.openbis.generic.server.business.bo.common.IEntityPropertySetListingQuery;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.MaterialEntityPropertyRecord;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.VocabularyTermRecord;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.AbstractDAOTest;
@@ -75,7 +75,7 @@ public class SampleSetListingQueryTest extends AbstractDAOTest
 
     private LongSet cellPlateIds;
 
-    private IEntitySetPropertyListingQuery propertySetQuery;
+    private IEntityPropertySetListingQuery propertySetQuery;
 
     private ISampleSetListingQuery setQuery;
 
@@ -84,7 +84,7 @@ public class SampleSetListingQueryTest extends AbstractDAOTest
     @BeforeClass(alwaysRun = true)
     public void init()
     {
-        SampleListerDAO sampleListerDAO = SampleListerDAO.createDAO(daoFactory);
+        SampleListerDAO sampleListerDAO = SampleListerDAO.create(daoFactory);
         dbInstanceId = sampleListerDAO.getDatabaseInstanceId();
         dbInstance = daoFactory.getDatabaseInstanceDAO().getByTechId(new TechId(dbInstanceId));
         group = daoFactory.getGroupDAO().listGroups().get(0);
-- 
GitLab