diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/InQuery.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/InQuery.java index 8585869bba1ef3c21e04f15faf1a3ac256377394..69538d9ab55cebde14ecc3d3d7fcb8b111911d33 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/InQuery.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/InQuery.java @@ -9,24 +9,16 @@ import org.hibernate.Session; public class InQuery<I, O> { - private static final int POSTGRES_DRIVER_MAX_ARGS = 32767; // Uses a signed 2 bytes integer - public List<O> withBatch(Session session, String inQuery, String inParameter, List<I> inArguments, Map<String, Object> fixParams) { List<O> result = new ArrayList<O>(inArguments.size()); - int fixParamsSize = (fixParams == null) ? 0 : fixParams.size(); - int fromIndex = 0; - while (fromIndex < inArguments.size()) - { - int toIndex = fromIndex + POSTGRES_DRIVER_MAX_ARGS - fixParamsSize; - if (toIndex > inArguments.size()) - { - toIndex = inArguments.size(); - } + InQueryScroller<I> scroller = new InQueryScroller<>(inArguments, fixParamsSize); + List<I> partialInArguments = null; - List<I> partialInArguments = inArguments.subList(fromIndex, toIndex); + while ((partialInArguments = scroller.next()) != null) + { SQLQuery query = session.createSQLQuery(inQuery); query.setParameterList(inParameter, partialInArguments); @@ -39,7 +31,6 @@ public class InQuery<I, O> } List<O> partialResult = query.list(); result.addAll(partialResult); - fromIndex = toIndex; } return result; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/InQueryScroller.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/InQueryScroller.java new file mode 100644 index 0000000000000000000000000000000000000000..49cbd0204c75d6e7eb1b0efbde2d9b9db3048261 --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/InQueryScroller.java @@ -0,0 +1,40 @@ +package ch.systemsx.cisd.openbis.generic.server.dataaccess.db; + +import java.util.List; + +public class InQueryScroller<I> +{ + private static final int POSTGRES_DRIVER_MAX_ARGS = 32767; // Uses a signed 2 bytes integer + + private List<I> inArguments; + + private int fromIndex; + + private int fixParamsSize; + + public InQueryScroller(List<I> inArguments, int fixParamsSize) + { + this.inArguments = inArguments; + this.fromIndex = 0; + this.fixParamsSize = fixParamsSize; + } + + public List<I> next() + { + if (fromIndex < inArguments.size()) + { + int toIndex = fromIndex + POSTGRES_DRIVER_MAX_ARGS - fixParamsSize; + if (toIndex > inArguments.size()) + { + toIndex = inArguments.size(); + } + + List<I> partialInArguments = inArguments.subList(fromIndex, toIndex); + fromIndex = toIndex; + return partialInArguments; + } else + { + return null; + } + } +} \ No newline at end of file diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java index a4f88a026bf03dc13d55af6da92a8aecd02a9a2a..099a1568b8e745ce640ee9a93776f11defc26043 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java @@ -247,7 +247,7 @@ public class SampleDAO extends AbstractGenericEntityWithPropertiesDAO<SamplePE> { assert sampleCode != null : "Unspecified sample code."; assert project != null : "Unspecified project."; - + Criteria criteria = createProjectCriteria(project); addSampleCodeCriterion(criteria, sampleCode); SamplePE sample = (SamplePE) criteria.uniqueResult(); @@ -352,7 +352,7 @@ public class SampleDAO extends AbstractGenericEntityWithPropertiesDAO<SamplePE> { return createFindCriteria(Restrictions.eq("project", project)); } - + private void addSampleCodesCriterion(Criteria criteria, List<String> sampleCodes, String containerCodeOrNull) { @@ -609,9 +609,23 @@ public class SampleDAO extends AbstractGenericEntityWithPropertiesDAO<SamplePE> } String permIds = permIdList.substring(2); - String content = historyCreator.apply(session, entityIdsToDelete, createQueryPropertyHistorySQL(), - createQueryRelationshipHistorySQL(), createQueryAttributesSQL(), null, - AttachmentHolderKind.SAMPLE, registrator); + + InQueryScroller<Long> entityIdsToDeleteScroller = new InQueryScroller<>(entityIdsToDelete, 16384 /* + * createQueryPropertyHistorySQL + * uses the parameters twice + */); + List<Long> partialEntityIdsToDelete = null; + String content = ""; + while ((partialEntityIdsToDelete = entityIdsToDeleteScroller.next()) != null) + { + if (content.length() > 0) + { + content += ", "; + } + content += historyCreator.apply(session, partialEntityIdsToDelete, createQueryPropertyHistorySQL(), + createQueryRelationshipHistorySQL(), createQueryAttributesSQL(), null, + AttachmentHolderKind.SAMPLE, registrator); + } SQLQuery deleteProperties = session.createSQLQuery(properties); deleteProperties.setParameter("id", deletion.getId());