From 6f774157cb671039d0b0c417145e8ee413866ec6 Mon Sep 17 00:00:00 2001 From: bbimber Date: Fri, 22 Aug 2025 12:46:09 -0700 Subject: [PATCH 1/8] Support --score_min for BismarkWrapper --- primeseq/src/org/labkey/primeseq/pipeline/BismarkWrapper.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/primeseq/src/org/labkey/primeseq/pipeline/BismarkWrapper.java b/primeseq/src/org/labkey/primeseq/pipeline/BismarkWrapper.java index 043f26965..d48a5be20 100644 --- a/primeseq/src/org/labkey/primeseq/pipeline/BismarkWrapper.java +++ b/primeseq/src/org/labkey/primeseq/pipeline/BismarkWrapper.java @@ -297,6 +297,9 @@ public Provider() put("minValue", 0); put("maxValue", 1); }}, 1), + ToolParameterDescriptor.createCommandLineParam(CommandLineParam.create("--score_min"), "score_min", "Score Min", "Sets a function governing the minimum alignment score needed for an alignment to be considered \"valid\" (i.e. good enough to report). This is a function of read length. For instance, specifying L,0,-0.2 sets the minimum-score function f to f(x) = 0 + -0.2 * x, where x is the read length", "textfield", new JSONObject(){{ + + }}, null), ToolParameterDescriptor.createCommandLineParam(CommandLineParam.createSwitch("--local"), "local", "Local Alignment", "In this mode, it is not required that the entire read aligns from one end to the other. Rather, some characters may be omitted (“soft-clipped”) from the ends in order to achieve the greatest possible alignment score. For Bowtie 2, the match bonus --ma (default: 2) is used in this mode, and the best possible alignment score is equal to the match bonus (--ma) times the length of the read. This is mutually exclusive with end-to-end alignments.", "checkbox", new JSONObject(){{ }}, false), From 8a4bd6cbe954dff379f2483889d8e1dccea8332e Mon Sep 17 00:00:00 2001 From: bbimber Date: Mon, 25 Aug 2025 10:40:52 -0700 Subject: [PATCH 2/8] Improve login text --- mGAP/resources/views/login.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mGAP/resources/views/login.html b/mGAP/resources/views/login.html index ead854e20..a087ae9c3 100644 --- a/mGAP/resources/views/login.html +++ b/mGAP/resources/views/login.html @@ -66,6 +66,6 @@ \ No newline at end of file From a1babe5475c0d7ca8b7015e603f91a6eee200058 Mon Sep 17 00:00:00 2001 From: bbimber Date: Wed, 27 Aug 2025 06:03:33 -0700 Subject: [PATCH 3/8] Manually decode form parameters --- .../labkey/genotypeassays/GenotypeAssaysController.java | 5 ++++- .../org/labkey/genotypeassays/GenotypeAssaysManager.java | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/GenotypeAssays/src/org/labkey/genotypeassays/GenotypeAssaysController.java b/GenotypeAssays/src/org/labkey/genotypeassays/GenotypeAssaysController.java index 0d9ab5f37..f9f2a11a5 100644 --- a/GenotypeAssays/src/org/labkey/genotypeassays/GenotypeAssaysController.java +++ b/GenotypeAssays/src/org/labkey/genotypeassays/GenotypeAssaysController.java @@ -30,6 +30,7 @@ import org.labkey.api.security.RequiresPermission; import org.labkey.api.security.permissions.ReadPermission; import org.labkey.api.security.permissions.UpdatePermission; +import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Pair; import org.labkey.api.util.URLHelper; import org.labkey.api.view.HtmlView; @@ -37,6 +38,7 @@ import org.springframework.validation.Errors; import org.springframework.web.servlet.ModelAndView; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -130,7 +132,8 @@ public ApiResponse execute(CacheAnalysesForm form, BindException errors) return null; } - Pair, List> ret = GenotypeAssaysManager.get().cacheAnalyses(getViewContext(), protocol, form.getAlleleNames()); + String[] alleleNames = Arrays.stream(form.getAlleleNames()).map(PageFlowUtil::decode).toArray(String[]::new); + Pair, List> ret = GenotypeAssaysManager.get().cacheAnalyses(getViewContext(), protocol, alleleNames); resultProperties.put("runsCreated", ret.first); resultProperties.put("runsDeleted", ret.second); } diff --git a/GenotypeAssays/src/org/labkey/genotypeassays/GenotypeAssaysManager.java b/GenotypeAssays/src/org/labkey/genotypeassays/GenotypeAssaysManager.java index fc48d2aef..42a194f8a 100644 --- a/GenotypeAssays/src/org/labkey/genotypeassays/GenotypeAssaysManager.java +++ b/GenotypeAssays/src/org/labkey/genotypeassays/GenotypeAssaysManager.java @@ -60,6 +60,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; public class GenotypeAssaysManager { @@ -121,6 +122,7 @@ public Pair, List> cacheAnalyses(final ViewContext ctx, f final Map>> rowHash = new HashMap<>(); final Map> toDeleteByAnalysis = new HashMap<>(); + AtomicInteger records = new AtomicInteger(); TableSelector tsAlignments = new TableSelector(tableAlignments, cols.values(), new SimpleFilter(FieldKey.fromString("key"), Arrays.asList(pks), CompareType.IN), null); tsAlignments.forEach(new Selector.ForEachBlock() { @@ -128,6 +130,7 @@ public Pair, List> cacheAnalyses(final ViewContext ctx, f public void exec(ResultSet object) throws SQLException { Results rs = new ResultsImpl(object, cols); + records.getAndIncrement(); int analysisId = rs.getInt(FieldKey.fromString("analysis_id")); String lineages = rs.getString(FieldKey.fromString("lineages")); @@ -167,6 +170,11 @@ public void exec(ResultSet object) throws SQLException } }); + if (records.get() != pks.length) + { + throw new IllegalStateException("The number of records found did not match the number supplied. This indicates a problem with the import."); + } + if (!rowHash.isEmpty()) { processSet(SBT_LINEAGE_ASSAY_TYPE, rowHash, assayDataTable, u, ctx, toDeleteByAnalysis, ap, protocol, runsCreated); From 2f850c898635234f63dd60a3ea9524c12cf65986 Mon Sep 17 00:00:00 2001 From: bbimber Date: Wed, 27 Aug 2025 06:20:55 -0700 Subject: [PATCH 4/8] Manually decode form parameters --- .../org/labkey/genotypeassays/GenotypeAssaysController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GenotypeAssays/src/org/labkey/genotypeassays/GenotypeAssaysController.java b/GenotypeAssays/src/org/labkey/genotypeassays/GenotypeAssaysController.java index f9f2a11a5..de0902f24 100644 --- a/GenotypeAssays/src/org/labkey/genotypeassays/GenotypeAssaysController.java +++ b/GenotypeAssays/src/org/labkey/genotypeassays/GenotypeAssaysController.java @@ -16,6 +16,7 @@ package org.labkey.genotypeassays; +import org.apache.commons.text.StringEscapeUtils; import org.json.JSONArray; import org.labkey.api.action.ApiResponse; import org.labkey.api.action.ApiSimpleResponse; @@ -30,7 +31,6 @@ import org.labkey.api.security.RequiresPermission; import org.labkey.api.security.permissions.ReadPermission; import org.labkey.api.security.permissions.UpdatePermission; -import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Pair; import org.labkey.api.util.URLHelper; import org.labkey.api.view.HtmlView; @@ -132,7 +132,7 @@ public ApiResponse execute(CacheAnalysesForm form, BindException errors) return null; } - String[] alleleNames = Arrays.stream(form.getAlleleNames()).map(PageFlowUtil::decode).toArray(String[]::new); + String[] alleleNames = Arrays.stream(form.getAlleleNames()).map(StringEscapeUtils::unescapeHtml4).toArray(String[]::new); Pair, List> ret = GenotypeAssaysManager.get().cacheAnalyses(getViewContext(), protocol, alleleNames); resultProperties.put("runsCreated", ret.first); resultProperties.put("runsDeleted", ret.second); From c9b66718fc9e54bf3c3d6e3f696f49ca0c9c1a29 Mon Sep 17 00:00:00 2001 From: bbimber Date: Fri, 29 Aug 2025 11:16:01 -0700 Subject: [PATCH 5/8] Add CAST to calculated column --- mcc/src/org/labkey/mcc/query/MccRequestCustomizer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcc/src/org/labkey/mcc/query/MccRequestCustomizer.java b/mcc/src/org/labkey/mcc/query/MccRequestCustomizer.java index b3c023a31..a5bb1a24e 100644 --- a/mcc/src/org/labkey/mcc/query/MccRequestCustomizer.java +++ b/mcc/src/org/labkey/mcc/query/MccRequestCustomizer.java @@ -98,7 +98,7 @@ public boolean isSortable() append(" as expr FROM "). append(" mcc." + MccSchema.TABLE_ANIMAL_REQUESTS + " ar JOIN studydataset.").append(dti.getName()). append(" d ON (d.mccRequestId = ar.rowId)"). - append(" WHERE ar.objectid = " + ExprColumn.STR_TABLE_ALIAS + ".requestId)"); + append(" WHERE CAST(ar.objectid AS VARCHAR) = CAST(" + ExprColumn.STR_TABLE_ALIAS + ".requestId AS VARCHAR))"); ExprColumn newCol = new ExprColumn(ti, "transferIds", sql, JdbcType.VARCHAR, ti.getColumn("requestId")); newCol.setLabel("Animal ID(s)"); From 8f624605963e5687f3f3ccc9391fd289a2d4cb69 Mon Sep 17 00:00:00 2001 From: bbimber Date: Fri, 29 Aug 2025 12:18:01 -0700 Subject: [PATCH 6/8] Sql fix --- mcc/src/org/labkey/mcc/query/MccRequestCustomizer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcc/src/org/labkey/mcc/query/MccRequestCustomizer.java b/mcc/src/org/labkey/mcc/query/MccRequestCustomizer.java index a5bb1a24e..ddae193a2 100644 --- a/mcc/src/org/labkey/mcc/query/MccRequestCustomizer.java +++ b/mcc/src/org/labkey/mcc/query/MccRequestCustomizer.java @@ -98,7 +98,7 @@ public boolean isSortable() append(" as expr FROM "). append(" mcc." + MccSchema.TABLE_ANIMAL_REQUESTS + " ar JOIN studydataset.").append(dti.getName()). append(" d ON (d.mccRequestId = ar.rowId)"). - append(" WHERE CAST(ar.objectid AS VARCHAR) = CAST(" + ExprColumn.STR_TABLE_ALIAS + ".requestId AS VARCHAR))"); + append(" WHERE CAST(ar.objectid AS VARCHAR(36)) = CAST(" + ExprColumn.STR_TABLE_ALIAS + ".requestId AS VARCHAR(36)))"); ExprColumn newCol = new ExprColumn(ti, "transferIds", sql, JdbcType.VARCHAR, ti.getColumn("requestId")); newCol.setLabel("Animal ID(s)"); From 2cb6c7837e0873b3bd2b1f7d77e0396be95e8b0c Mon Sep 17 00:00:00 2001 From: bbimber Date: Fri, 29 Aug 2025 12:56:05 -0700 Subject: [PATCH 7/8] Sql fix --- mcc/src/org/labkey/mcc/query/MccRequestCustomizer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mcc/src/org/labkey/mcc/query/MccRequestCustomizer.java b/mcc/src/org/labkey/mcc/query/MccRequestCustomizer.java index ddae193a2..559e9229a 100644 --- a/mcc/src/org/labkey/mcc/query/MccRequestCustomizer.java +++ b/mcc/src/org/labkey/mcc/query/MccRequestCustomizer.java @@ -58,7 +58,7 @@ public boolean isSortable() ti.addColumn(newCol); - SQLFragment sql2 = new SQLFragment("(SELECT COALESCE(sum(CASE WHEN r.review IS NULL THEN 1 ELSE 0 END), -1) as expr FROM mcc.requestReviews r WHERE r.requestId = " + ExprColumn.STR_TABLE_ALIAS + ".requestId)"); + SQLFragment sql2 = new SQLFragment("(SELECT COALESCE(sum(CASE WHEN r.review IS NULL THEN 1 ELSE 0 END), -1) as expr FROM mcc.requestReviews r WHERE CAST(r.requestId AS VARCHAR(36)) = CAST(" + ExprColumn.STR_TABLE_ALIAS + ".requestId AS VARCHAR(36)))"); ExprColumn newCol2 = new ExprColumn(ti, "pendingRabReviews", sql2, JdbcType.INTEGER, ti.getColumn("requestId")); newCol2.setLabel("Pending RAB Reviews"); ti.addColumn(newCol2); @@ -66,7 +66,7 @@ public boolean isSortable() if (ti.getColumn("numAnimalsRequested") == null) { - SQLFragment sql = new SQLFragment("(SELECT SUM(rc.numberofanimals) as expr FROM mcc." + MccSchema.TABLE_REQUEST_COHORTS + " rc WHERE rc.requestId = " + ExprColumn.STR_TABLE_ALIAS + ".requestId)"); + SQLFragment sql = new SQLFragment("(SELECT SUM(rc.numberofanimals) as expr FROM mcc." + MccSchema.TABLE_REQUEST_COHORTS + " rc WHERE CAST(rc.requestId AS VARCHAR(36)) = CAST(" + ExprColumn.STR_TABLE_ALIAS + ".requestId AS VARCHAR(36)))"); ExprColumn newCol = new ExprColumn(ti, "numAnimalsRequested", sql, JdbcType.INTEGER, ti.getColumn("requestId")); newCol.setLabel("# Animals Requested"); newCol.setURL(DetailsURL.fromString("/query/executeQuery.view?schemaName=mcc&query.queryName=" + MccSchema.TABLE_REQUEST_COHORTS + "&query.requestId~eq=${requestId}")); From 5c0bb94f237f50c428354e8060be02aba75cbd6d Mon Sep 17 00:00:00 2001 From: bbimber Date: Tue, 2 Sep 2025 10:00:26 -0700 Subject: [PATCH 8/8] Improve MCC label format --- mcc/src/client/RequestReview/components/RabReviewForm.tsx | 4 ++-- mcc/src/org/labkey/mcc/MccManager.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mcc/src/client/RequestReview/components/RabReviewForm.tsx b/mcc/src/client/RequestReview/components/RabReviewForm.tsx index 4b849a019..8874b55da 100644 --- a/mcc/src/client/RequestReview/components/RabReviewForm.tsx +++ b/mcc/src/client/RequestReview/components/RabReviewForm.tsx @@ -124,8 +124,8 @@ export default function RabReviewForm(props: {requestId: string}) { - Enter review... - Not Decided I recommend this proposal I recommend this proposal with conditions diff --git a/mcc/src/org/labkey/mcc/MccManager.java b/mcc/src/org/labkey/mcc/MccManager.java index 0fe8763b9..6a5542384 100644 --- a/mcc/src/org/labkey/mcc/MccManager.java +++ b/mcc/src/org/labkey/mcc/MccManager.java @@ -56,10 +56,10 @@ public enum RequestStatus Fulfilled(8, "Fulfilled", MccRequestAdminPermission.class), Withdrawn(9, "Withdrawn", MccRequestorPermission.class); - int sortOrder; - String label; - Class updatePermission; - Class insertPermission; + final int sortOrder; + final String label; + final Class updatePermission; + final Class insertPermission; RequestStatus(int sortOrder, String label, Class editPermission) {