From 6d148a5edb1edce065b0f23ee2c884a500a6ec83 Mon Sep 17 00:00:00 2001 From: Gisli Magnusson Date: Mon, 26 Jan 2026 17:47:53 +0000 Subject: [PATCH] fix(ENGKNOW-3055): Fix replace on no matching columns. --- .../gorsat/Analysis/ReplaceAnalysis.scala | 26 ++++++++++--------- .../main/scala/gorsat/Commands/Replace.scala | 2 +- .../src/test/java/gorsat/UTestReplace.java | 9 +++++++ 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/gortools/src/main/scala/gorsat/Analysis/ReplaceAnalysis.scala b/gortools/src/main/scala/gorsat/Analysis/ReplaceAnalysis.scala index 2866f3a26..ea4259de4 100644 --- a/gortools/src/main/scala/gorsat/Analysis/ReplaceAnalysis.scala +++ b/gortools/src/main/scala/gorsat/Analysis/ReplaceAnalysis.scala @@ -72,18 +72,20 @@ case class ReplaceAnalysis(context: GorContext, executeNor: Boolean, paramString } override def process(r: Row): Unit = { - val cvp = ReplaceCvp(r) - try { - val columnValues = columnsToReplace.indices.map(i => { - cvp.replaceCol = columnsToReplace(i) - val exIx = if(i > expressions.length - 1) 0 else i - evalFunction(cvp, expressions(exIx), expressionTypes(exIx)) - }) - r.setColumns(columnsToReplace, columnValues.toArray) - } catch { - case e: GorParsingException => - val msg = s"Error in step: REPLACE $paramString\n${e.getMessage}" - throw new GorDataException(msg, -1, header, r.getAllCols.toString, e) + if (!columnsToReplace.isEmpty) { + val cvp = ReplaceCvp(r) + try { + val columnValues = columnsToReplace.indices.map(i => { + cvp.replaceCol = columnsToReplace(i) + val exIx = if (i > expressions.length - 1) 0 else i + evalFunction(cvp, expressions(exIx), expressionTypes(exIx)) + }) + r.setColumns(columnsToReplace, columnValues.toArray) + } catch { + case e: GorParsingException => + val msg = s"Error in step: REPLACE $paramString\n${e.getMessage}" + throw new GorDataException(msg, -1, header, r.getAllCols.toString, e) + } } super.process(r) } diff --git a/gortools/src/main/scala/gorsat/Commands/Replace.scala b/gortools/src/main/scala/gorsat/Commands/Replace.scala index 10c5f2871..aa14348b4 100644 --- a/gortools/src/main/scala/gorsat/Commands/Replace.scala +++ b/gortools/src/main/scala/gorsat/Commands/Replace.scala @@ -38,7 +38,7 @@ class Replace extends CommandInfo("REPLACE", val colNums = columnsFromHeader(colName, forcedInputHeader, executeNor).toArray val filteredColNums = colNums.filter(i => i>= 2) - if(filteredColNums.isEmpty) { + if(!colNums.isEmpty && filteredColNums.isEmpty) { throw new GorParsingException("REPLACE is not allowed on Chrom/Pos columns") } CommandParsingResult(ReplaceAnalysis(context, executeNor, formula, forcedInputHeader, filteredColNums), forcedInputHeader) diff --git a/gortools/src/test/java/gorsat/UTestReplace.java b/gortools/src/test/java/gorsat/UTestReplace.java index 1ae034f39..5b1a6265b 100644 --- a/gortools/src/test/java/gorsat/UTestReplace.java +++ b/gortools/src/test/java/gorsat/UTestReplace.java @@ -97,4 +97,13 @@ public void replaceStarWhenUsingNor() { "chrN\t0\t42\t42\t42\t42\n"; Assert.assertEquals(expected, res); } + + @Test + public void replaceNoExistingColumns() { + String query = "gorrow chr1,1 " + + "| replace Foo_* if(#rc='0','wt',#rc)"; + String result = TestUtils.runGorPipe(query); + Assert.assertEquals("chrom\tpos\nchr1\t1\n", result); + } + }