From abc099053b439eb891f3f5f0250fdc516b661233 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Thu, 15 Oct 2026 11:47:47 -0700 Subject: [PATCH 1/3] Use helper methods to create IN clauses --- snd/src/org/labkey/snd/SNDManager.java | 66 ++++--------------- .../services/AnimalsGroupAssignor.java | 25 ++----- 2 files changed, 17 insertions(+), 74 deletions(-) diff --git a/snd/src/org/labkey/snd/SNDManager.java b/snd/src/org/labkey/snd/SNDManager.java index 86c2403d..5d9de228 100644 --- a/snd/src/org/labkey/snd/SNDManager.java +++ b/snd/src/org/labkey/snd/SNDManager.java @@ -95,7 +95,6 @@ import java.sql.SQLException; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -104,7 +103,6 @@ import java.util.Date; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.LongSummaryStatistics; import java.util.Map; @@ -717,12 +715,7 @@ private Map> getBulkPackageCategories(Container c, sql.append(schema.getTable(SNDSchema.PKGCATEGORIES__TABLE_NAME), "ca"); sql.append(" ON cj.CategoryId = ca.CategoryId"); if (pkgIds != null) { - sql.append(" WHERE PkgId IN ( "); - ArrayDeque pkgIdsQueue = new ArrayDeque<>(pkgIds); - while (pkgIdsQueue.size() > 1) { - sql.append("?, ").add(pkgIdsQueue.pop()); - } - sql.append("?) ").add(pkgIdsQueue.pop()); + sql.append(" WHERE PkgId").appendInClause(pkgIds, schema.getDbSchema().getSqlDialect()).append(" "); } SqlSelector selector = new SqlSelector(schema.getDbSchema(), sql); @@ -874,9 +867,7 @@ public static List getSuperPkgs(Container c, User u, List SQLFragment sql = new SQLFragment("SELECT sp.SuperPkgId, sp.ParentSuperPkgId, sp.PkgId, sp.SuperPkgPath, sp.SortOrder, sp.Required FROM "); sql.append(schema.getTable(SNDSchema.SUPERPKGS_TABLE_NAME), "sp"); - sql.append(" WHERE sp.SuperPkgId IN ("); - addSubPkgParameters(sql, superPackageIds.iterator()); - sql.append(")"); + sql.append(" WHERE sp.SuperPkgId").appendInClause(superPackageIds, schema.getDbSchema().getSqlDialect()); SqlSelector selector = new SqlSelector(schema.getDbSchema(), sql); if (!selector.getArrayList(SuperPackage.class).isEmpty()) @@ -899,9 +890,8 @@ public static List convertToTopLevelSuperPkgs(Container c, User u, sql.append(schema.getTable(SNDSchema.SUPERPKGS_TABLE_NAME), "sp2"); sql.append(" ON sp2.PkgId = sp.PkgId"); - sql.append(" WHERE sp.SuperPkgId IN ("); - addSubPkgParameters(sql, superPackageIds.iterator()); - sql.append(") AND sp2.ParentSuperPkgId IS NULL"); + sql.append(" WHERE sp.SuperPkgId").appendInClause(superPackageIds, schema.getDbSchema().getSqlDialect()); + sql.append(" AND sp2.ParentSuperPkgId IS NULL"); SqlSelector selector = new SqlSelector(schema.getDbSchema(), sql); if (!selector.getArrayList(SuperPackage.class).isEmpty()) @@ -923,9 +913,8 @@ public static List filterTopLevelSuperPkgs(Container c, User u, Li SQLFragment sql = new SQLFragment("SELECT sp.SuperPkgId, sp.ParentSuperPkgId, sp.PkgId, sp.SuperPkgPath, sp.SortOrder, sp.Required FROM "); sql.append(schema.getTable(SNDSchema.SUPERPKGS_TABLE_NAME), "sp"); - sql.append(" WHERE sp.SuperPkgId IN ("); - addSubPkgParameters(sql, superPackageIds.iterator()); - sql.append(") AND sp.ParentSuperPkgId IS NULL"); + sql.append(" WHERE sp.SuperPkgId").appendInClause(superPackageIds, schema.getDbSchema().getSqlDialect()); + sql.append(" AND sp.ParentSuperPkgId IS NULL"); SqlSelector selector = new SqlSelector(schema.getDbSchema(), sql); if (!selector.getArrayList(SuperPackage.class).isEmpty()) @@ -966,9 +955,8 @@ public static List filterChildSuperPkgs(Container c, User u, List< SQLFragment sql = new SQLFragment("SELECT sp.SuperPkgId, sp.ParentSuperPkgId, sp.PkgId, sp.SuperPkgPath, sp.SortOrder, sp.Required FROM "); sql.append(schema.getTable(SNDSchema.SUPERPKGS_TABLE_NAME), "sp"); - sql.append(" WHERE sp.SuperPkgId IN ("); - addSubPkgParameters(sql, superPackageIds.iterator()); - sql.append(") AND sp.ParentSuperPkgId = ?").add(parentSuperPackageId); + sql.append(" WHERE sp.SuperPkgId").appendInClause(superPackageIds, schema.getDbSchema().getSqlDialect()); + sql.append(" AND sp.ParentSuperPkgId = ?").add(parentSuperPackageId); SqlSelector selector = new SqlSelector(schema.getDbSchema(), sql); if (!selector.getArrayList(SuperPackage.class).isEmpty()) @@ -990,16 +978,8 @@ public static List getDeletedChildSuperPkgs(Container c, User u, List superPackageIterator = superPackages.iterator(); - while (superPackageIterator.hasNext()) - { - Integer superPkgId = superPackageIterator.next().getSuperPkgId(); - if (!superPackageIterator.hasNext()) - sql.append("?").add(superPkgId); - else - sql.append("?,").add(superPkgId); - } + sql.append(" NOT (sp.SuperPkgId"); + sql.appendInClause(superPackages.stream().map(SuperPackage::getSuperPkgId).toList(), schema.getDbSchema().getSqlDialect()); sql.append(") AND"); } sql.append(" sp.ParentSuperPkgId = ?").add(parentSuperPackageId); @@ -1011,21 +991,6 @@ public static List getDeletedChildSuperPkgs(Container c, User u, List subPkgIterator) - { - while (subPkgIterator.hasNext()) - { - Integer superPkgId = subPkgIterator.next(); - if (!subPkgIterator.hasNext()) - sql.append("?").add(superPkgId); - else - sql.append("?,").add(superPkgId); - } - } - /** * Checks if package is descendent of a super package */ @@ -3656,9 +3621,7 @@ public List getCategories(Container c, User u, List categoryI SQLFragment sql = new SQLFragment("SELECT CategoryId, Description, Active, ObjectId, Container FROM "); sql.append(pkgCategoriesTable, "ed"); - sql.append(" WHERE CategoryId IN ("); - sql.append(StringUtils.join(categoryIds, ",")); - sql.append(")"); + sql.append(" WHERE CategoryId").appendInClause(categoryIds, schema.getDbSchema().getSqlDialect()); SqlSelector selector = new SqlSelector(schema.getDbSchema(), sql); return selector.getArrayList(Category.class); @@ -4032,12 +3995,7 @@ private Map getBulkSuperPkgs(Container c, User u, List eventIdsQueue = new ArrayDeque<>(eventIds); - while (eventIdsQueue.size() > 1) { - sql.append("?, ").add(eventIdsQueue.pop()); - } - sql.append("?) ").add(eventIdsQueue.pop()); + sql.append(" WHERE ed.EventId").appendInClause(eventIds, schema.getDbSchema().getSqlDialect()).append(" "); } sql.append(" ORDER BY sp.SuperPkgId "); diff --git a/snprc_ehr/src/org/labkey/snprc_ehr/services/AnimalsGroupAssignor.java b/snprc_ehr/src/org/labkey/snprc_ehr/services/AnimalsGroupAssignor.java index d38e2c03..81f77546 100644 --- a/snprc_ehr/src/org/labkey/snprc_ehr/services/AnimalsGroupAssignor.java +++ b/snprc_ehr/src/org/labkey/snprc_ehr/services/AnimalsGroupAssignor.java @@ -91,21 +91,6 @@ private List getCategoryGroups() } - private String getCategoryGroupsString() - { - StringBuilder sb = new StringBuilder(); - sb.append("("); - this.getCategoryGroups().forEach(group -> { - sb.append(group.toString()); - sb.append(","); - } - ); - sb.setCharAt(sb.lastIndexOf(","), ' '); - sb.append(")"); - - return sb.toString(); - } - /** * @param groupMembers: Animals to be assigned (animalId, start date, and end date) * returns - Nothing - Animals are either assigned or an exception is thrown @@ -219,16 +204,16 @@ public void assign(List groupMembers) throws ValidationException sql.append("inner join ehr_lookups.calendar as c\n "); //; sql.append ("on c.targetDate between agm.date and COALESCE(agm.enddate, CURRENT_TIMESTAMP + INTERVAL '10 years')\n"); sql.append("where agm.participantid = ? \n"); - sql.append(" and agm.groupId in " + getCategoryGroupsString() + "\n"); - sql.append(" and c.targetDate between ? and ?\n"); - if (groupMember.getObjectid() != null ) - sql.append(" and agm.objectId <> ?"); // ignore the record being updated - sql.add(groupMember.getParticipantid()); + sql.append(" and agm.groupId").appendInClause(getCategoryGroups(), dbStudySchema.getSqlDialect()).append("\n"); + sql.append(" and c.targetDate between ? and ?\n"); sql.add(groupMember.getDate()); sql.add(endDate); if (groupMember.getObjectid() != null ) + { + sql.append(" and agm.objectId <> ?"); // ignore the record being updated sql.add(groupMember.getObjectid()); + } selector = new SqlSelector(dbStudySchema, sql); if (selector.exists()) From 1ce0c46377773b270b49206444a134bb48f4dd04 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Thu, 15 Oct 2026 13:33:49 -0700 Subject: [PATCH 2/3] Migrate away from deprecated StringUtils methods --- .../helpers/CustomizerQueryProvider.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/snprc_ehr/src/org/labkey/snprc_ehr/helpers/CustomizerQueryProvider.java b/snprc_ehr/src/org/labkey/snprc_ehr/helpers/CustomizerQueryProvider.java index 1bd01057..9aa8ccb1 100644 --- a/snprc_ehr/src/org/labkey/snprc_ehr/helpers/CustomizerQueryProvider.java +++ b/snprc_ehr/src/org/labkey/snprc_ehr/helpers/CustomizerQueryProvider.java @@ -16,7 +16,7 @@ package org.labkey.snprc_ehr.helpers; import org.apache.commons.lang.text.StrSubstitutor; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Strings; import org.apache.commons.text.CaseUtils; import org.labkey.api.data.AbstractTableInfo; import org.labkey.api.data.ColumnInfo; @@ -137,19 +137,19 @@ private WrappedColumn getWrappedCalculatedColumn(CalculatedColumnQueryInfo query */ private String mapQueryStringValues(String queryString, CalculatedColumnQueryInfo queryInfo, String dateColumnName) { Map queryByValues = new HashMap<>(); - if(StringUtils.contains(queryString, PRIMARY_KEY_VARIABLE)) + if(Strings.CS.contains(queryString, PRIMARY_KEY_VARIABLE)) queryByValues.put(PRIMARY_KEY_VARIABLE, queryInfo.getPrimaryKeyColumn().getFieldKey().toSQLString()); - if(StringUtils.contains(queryString, SCHEMA_VARIABLE)) + if(Strings.CS.contains(queryString, SCHEMA_VARIABLE)) queryByValues.put(SCHEMA_VARIABLE, queryInfo.getTableInfo().getPublicSchemaName()); - if(StringUtils.contains(queryString, QUERY_VARIABLE)) + if(Strings.CS.contains(queryString, QUERY_VARIABLE)) queryByValues.put(QUERY_VARIABLE, queryInfo.getTableInfo().getName()); - if(StringUtils.contains(queryString, EHR_PATH_VARIABLE)) + if(Strings.CS.contains(queryString, EHR_PATH_VARIABLE)) queryByValues.put(EHR_PATH_VARIABLE, queryInfo.getEhrSchema().getContainer().getPath()); - if(StringUtils.contains(queryString, ID_COLUMN_VARIABLE)) + if(Strings.CS.contains(queryString, ID_COLUMN_VARIABLE)) queryByValues.put(ID_COLUMN_VARIABLE, queryInfo.getIdColumn().getFieldKey().toSQLString()); - if(StringUtils.contains(queryString, TARGET_CONTAINER_VARIABLE)) + if(Strings.CS.contains(queryString, TARGET_CONTAINER_VARIABLE)) queryByValues.put(TARGET_CONTAINER_VARIABLE, queryInfo.getTableInfo().getUserSchema().getName()); - if(StringUtils.contains(queryString, DATE_COLUMN_VARIABLE)) + if(Strings.CS.contains(queryString, DATE_COLUMN_VARIABLE)) queryByValues.put(DATE_COLUMN_VARIABLE, dateColumnName); return StrSubstitutor.replace(queryString, queryByValues); } From 432b1f8937458495a44f76a3a5fe9911ba4bbe8f Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Fri, 16 Oct 2026 10:52:47 -0700 Subject: [PATCH 3/3] More reliable NOT InClause generation --- snd/src/org/labkey/snd/SNDManager.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/snd/src/org/labkey/snd/SNDManager.java b/snd/src/org/labkey/snd/SNDManager.java index 5d9de228..bd7e942f 100644 --- a/snd/src/org/labkey/snd/SNDManager.java +++ b/snd/src/org/labkey/snd/SNDManager.java @@ -976,11 +976,10 @@ public static List getDeletedChildSuperPkgs(Container c, User u, List