The JWT expression parser accepts the most common comparison operators as well as logical operators.
The main purpose of these operators is to construct complex logical comparisons by linking individual expressions.
The operators, their meaning and the applicable data types you can use them with are listed below. A comparison always returns a BOOLEAN value. All operators respect the case of the characters. When working with Lists, each elements' existence and its order are being evaluated. When working with Lists, each elements' existence and its order are being evaluated. When comparing lists, the exact number of occurence (cardinality) per element must match. The following comparison operators can be used with TEXT and TEXT LIST data types. All operators ignore the case of the characters. Below you find a comprehensive matrix of all operators and applicable data types. BOOLEAN NUMBER TEXT NUMBER LIST TEXT LIST ISSUE LIST MULTI-VALUE FIELD Things to be aware of Please be aware the both operators of the respective comparison must have the same data type. The only exceptions are the following: Operators The table below lists all logical operators that can be used for linking logical terms in an expression. Logical operators take logical terms (which return BOOLEAN values) as operands and can thus be built using: Operator Meaning A single logical term can be enclosed by brackets () in order to increase the readability of the expressions or to define a precedence which differs from the given one. Logical operators can also be written in lower case (e.g. The conditional operator It basically allows you to construct the following expression: IF boolean_expression The conditional operator is extremely helpful when being used in calculated fields. IF the priority of an issue is Blocker, THEN this function will return the TEXT "Please have a look at this issue immediately" ELSE it will return the TEXT "No stress, come back later". IF an issue does have a due date set (due date is not null), THEN this function will return the NUMBER of hours from the current date-time to the due date ELSE it will return the NUMBER IF a custom field (e.g. a select list) has a value of Red, THEN this function will return the text Color, ELSE it will return No color. IF the current time is between 21:00 and 7:00 THEN this function will return the TEXT "Night" , ELSE it will return the TEXT "Day".Comparison operators
Operator Meaning Examples (all examples return true
) =
equal to 1=1
true = true
[1, 2, 3] = [1, 2, 3]
["blue", "red", "green"] = ["blue", "red", "green"]
!=
not equal to 0 != 1
"HELLO" != "Hello"
%{issue.description} != "Hello"
true != false
[1, 2, 3] != [1, 3, 2]
["blue", "red", "green"] != ["blue", "green", "red"]
<
less than 1 < 2
"abc" < "bbc"
"abc" < "abcd"
>
greater than 2 > 1
"bbc" > "abc"
"abcd" > "abc"
<=
less than or equal to 3 <= 3
>=
greater than or equal to "Hello world! Hello *" >= "Hello world"
~
contains "Hello world!" ~ "world" #true. The text "world" is contained in the first text.
%{issue.components.leads} ~ %{system.currentUser} #checks whether "Component leads" contains the "Current user".
[1, 2, 3, 2, 2, 4] ~ [2, 1, 2] #true
["blue", "red", "green", "red", "white", "red"] ~ ["red", "green", "red"] #true
["green", "red"] ~ ["red", "green", "red"] #false
!~
does not contain "world" !~ "Hello world!" #false. The text "world" is contained in the first text.
%{issue.fixVersions} !~ %{issue.versions} #false if all "Affects version/s" are also selected as "Fix version/s".
[1, 2, 3, 2, 2, 4] !~ [2, 1, 1, 4] #true
["blue", "red", "green", "red", "red"] !~ ["red", "green", "green", "red"] #true
in
is contained in "world" in "Hello world!" #true. The text "world" is contained in the first text.
%{system.currentUser} in %{issue.components.leads} #true if current user is a component lead of any of the issue's components
[1, 1, 2] in [2, 1, 1, 1, 4] #true
["blue", "red", "red"] in ["red", "green", "blue", "red", "red"] #true
2 in [1, 2, 3] #true
"blue" in ["red, "blue", "white"] #true
not in
is not contained in "Hello world!" not in "world" #true
%{issue.versions} not in %{issue.fixVersions} #false if all "Affects version/s" are also selected as "Fix version/s".
[1, 1, 2, 2] not in [2, 1, 1, 1, 4] #true
["blue", "red", "red", "blue"] not in ["red", "blue", "red", "red"] #true
5 not in [1, 2, 3, 3, 4] #true
"orange" not in ["blue", "red", "white"] #true
any in
any element is in %{issue.versions} any in %{issue.fixVersions} # true if any selected "Affects version/s" has also been selected as "Fix version/s".
[1, 3] any in [3, 4, 5] #true
["blue", "white"] any in ["black", "white", "green"] #true
none in
no single element is in %{issue.versions} none in %{issue.fixVersions} #true if no selected "Affects version/s" has also been selected as "Fix version/s".
[1, 2] none in [3, 4, 5]
["blue", "red"] none in ["black", "white", "green"]
Parser expression Output Description ["blue", "red", "green", "red", "white", "red"] ~ ["red", "green", "red"]
true
This expression returns true
, since the element (text) red appears at least twice in the first list and the element (text) green occurs at least once in the first list.["green", "red"] ~ ["red", "green", "red"]
false
This expression returns false
, since the element (text) red does not appear twice in the first list. Operator Meaning Examples (all examples return true
)
=~
equal to
"HELLO" =~ "Hello" #true
"up" =~ "UP" #true
["blue", "red", "green"] =~ ["Blue", "RED", "Green"] #true
!=~
not equal to
" HELLO" !=~ "Hello" #false, since there is a whitespace in the first text
"up" !=~ "down" #true
("up" !=~ "UP") #false
["blue", "red"] !=~ ["Blue", "green"] #true
["blue", "red"] !=~ ["Red", "BLUE"] #true
["blue", "red", "green"] !=~ ["Blue", "RED", "Green"] #false
~~
contains
"Hello World!" ~~ "world" #true, checks whether a text contains a substring.
"A small step for a man" ~~ "STEP" #true, checks whether a text contains a substring.
["one", "two", "three"] ~~ ["TWO", "One"] #true, checks whether a text list contains all the elements of another text list.
!~~
does not contain
"Hello World!" !~~ "bye" , checks whether a string doesn't contain a substring.
"A small step for a man" !~~ "big" , checks whether a string doesn't contain a substring.
["one", "two", "three"] !~~ ["Four"] , checks whether a string list doesn't contain one element of another string list.
(["one", "two", "three"] !~~ ["TWO"]) = false
in~
is contained in
"world" in~ "Hello World!" , checks whether a substring is contained in another string.
"STEP" in~ "A small step for a man" , checks whether a substring is contained in another string.
["TWO", "One"] in~ ["one", "two", "three"] , checks whether all the elements of a string list are contained in another string list.
not in~
is not contained in
"bye" not in~ "Hello World!" , checks whether a substring is not contained in another string.
"big" not in~ "A small step for a man" , checks whether a substring is not contained in another string.
["Four"] not in~ ["one", "two", "three"] , checks whether any of the elements of a string list are not contained in another string list.
(["TWO"] not in~ ["one", "two", "three"]) = false
any in~
some element is in
["blue", "violet"] any in~ ["Blue", "Red", "Green"]
["Five", "One"] any in~ ["FOUR", "FIVE", "SIX"]"bye" not in~ "Hello World!" , checks whether a substring is not contained in another string.
"big" not in~ "A small step for a man" , checks whether a substring is not contained in another string.
["Four"] not in~ ["one", "two", "three"] , checks whether any of the elements of a string list are not contained in another string list.
(["TWO"] not in~ ["one", "two", "three"]) = false
none in~
no single element is in
["Orange"] any in~ ["red", "blue", "green"]
(["orange"] any in~ ["Red", "Orange"]) = false
Comparison Operator
=
X X X X X
!=
X X X X X X X
<
X X - - - -
>
- X X - - - -
<=
- X X - - - -
>=
- X X - - - -
~
- - X X X X X
!~
- - X X X X X
in
- - X X X X X
not in
- - X X X X X
any in
- - - X X X X
none in
- - - X X X X
=~
- - X - X - -
!=~
- - X - X - -
~~
- - X - X - -
!~~
- - X - X - -
in~
- - X - X - -
not in~
- - X - X - -
any in~
- - - - X - -
none in~
- - - - X - - ~, !~, in
and not in
can be used for checking a single element (number or string) against a NUMBER LIST or a TEXT LISTnull
.Remember Example Operators ~, !~, in
and not in
can be used for checking a single element (number or text) against a number list or a text list1 in [1, 2, 3]
["blue", "red"] ~ "blue" .
Operators ~, !~, in
and not in
when used with a text are useful to look for substrings in another string."I love coding" ~ "love"
"I don't like Mondays" !~ "Fridays"
"love" in "I love coding"
"Fridays" not in "I don't like Mondays".
Operators ~, !~, in
and not in
respect cardinality, i.e., container list must have at least the same number of elements as contained list.[1, 1] in [1, 1, 1]
[1, 1] not in [1, 2, 3] .
Operators =
and !=
, when used for comparing lists, require to have the same elements, with the same cardinality and the same order.[1, 2, 3] = [1, 2, 3]
[4, 5, 6] != [4, 6, 5] .
<, >, <=
and >=
work according to lexicographical order when comparing strings.Logical operators
NOT
or !
logical negation 1 (highest) AND
or &
logical conjunction 2 OR
or |
logical disjunction 3 XOR
exclusive or, i.e., a XOR b
is equivalent to a AND !b OR !a AND b
3 IMPLIES
or IMP
logical implication, i.e., a IMPLIES b
is equivalent to !a OR b
4 XNOR
or EQV
logical equivalence, i.e., a EQV b
is equivalent to a IMPLIES b AND b IMPLIES a
4 (lowest) and
, or
)Conditional operator (IF - THEN -ELSE)
?
:
is a powerful operator to construct conditional expressions.true
THEN term_1 ELSE term_2.<boolean_expression> ? <term_1> : <term_2>
Expression Description %{issue.priority} = "Highest" ? "Please have a look at this issue immediately" : "No stress, come back later"
{issue.duedate} != null ? ({...duedate} - {...currentDateTime}) / {HOUR} : 0
0
.%{issue.somefield} = "Red" ? "Color" : "No color"
timePart({...currentDateTime}, LOCAL) > 21:00 AND timePart({...currentDateTime}, LOCAL) < 7:00 ? "Night" : "Day"