diff --git a/study/src/org/labkey/study/model/DatasetDefinition.java b/study/src/org/labkey/study/model/DatasetDefinition.java index dc32f4b8a07..fd9c1cebc1a 100644 --- a/study/src/org/labkey/study/model/DatasetDefinition.java +++ b/study/src/org/labkey/study/model/DatasetDefinition.java @@ -2495,7 +2495,7 @@ private HashMap checkAndDeleteDupes(DataIterator rows, // duplicate keys found in error final LinkedHashMap noDeleteMap = new LinkedHashMap<>(); - StringBuilder sbIn = new StringBuilder(); + ArrayList idList = new ArrayList<>(); final Map uriMap = new HashMap<>(); int count = 0; while (rows.next()) @@ -2527,12 +2527,9 @@ private HashMap checkAndDeleteDupes(DataIterator rows, noDeleteMap.put(uniq,key); // partial fix for 16647, we should handle the replace case differently (do we ever replace?) - String sep = ""; if (uriMap.size() < 10000 || Boolean.TRUE==replace) { - if (uniq.contains(("'"))) - uniq = uniq.replaceAll("'","''"); - sbIn.append(sep).append("'").append(uniq).append("'"); + idList.add(uniq); } count++; } @@ -2549,7 +2546,7 @@ private HashMap checkAndDeleteDupes(DataIterator rows, return null; } else // also check target dataset - return checkTargetDupesAndDelete(isDemographic, noDeleteMap, sbIn, uriMap); + return checkTargetDupesAndDelete(isDemographic, noDeleteMap, idList, uriMap); } catch (BatchValidationException vex) { @@ -2569,14 +2566,15 @@ private HashMap checkAndDeleteDupes(DataIterator rows, } } - private HashMap checkTargetDupesAndDelete(final boolean demographic, final LinkedHashMap noDeleteMap, StringBuilder sbIn, final Map uriMap) + private HashMap checkTargetDupesAndDelete(final boolean demographic, final LinkedHashMap noDeleteMap, ArrayList idList, final Map uriMap) { // duplicate keys found that should be deleted final Set deleteSet = new HashSet<>(); TableInfo tinfo = getStorageTableInfo(false); SimpleFilter filter = new SimpleFilter(); - filter.addWhereClause((demographic ?"ParticipantId":"LSID") + " IN (" + sbIn + ")", new Object[]{}); + SQLFragment checkInClause = tinfo.getSqlDialect().appendInClauseSql(new SQLFragment(demographic ?"ParticipantId":"LSID"), idList); + filter.addWhereClause(checkInClause); if (isShared()) { Container rowsContainer = getContainer(); @@ -2610,16 +2608,8 @@ private HashMap checkTargetDupesAndDelete(final boolean demogr return null; SimpleFilter deleteFilter = new SimpleFilter(); - StringBuilder sbDelete = new StringBuilder(); - String sep = ""; - for (String s : deleteSet) - { - if (s.contains(("'"))) - s = s.replaceAll("'","''"); - sbDelete.append(sep).append("'").append(s).append("'"); - sep = ", "; - } - deleteFilter.addWhereClause("LSID IN (" + sbDelete + ")", new Object[]{}); + SQLFragment deleteInClause = tinfo.getSqlDialect().appendInClauseSql(new SQLFragment("LSID"), deleteSet); + deleteFilter.addWhereClause(deleteInClause); Table.delete(tinfo, deleteFilter); return null;