From d5dfe5d76a664d080367f0e79ac19de5b0c80178 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Mon, 19 Mar 2012 13:23:51 +0000
Subject: [PATCH] LMS-2854 problem was that more than 32767 deleted samples are
 in the system. In the SQL statement the 'in (..)' part has therefore more
 parameters than allowed. Problem is solved by get not more than 30k in one
 go.

SVN: 24749
---
 .../server/dataaccess/db/DeletionDAO.java     | 20 ++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java
index 9fde8bca53f..347cb2ee48d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 
 import java.sql.SQLException;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -448,10 +449,23 @@ final class DeletionDAO extends AbstractGenericEntityDAO<DeletionPE> implements
         {
             return Collections.emptyList();
         }
-        DetachedCriteria criteria = DetachedCriteria.forClass(entityKind.getDeletedEntityClass());
+        HibernateTemplate hibernateTemplate = getHibernateTemplate();
         List<Long> ids = TechId.asLongs(entityIds);
-        criteria.add(Restrictions.in(ID, ids));
-        return cast(getHibernateTemplate().findByCriteria(criteria));
+        int chunkSize = 30000;
+        List<IDeletablePE> result = new ArrayList<IDeletablePE>();
+        for (int i = 0, n = ids.size(); i < n; i += chunkSize)
+        {
+            DetachedCriteria criteria =
+                    DetachedCriteria.forClass(entityKind.getDeletedEntityClass());
+            List<Long> subList = ids.subList(i, Math.min(n, i + chunkSize));
+            if (subList.isEmpty() == false)
+            {
+                criteria.add(Restrictions.in(ID, subList));
+                List<IDeletablePE> list = cast(hibernateTemplate.findByCriteria(criteria));
+                result.addAll(list);
+            }
+        }
+        return result;
     }
 
     public List<TechId> listDeletedEntitiesForType(EntityKind entityKind, TechId entityTypeId)
-- 
GitLab