Skip to content

Commit c6e85d9

Browse files
jgainerdewarsalonishah11
authored andcommitted
WX-964 suffix() (#7363)
1 parent 5059513 commit c6e85d9

File tree

33 files changed

+234
-5
lines changed

33 files changed

+234
-5
lines changed

centaur/src/main/resources/standardTestCases/biscayne_new_engine_functions.test

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,8 @@ metadata {
5454
"outputs.biscayne_new_engine_functions.bigIntFloatComparison": 10.0
5555
"outputs.biscayne_new_engine_functions.minMaxIntFloatComposition": 1.0
5656
"outputs.biscayne_new_engine_functions.maxIntVsMaxFloat": 1.79769313E+308
57+
58+
"outputs.biscayne_new_engine_functions.with_suffixes.0": "aaaS"
59+
"outputs.biscayne_new_engine_functions.with_suffixes.1": "bbbS"
60+
"outputs.biscayne_new_engine_functions.with_suffixes.2": "cccS"
5761
}

centaur/src/main/resources/standardTestCases/wdl_biscayne/biscayne_new_engine_functions/biscayne_new_engine_functions.wdl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ workflow biscayne_new_engine_functions {
44

55
meta {
66
description: "This test makes sure that these functions work in a real workflow"
7-
functions_under_test: [ "keys", "as_map", "as_pairs", "collect_by_key" ]
7+
functions_under_test: [ "keys", "as_map", "as_pairs", "collect_by_key", "suffix" ]
88
}
99

1010
Map[String, Int] x_map_in = {"a": 1, "b": 2, "c": 3}
@@ -15,6 +15,8 @@ workflow biscayne_new_engine_functions {
1515

1616
Array[Pair[String,Int]] z_pairs_in = [("a", 1), ("b", 2), ("a", 3)]
1717

18+
Array[String] some_strings = ["aaa", "bbb", "ccc"]
19+
1820
Int smallestInt = 1
1921
Float smallFloat = 2.718
2022
Float bigFloat = 3.141
@@ -48,6 +50,10 @@ workflow biscayne_new_engine_functions {
4850
Float bigIntFloatComparison = max(bigFloat, biggestInt) # 10.0
4951
Float minMaxIntFloatComposition = min(max(biggestInt, smallFloat), smallestInt) # 1.0
5052
Float maxIntVsMaxFloat = max(maxInt, maxFloat)
53+
54+
# suffix():
55+
# =================================================
56+
Array[String] with_suffixes = suffix("S", some_strings)
5157
}
5258
}
5359

wdl/model/draft3/src/main/scala/wdl/model/draft3/elements/ExpressionElement.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,12 @@ object ExpressionElement {
164164
override def arg1: ExpressionElement = prefix
165165
override def arg2: ExpressionElement = array
166166
}
167+
168+
final case class Suffix(suffix: ExpressionElement, array: ExpressionElement) extends TwoParamFunctionCallElement {
169+
override def arg1: ExpressionElement = suffix
170+
override def arg2: ExpressionElement = array
171+
}
172+
167173
final case class Min(arg1: ExpressionElement, arg2: ExpressionElement) extends TwoParamFunctionCallElement
168174
final case class Max(arg1: ExpressionElement, arg2: ExpressionElement) extends TwoParamFunctionCallElement
169175
final case class Sep(arg1: ExpressionElement, arg2: ExpressionElement) extends TwoParamFunctionCallElement

wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/ast2wdlom/AstToNewExpressionElements.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package wdl.transforms.biscayne.ast2wdlom
33
import cats.syntax.validated._
44
import common.validation.ErrorOr.ErrorOr
55
import wdl.model.draft3.elements.ExpressionElement
6-
import wdl.model.draft3.elements.ExpressionElement.{AsMap, AsPairs, CollectByKey, Keys, Max, Min, Sep}
6+
import wdl.model.draft3.elements.ExpressionElement.{AsMap, AsPairs, CollectByKey, Keys, Max, Min, Sep, Suffix}
77
import wdl.transforms.base.ast2wdlom.AstNodeToExpressionElement
88

99
object AstToNewExpressionElements {
@@ -15,6 +15,7 @@ object AstToNewExpressionElements {
1515
"min" -> AstNodeToExpressionElement.validateTwoParamEngineFunction(Min, "min"),
1616
"max" -> AstNodeToExpressionElement.validateTwoParamEngineFunction(Max, "max"),
1717
"sep" -> AstNodeToExpressionElement.validateTwoParamEngineFunction(Sep, "sep"),
18+
"suffix" -> AstNodeToExpressionElement.validateTwoParamEngineFunction(Suffix, "suffix"),
1819
"read_object" -> (_ =>
1920
"read_object is no longer available in this WDL version. Consider using read_json instead".invalidNel
2021
),

wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/consumed/BiscayneExpressionValueConsumers.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@ object BiscayneExpressionValueConsumers {
5858
expressionValueConsumer.expressionConsumedValueHooks(a.arg2)(expressionValueConsumer)
5959
}
6060

61+
implicit val suffixExpressionValueConsumer: ExpressionValueConsumer[Suffix] = new ExpressionValueConsumer[Suffix] {
62+
override def expressionConsumedValueHooks(a: Suffix)(implicit
63+
expressionValueConsumer: ExpressionValueConsumer[ExpressionElement]
64+
): Set[UnlinkedConsumedValueHook] =
65+
expressionValueConsumer.expressionConsumedValueHooks(a.arg1)(expressionValueConsumer) ++
66+
expressionValueConsumer.expressionConsumedValueHooks(a.arg2)(expressionValueConsumer)
67+
}
68+
6169
implicit val noneLiteralExpressionValueConsumer: ExpressionValueConsumer[NoneLiteralElement.type] =
6270
new ExpressionValueConsumer[NoneLiteralElement.type] {
6371
override def expressionConsumedValueHooks(a: NoneLiteralElement.type)(implicit

wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/consumed/consumed.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ package object consumed {
8181
case a: Length => a.expressionConsumedValueHooks(expressionValueConsumer)
8282
case a: Flatten => a.expressionConsumedValueHooks(expressionValueConsumer)
8383
case a: Prefix => a.expressionConsumedValueHooks(expressionValueConsumer)
84+
case a: Suffix => a.expressionConsumedValueHooks(expressionValueConsumer)
8485
case a: SelectFirst => a.expressionConsumedValueHooks(expressionValueConsumer)
8586
case a: SelectAll => a.expressionConsumedValueHooks(expressionValueConsumer)
8687
case a: Defined => a.expressionConsumedValueHooks(expressionValueConsumer)

wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/files/BiscayneFileEvaluators.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package wdl.transforms.biscayne.linking.expression.files
22

3-
import wdl.model.draft3.elements.ExpressionElement.{AsMap, AsPairs, CollectByKey, Keys, Max, Min, Sep}
3+
import wdl.model.draft3.elements.ExpressionElement.{AsMap, AsPairs, CollectByKey, Keys, Max, Min, Sep, Suffix}
44
import wdl.model.draft3.graph.expression.FileEvaluator
55
import wdl.transforms.base.linking.expression.files.EngineFunctionEvaluators
66
import wdl.transforms.base.linking.expression.files.EngineFunctionEvaluators.twoParameterFunctionPassthroughFileEvaluator
@@ -16,6 +16,7 @@ object BiscayneFileEvaluators {
1616
EngineFunctionEvaluators.singleParameterPassthroughFileEvaluator
1717

1818
implicit val sepFunctionEvaluator: FileEvaluator[Sep] = twoParameterFunctionPassthroughFileEvaluator[Sep]
19+
implicit val suffixFunctionEvaluator: FileEvaluator[Suffix] = twoParameterFunctionPassthroughFileEvaluator[Suffix]
1920

2021
implicit val minFunctionEvaluator: FileEvaluator[Min] = twoParameterFunctionPassthroughFileEvaluator[Min]
2122
implicit val maxFunctionEvaluator: FileEvaluator[Max] = twoParameterFunctionPassthroughFileEvaluator[Max]

wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/files/files.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ package object files {
135135
case a: Flatten =>
136136
a.predictFilesNeededToEvaluate(inputs, ioFunctionSet, coerceTo)(fileEvaluator, valueEvaluator)
137137
case a: Prefix => a.predictFilesNeededToEvaluate(inputs, ioFunctionSet, coerceTo)(fileEvaluator, valueEvaluator)
138+
case a: Suffix => a.predictFilesNeededToEvaluate(inputs, ioFunctionSet, coerceTo)(fileEvaluator, valueEvaluator)
138139
case a: SelectFirst =>
139140
a.predictFilesNeededToEvaluate(inputs, ioFunctionSet, coerceTo)(fileEvaluator, valueEvaluator)
140141
case a: SelectAll =>

wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/BiscayneTypeEvaluators.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package wdl.transforms.biscayne.linking.expression.types
22

3+
import cats.implicits.catsSyntaxTuple2Semigroupal
34
import cats.syntax.validated._
45
import common.validation.ErrorOr._
56
import wdl.model.draft3.elements.ExpressionElement
@@ -100,4 +101,13 @@ object BiscayneTypeEvaluators {
100101

101102
}
102103
}
104+
105+
implicit val suffixFunctionEvaluator: TypeEvaluator[Suffix] = new TypeEvaluator[Suffix] {
106+
override def evaluateType(a: Suffix, linkedValues: Map[UnlinkedConsumedValueHook, GeneratedValueHandle])(implicit
107+
expressionTypeEvaluator: TypeEvaluator[ExpressionElement]
108+
): ErrorOr[WomType] =
109+
(validateParamType(a.suffix, linkedValues, WomStringType),
110+
validateParamType(a.array, linkedValues, WomArrayType(WomStringType))
111+
) mapN { (_, _) => WomArrayType(WomStringType) }
112+
}
103113
}

wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ package object types {
8383
case a: Length => a.evaluateType(linkedValues)(typeEvaluator)
8484
case a: Flatten => a.evaluateType(linkedValues)(typeEvaluator)
8585
case a: Prefix => a.evaluateType(linkedValues)(typeEvaluator)
86+
case a: Suffix => a.evaluateType(linkedValues)(typeEvaluator)
8687
case a: SelectFirst => a.evaluateType(linkedValues)(typeEvaluator)
8788
case a: SelectAll => a.evaluateType(linkedValues)(typeEvaluator)
8889
case a: Defined => a.evaluateType(linkedValues)(typeEvaluator)

0 commit comments

Comments
 (0)