From 80ead236b7e8492a16df3fcc25c986bff68d3452 Mon Sep 17 00:00:00 2001 From: labkey-matthewb Date: Thu, 23 Jul 2026 10:48:33 -0700 Subject: [PATCH 1/2] use SqlDialect.appendInClauseSql() for cleaner code. --- .../org/labkey/study/model/DatasetDefinition.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/study/src/org/labkey/study/model/DatasetDefinition.java b/study/src/org/labkey/study/model/DatasetDefinition.java index dc32f4b8a07..a0ecf513eea 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()) @@ -2530,9 +2530,7 @@ private HashMap checkAndDeleteDupes(DataIterator rows, 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 +2547,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 +2567,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 inClause = tinfo.getSqlDialect().appendInClauseSql(new SQLFragment(demographic ?"ParticipantId":"LSID"), idList); + filter.addWhereClause(inClause); if (isShared()) { Container rowsContainer = getContainer(); From c0cc4239e3e1efefa6bbc2220acfb09b85e5e542 Mon Sep 17 00:00:00 2001 From: labkey-matthewb Date: Thu, 23 Jul 2026 11:01:47 -0700 Subject: [PATCH 2/2] and for delete as well --- .../labkey/study/model/DatasetDefinition.java | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/study/src/org/labkey/study/model/DatasetDefinition.java b/study/src/org/labkey/study/model/DatasetDefinition.java index a0ecf513eea..fd9c1cebc1a 100644 --- a/study/src/org/labkey/study/model/DatasetDefinition.java +++ b/study/src/org/labkey/study/model/DatasetDefinition.java @@ -2527,7 +2527,6 @@ 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) { idList.add(uniq); @@ -2574,8 +2573,8 @@ private HashMap checkTargetDupesAndDelete(final boolean demogr TableInfo tinfo = getStorageTableInfo(false); SimpleFilter filter = new SimpleFilter(); - SQLFragment inClause = tinfo.getSqlDialect().appendInClauseSql(new SQLFragment(demographic ?"ParticipantId":"LSID"), idList); - filter.addWhereClause(inClause); + SQLFragment checkInClause = tinfo.getSqlDialect().appendInClauseSql(new SQLFragment(demographic ?"ParticipantId":"LSID"), idList); + filter.addWhereClause(checkInClause); if (isShared()) { Container rowsContainer = getContainer(); @@ -2609,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;