Skip to main content

Mutating Variables

Recall from the Concepts Documentation that every Node can have zero or more VariableMutations on it. A VariableMutation changes the value of a ThreadRun's Variables.

You can add a VariableMutation at any point in your Thread Function by using the WorkflowThread#mutate() method or function.

Basic Structure

The WorkflowThread::Mutate() functions/methods take three arguments:

  1. A WfRunVariable which is the LHS to mutate.
  2. A VariableMutationType which specifies which mutation to execute.
  3. A WfRunVariable, NodeOutput, Object/interface/struct, or primitive type to serve as the RHS for the mutation.

The valid Mutation Types come from the VariableMutationType enum and are:

  • ASSIGN
  • ADD
  • SUBTRACT
  • DIVIDE
  • MULTIPLY
  • EXTEND
  • REMOVE_IF_PRESENT
  • REMOVE_KEY
  • REMOVE_INDEX

A description of each VariableType can be found on the protobuf documentation.

Examples

Here are some examples of mutating variables inside a WfSpec.

Hard-Coded Literal Value

Let's assign our variable foo to the hard-coded value of 3.

public void threadFunction(WorkflowThread thread) {
WfRunVariable foo = thread.addVariable("foo", VariableType.INT);
// ... optionally execute some tasks
thread.mutate(foo, VariableMutationType.ASSIGN, 3);
}

Using a NodeOutput

Let's say we have a TaskDef which returns an INT value, and we want to add that value to our WfRunVariable. To do that, we use the NodeOutput as the RHS.

This is analogous to the following pseudocode.

int myInt = 1;
myInt += doTask1();
public void threadFunction(WorkflowThread thread) {
WfRunVariable foo = thread.addVariable("foo", 3);
NodeOutput intOutput = thread.execute("some-task-that-returns-int");
thread.mutate(foo, VariableMutationType.ADD, intOutput);
}

Using other WfRunVariables

We can also use another WfRunVariable as the RHS. For example, if our LHS is a JSON_ARR, we append a STR variable to it as follows:

public void threadFunction(WorkflowThread thread) {
WfRunVariable strToAppend = thread.addVariable("string-to-append", VariableType.STR);
WfRunVariable myList = thread.addVariable("my-list", VariableType.JSON_ARR);

// ... execute some tasks

thread.mutate(myList, VariableMutationType.EXTEND, strToAppend);
}

Using JsonPath

Both NodeOutput and WfRunVariable have a #jsonPath() method.

If your LHS variable is of type JSON_ARR or JSON_OBJ, you can use WfRunVariable#jsonPath() to allow you to mutate a specific sub-field of your object or list. For eample, if I have a my-var variable as follows:

{
"foo": "bar",
"counter": 123
}

and I want to increment the counter field, I can do so as follows:

public void threadFunction(WorkflowThread thread) {
WfRunVariable myVar = thread.addVariable("my-var", VariableType.JSON_OBJ);
// ... execute some tasks
thread.mutate(myVar.jsonPath("$.foo"), VariableMutationType.ADD, 1);
}

You can also use .jsonPath() on the RHS to pick out a specific field of your RHS value.