Conditionals

Conditionals are expressed in two different ways in Juttle, depending on whether they occur in function context, or in flowgraph context.

Functions and reducers support standard if/else syntax for branching on condition.

Flowgraphs and subs do not support if/else and instead can be forked using the filter proc to create conditional branch execution.

Both functions/reducers and flowgraphs/subs support the ternary ? operator for conditional assignments, and its shortcut ?? version, see operators.

Note that multiple conditions inside functions/reducers can be joined with either AND/OR or &&/||, but different logic applies, as the latter are short-circuiting, see examples for operators.

In filter expressions, only AND/OR/NOT syntax can be used to join multiple conditions, see examples for filter expressions.

Example 1: direct conditional forking of the flowgraph

emit -from :-1m: -limit 10 | put value=count()
| put highs = value - 5
| (
filter highs > 0 | reduce count_highs = count();
filter highs <= 0 | reduce count_lows = count()
)

Example 2: conditional forking of the flowgraph with if/else logic in a function

function is_high(v) {
if (v > 5) {
return true;
}
else {
return false;
}
}

emit -from :-1m: -limit 10 | put value=count()
| put high = is_high(value)
| (
filter high = true | reduce count_highs = count();
filter high = false | reduce count_lows = count()
)

Example 3: use of a ternary operator inside the function

function is_high(v) {
return (v > 5) ? true : false;
}

emit -from :-1m: -limit 10
| put value=count()
| put high = is_high(value)
| (
filter high = true | reduce count_highs = count();
filter high = false | reduce count_lows = count()
)

Example 4: use of a ternary operator for conditional assignment in a flowgraph

emit -from :-1m: -limit 10
| put value=count()
| put high = (value > 5) ? true : false
| (
filter high = true | reduce count_highs = count();
filter high = false | reduce count_lows = count()
)

Example 5: use of a reducer for conditional computation

reducer count_highs(v) {
var count = 0;
function update() {
// field dereferencing to get value *v from field name v
if (*v > 5) {
count = count + 1;
}
}
function result() {
return count;
}
}

reducer count_lows(v) {
var count = 0;
function update() {
if (*v <= 5) {
count = count + 1;
}
}
function result() {
return count;
}
}

emit -from :-1m: -limit 10 | put value=count()
| reduce high = count_highs(value), low = count_lows(value);