Skip to content
Snippets Groups Projects
Commit 3ad93d23 authored by juanf's avatar juanf
Browse files

SSDM-4682 : bugix, openBIS empty trashcan breaks when num entities over 2-byte due to SQL IN

SVN: 37867
parent cc3a6038
No related branches found
No related tags found
No related merge requests found
......@@ -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;
......
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
......@@ -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());
......
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