From 013e6c3ba3c1395cff6be622d3fa82054aa937e0 Mon Sep 17 00:00:00 2001
From: anttil <anttil>
Date: Mon, 18 Mar 2013 13:36:31 +0000
Subject: [PATCH] BIS-339 / SP-535: Pathinfo feeding task doesn't progress

SVN: 28632
---
 .../bo/datasetlister/DatasetLister.java       | 55 ++++++++++++++-----
 1 file changed, 40 insertions(+), 15 deletions(-)

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 12d22103186..ffec3b6994d 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
@@ -60,10 +60,10 @@ import ch.systemsx.cisd.openbis.generic.shared.Constants;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetFetchOption;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ArchiverDataSetCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
@@ -74,7 +74,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatasetLocationNode;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystem;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocationNode;
@@ -82,6 +81,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LocatorType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetShareId;
@@ -206,7 +206,8 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
     }
 
     @Override
-    public List<AbstractExternalData> listBySampleTechId(TechId sampleId, boolean showOnlyDirectlyConnected)
+    public List<AbstractExternalData> listBySampleTechId(TechId sampleId,
+            boolean showOnlyDirectlyConnected)
     {
         if (showOnlyDirectlyConnected)
         {
@@ -329,7 +330,8 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
                             return e.getId();
                         }
                     });
-        Map<Sample, List<AbstractExternalData>> result = new HashMap<Sample, List<AbstractExternalData>>();
+        Map<Sample, List<AbstractExternalData>> result =
+                new HashMap<Sample, List<AbstractExternalData>>();
         Set<Long> sampleIDs = new HashSet<Long>();
         for (Sample sample : samples)
         {
@@ -466,14 +468,31 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
             EnumSet<DataSetFetchOption> datasetFetchOptions)
     {
         checkFetchOptions(datasetFetchOptions);
-        return orderByDate(enrichDatasets(
-                handleDegenerateRegistrationTimestamp(
-                        query.getDatasetsByDataStoreId(dataStoreID, limit),
-                        dataStoreID), datasetFetchOptions));
+        List<AbstractExternalData> data = null;
+        int multiplier = 1;
+        int lastSize = 0;
+
+        // Given limit is not respected, if registration timestamp of all the returned data sets
+        // would be the same. In this case we make sure we return (at least) all the data sets
+        // with the same registration timestamp, no matter how many of them there are.
+        while (data == null
+                || (data.get(0).getRegistrationDate().equals(data.get(data.size() - 1)
+                        .getRegistrationDate())) && lastSize != data.size())
+        {
+            lastSize = data != null ? data.size() : 0;
+            data = orderByDate(enrichDatasets(
+                    handleDegenerateRegistrationTimestamp(
+                            query.getDatasetsByDataStoreId(dataStoreID, limit * multiplier),
+                            dataStoreID), datasetFetchOptions));
+            multiplier = multiplier << 1;
+        }
+
+        return data;
     }
 
     @Override
-    public List<AbstractExternalData> listByDataStore(long dataStoreID, Date youngerThan, int limit,
+    public List<AbstractExternalData> listByDataStore(long dataStoreID, Date youngerThan,
+            int limit,
             EnumSet<DataSetFetchOption> datasetFetchOptions)
     {
         checkFetchOptions(datasetFetchOptions);
@@ -628,7 +647,8 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
     {
         loadSmallConnectedTables();
         List<DatasetRecord> datasetRecords = asList(datasets);
-        final Long2ObjectMap<AbstractExternalData> datasetMap = createPrimaryDatasets(datasetRecords);
+        final Long2ObjectMap<AbstractExternalData> datasetMap =
+                createPrimaryDatasets(datasetRecords);
         if (fetchOptions.contains(DataSetFetchOption.EXPERIMENT))
         {
             enrichWithExperiments(datasetMap);
@@ -788,7 +808,8 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
             });
     }
 
-    private void enrichWithParents(Long2ObjectMap<AbstractExternalData> datasetMap, boolean withProperties)
+    private void enrichWithParents(Long2ObjectMap<AbstractExternalData> datasetMap,
+            boolean withProperties)
     {
         Map<Long, Set<Long>> parentIdsMap = listParentIds(datasetMap.keySet());
         Set<Long> allParentIds = new HashSet<Long>();
@@ -837,7 +858,8 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         }
     }
 
-    private void enrichWithChildren(Long2ObjectMap<AbstractExternalData> datasetMap, boolean withProperties)
+    private void enrichWithChildren(Long2ObjectMap<AbstractExternalData> datasetMap,
+            boolean withProperties)
     {
         Map<Long, Set<Long>> childrenIdsMap = listChildrenIds(datasetMap.keySet());
         Set<Long> allChildrenIds = new HashSet<Long>();
@@ -854,7 +876,8 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         {
             Long2ObjectMap<AbstractExternalData> childrenDatasetMap = withProperties ?
                     new Long2ObjectOpenHashMap<AbstractExternalData>() : null;
-            Long2ObjectMap<AbstractExternalData> childrenMap = createPrimaryDatasets(childrenIterator);
+            Long2ObjectMap<AbstractExternalData> childrenMap =
+                    createPrimaryDatasets(childrenIterator);
 
             for (Entry<Long, Set<Long>> childrenIdsEntry : childrenIdsMap.entrySet())
             {
@@ -990,9 +1013,11 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         return result;
     }
 
-    private Long2ObjectMap<AbstractExternalData> createPrimaryDatasets(Iterable<DatasetRecord> records)
+    private Long2ObjectMap<AbstractExternalData> createPrimaryDatasets(
+            Iterable<DatasetRecord> records)
     {
-        Long2ObjectMap<AbstractExternalData> datasets = new Long2ObjectOpenHashMap<AbstractExternalData>();
+        Long2ObjectMap<AbstractExternalData> datasets =
+                new Long2ObjectOpenHashMap<AbstractExternalData>();
         for (DatasetRecord record : records)
         {
             DataSetType dsType = dataSetTypes.get(record.dsty_id);
-- 
GitLab