Some examples of complex expressions - Gnorion/BizVR GitHub Wiki
NOTE: all the examples use literal value but in any place you see a literal value it may also be an attribute name or any expression (that returns an appropriate data type)
So expressions can be nested arbitrarily deep (not recommended)
| Expression | Result |
|---|---|
| IF THEN ELSE | |
| if 20 > 0 then "YES" else "NO" | ➔ "YES" |
| if (20 - (10 * 2)) > 0 then "YES" else "NO" | ➔ "NO" |
| if (2 ** 3) = 8 then "YES" else "NO" | ➔ "YES" |
| if (4 / 2) != 2 then "YES" else "NO" | ➔ "NO" |
| ITERATION | |
| for i in [1, 2, 3] return i * i | ➔ [1, 4, 9] |
| for i in 1..3 return i * i | ➔ [1, 4, 9] |
| for i in [1,2,3], j in [1,2,3] return i*j | ➔ [1, 2, 3, 2, 4, 6, 3, 6, 9] |
| for x in @"2021-01-01"..@"2021-01-03" return x + 1 | ➔ [date("2021-01-02"), date("2021-01-03"), date("2021-01-04")] |
| EXISTS | |
| some i in [1, 2, 3] satisfies i > 2 | ➔ true |
| some i in [1, 2, 3] satisfies i > 4 | ➔ false |
| FOR ALL | |
| every i in [1, 2, 3] satisfies i > 1 | ➔ false |
| every i in [1, 2, 3] satisfies i > 0 | ➔ true |
| IN | |
| 1 in [1..10] | ➔ true |
| 1 in (1..10] | ➔ false |
| 10 in [1..10] | ➔ true |
| 10 in [1..10) | ➔ false |
| BOOLEAN | |
| true and true | ➔ true |
| true and false and null | ➔ false |
| true and null and true | ➔ null |
| true or false or null | ➔ true |
| false or false | ➔ false |
| false or null or false | ➔ null |
| true or false and false | ➔ true |
| (true or false) and false | ➔ false |
| STRINGS | |
| "some" + "string" | ➔ "somestring" |
| "very" + "long" + "word" | ➔ "verylongword" |
| substring( "testing",3 ) | ➔ "sting" |
| substring( "testing",3,3 ) | ➔ "sti" |
| substring( "testing", -2, 1 ) | ➔ "n" |
| substring( "\U01F40Eab", 2 ) | ➔ "ab" |
| string length( "tes" ) | ➔ 3 |
| string length( "\U01F40Eab" ) | ➔ 3 |
| upper case( "aBc4" ) | ➔ "ABC4" |
| lower case( "aBc4" ) | ➔ "abc4" |
| substring before( "testing", "ing" ) | ➔ "test" |
| substring before( "testing", "xyz" ) | ➔ "" |
| substring after( "testing", "test" ) | ➔ "ing" |
| substring after( "", "a" ) | ➔ "" |
| replace( "banana", "a", "o" ) | ➔ "bonono" |
| replace( "abcd", "(ab) | (a)", "[1 |
| contains( "testing", "to" ) | ➔ false |
| starts with( "testing", "te" ) | ➔ true |
| ends with( "testing", "g" ) | ➔ true |
| matches( "teeesting", "^te*sting" ) | ➔ true |
| split( "John Doe", "\s" ) | ➔ ["John", "Doe"] |
| split( "a;b;c;;", ";" ) | ➔ ["a","b","c","",""] |
| string join(["a","b","c"], "and") | ➔ "a_and_b_and_c" |
| string join(["a","b","c"], "") | ➔ "abc" |
| string join(["a","b","c"], null) | ➔ "abc" |
| string join(["a"], "X") | ➔ "a" |
| string join(["a",null,"c"], "X") | ➔ "aXc" |
| string join([], "X") | ➔ "" |
| string join(["a","b","c"]) | ➔ "abc" |
| string join(["a",null,"c"]) | ➔ "ac" |
| string join([], "X") | ➔ "" |
| LISTS | |
| list contains( [1,2,3], 2 ) | ➔ true |
| list replace( [2, 4, 7, 8], 3, 6) | ➔ [2, 4, 6, 8] |
| list replace ( [2, 4, 7, 8], function(item, newItem) item < newItem, 5) | ➔ [5, 5, 7, 8] |
| count( [1,2,3] ) | ➔ 3 |
| count( [] ) | ➔ 0 |
| count( [1,[2,3]] ) | ➔ 2 |
| MATH | |
| min( [1,2,3] ) | ➔ 1 |
| min( 1 ) | ➔ 1 |
| min( [1] ) | ➔ 1 |
| max( 1,2,3 ) | ➔ 3 |
| max( [] ) | ➔ null |
| sum( [1,2,3] ) | ➔ 6 |
| sum( 1,2,3 ) | ➔ 6 |
| sum( 1 ) | ➔ 1 |
| sum( [] ) | ➔ null |
| mean( [1,2,3] ) | ➔ 2 |
| mean( 1,2,3 ) | ➔ 2 |
| mean( 1 ) | ➔ 1 |
| mean( [] ) | ➔ null |
| all( [false,null,true] ) | ➔ false |
| all( true ) | ➔ true |
| all( [true] ) | ➔ true |
| all( [] ) | ➔ true |
| all( 0 ) | ➔ null |
| any( [false,null,true] ) | ➔ true |
| any( false ) | ➔ false |
| any( [] ) | ➔ false |
| any( 0 ) | ➔ null |
| sublist( [4,5,6], 1, 2 ) | ➔ [4,5] |
| append( [1], 2, 3 ) | ➔ [1,2,3] |
| concatenate( [1,2],[3] ) | ➔ [1,2,3] |
| insert before( [1,3],1,2 ) | ➔ [2,1,3] |
| remove( [1,2,3], 2 ) | ➔ [1,3] |
| reverse( [1,2,3] ) | ➔ [3,2,1] |
| index of( [1,2,3,2],2 ) | ➔ [2,4] |
| union( [1,2],[2,3] ) | ➔ [1,2,3] |
| distinct values( [1,2,3,2,1] ) | ➔ [1,2,3] |
| flatten( [1,2],[3, 4] ) | ➔ [1,2,3,4] |
| product( [2, 3, 4] ) | ➔ 24 |
| product( [] ) | ➔ null |
| product( 2, 3, 4 ) | ➔ 24 |
| median( 8, 2, 5, 3, 4 ) | ➔ 4 |
| median( [6, 1, 2, 3] ) | ➔ 2.5 |
| median( [ ] ) | ➔ null |
| stddev( 2, 4, 7, 5 ) | ➔ 2.081665999466132735282297706979931 |
| stddev( [47] ) | ➔ null |
| stddev( 47 ) | ➔ null |
| stddev( [ ] ) | ➔ null |
| mode( 6, 3, 9, 6, 6 ) | ➔ [6] |
| mode( [6, 1, 9, 6, 1] ) | ➔ [1, 6] |
| mode( [ ] ) | ➔ [ ] |
| decimal( 1/3, 2 ) | ➔ .33 |
| decimal( 1.5, 0 ) | ➔ 2 |
| decimal( 2.5, 0 ) | ➔ 2 |
| decimal( 1.035, 2 ) | ➔ 1.04 |
| decimal( 1.045, 2 ) | ➔ 1.04 |
| decimal( 1.055, 2 ) | ➔ 1.06 |
| decimal( 1.065, 2 ) | ➔ 1.06 |
| floor( 1.5 ) | ➔ 1 |
| floor( -1.56, 1 ) | ➔ -1.6 |
| floor( -1.5 ) | ➔ -2 |
| ceiling( 1.5 ) | ➔ 2 |
| ceiling( -1.56, 1 ) | ➔ -1.5 |
| ceiling( -1.5 ) | ➔ -1 |
| round up( 5.5, 0 ) | ➔ 6 |
| round up( -5.5, 0 ) | ➔ -6 |
| round up( 1.121, 2 ) | ➔ 1.13 |
| round up( -1.126, 2 ) | ➔ -1.13 |
| round down( 5.5, 0 ) | ➔ 5 |
| round down( -5.5, 0 ) | ➔ -5 |
| round down( 1.121, 2 ) | ➔ 1.12 |
| round down( -1.126, 2 ) | ➔ -1.12 |
| round half up( 5.5, 0 ) | ➔ 6 |
| round half up( -5.5, 0 ) | ➔ -6 |
| round half up( 1.121, 2 ) | ➔ 1.12 |
| round half up( -1.126, 2 ) | ➔ -1.13 |
| round half down( 5.5, 0 ) | ➔ 5 |
| round half down( -5.5, 0 ) | ➔ -5 |
| round half down( 1.121, 2 ) | ➔ 1.12 |
| round half down( -1.126, 2 ) | ➔ -1.13 |
| abs( 10 ) | ➔ 10 |
| abs( -10 ) | ➔ 10 |
| abs( @"PT5H" ) | ➔ @"PT5H" |
| abs( @"-PT5H" ) | ➔ @"PT5H" |
| modulo( 12, 5 ) | ➔ 2 |
| modulo( -12,5 ) | ➔ 3 |
| modulo( 12,-5 ) | ➔ -3 |
| modulo( -12,-5 ) | ➔ -2 |
| modulo( 10.1, 4.5 ) | ➔ 1.1 |
| modulo( -10.1, 4.5 ) | ➔ 3.4 |
| modulo( 10.1, -4.5 ) | ➔ -3.4 |
| modulo( -10.1, -4.5 ) | ➔ -1.1 |
| sqrt( 16 ) | ➔ 4 |
| decimal( log( 10 ), 2 ) | ➔ 2.30 |
| decimal( exp( 5 ), 2 ) | ➔ 148.41 |
| odd( 5 ) | ➔ true |
| odd( 2 ) | ➔ false |
| even( 5 ) | ➔ false |
| even ( 2 ) | ➔ true |
| not( true ) | ➔ false |
| not( null ) | ➔ null |
| is( date( "2012-12-25" ), time( "23:00:50" ) ) | ➔ false |
| is( date( "2012-12-25" ), date( "2012-12-25" ) ) | ➔ true |
| is( time( "23:00:50z" ), time( "23:00:50" ) ) | ➔ false |
| is( time( "23:00:50z" ), time( "23:00:50+00:00" ) ) | ➔ true |
| before( 1, 10 ) | ➔ true |
| before( 10, 1 ) | ➔ false |
| before( 1, [1..10] ) | ➔ false |
| before( 1, (1..10] ) | ➔ true |
| before( 1, [5..10] ) | ➔ true |
| before( [1..10], 10 ) | ➔ false |
| before( [1..10), 10 ) | ➔ true |
| before( [1..10], 15 ) | ➔ true |
| before( [1..10], [15..20] ) | ➔ true |
| before( [1..10], [10..20] ) | ➔ false |
| before( [1..10), [10..20] ) | ➔ true |
| before( [1..10], (10..20] ) | ➔ true |
| before( "@2020-01-01", ["@2021-01-01".."@2022-01-01"]) | ➔ true |
| before( "@2024-01-01", ["@2021-01-01".."@2022-01-01"]) | ➔ false |
| after( 10, 5 ) | ➔ true |
| after( 5, 10 ) | ➔ false |
| after( 12, [1..10] ) | ➔ true |
| after( 10, [1..10) ) | ➔ true |
| after( 10, [1..10] ) | ➔ false |
| after( [11..20], 12 ) | ➔ false |
| after( [11..20], 10 ) | ➔ true |
| after( (11..20], 11 ) | ➔ true |
| after( [11..20], 11 ) | ➔ false |
| after( [11..20], [1..10] ) | ➔ true |
| after( [1..10], [11..20] ) | ➔ false |
| after( [11..20], [1..11) ) | ➔ true |
| after( (11..20], [1..11] ) | ➔ true |
| after( "@2020-01-01", ["@2021-01-01".."@2022-01-01"]) | ➔ false |
| after( "@2024-01-01", ["@2021-01-01".."@2022-01-01"]) | ➔ true |
| meets( [1..5], [5..10] ) | ➔ true |
| meets( [1..5), [5..10] ) | ➔ false |
| meets( [1..5], (5..10] ) | ➔ false |
| meets( [1..5], [6..10] ) | ➔ false |
| met by( [5..10], [1..5] ) | ➔ true |
| met by( [5..10], [1..5) ) | ➔ false |
| met by( (5..10], [1..5] ) | ➔ false |
| met by( [6..10], [1..5] ) | ➔ false |
| overlaps( [1..5], [3..8] ) | ➔ true |
| overlaps( [3..8], [1..5] ) | ➔ true |
| overlaps( [1..8], [3..5] ) | ➔ true |
| overlaps( [3..5], [1..8] ) | ➔ true |
| overlaps( [1..5], [6..8] ) | ➔ false |
| overlaps( [6..8], [1..5] ) | ➔ false |
| overlaps( [1..5], [5..8] ) | ➔ true |
| overlaps( [1..5], (5..8] ) | ➔ false |
| overlaps( [1..5), [5..8] ) | ➔ false |
| overlaps( [1..5), (5..8] ) | ➔ false |
| overlaps( [5..8], [1..5] ) | ➔ true |
| overlaps( (5..8], [1..5] ) | ➔ false |
| overlaps( [5..8], [1..5) ) | ➔ false |
| overlaps( (5..8], [1..5) ) | ➔ false |
| overlaps before( [1..5], [3..8] ) | ➔ true |
| overlaps before( [1..5], [6..8] ) | ➔ false |
| overlaps before( [1..5], [5..8] ) | ➔ true |
| overlaps before( [1..5], (5..8] ) | ➔ false |
| overlaps before( [1..5), [5..8] ) | ➔ false |
| overlaps before( [1..5), (1..5] ) | ➔ true |
| overlaps before( [1..5], (1..5] ) | ➔ true |
| overlaps before( [1..5), [1..5] ) | ➔ false |
| overlaps before( [1..5], [1..5] ) | ➔ false |
| overlaps after( [3..8], [1..5] ) | ➔ true |
| overlaps after( [6..8], [1..5] ) | ➔ false |
| overlaps after( [5..8], [1..5] ) | ➔ true |
| overlaps after( (5..8], [1..5] ) | ➔ false |
| overlaps after( [5..8], [1..5) ) | ➔ false |
| overlaps after( (1..5], [1..5) ) | ➔ true |
| overlaps after( (1..5], [1..5] ) | ➔ true |
| overlaps after( [1..5], [1..5) ) | ➔ false |
| overlaps after( [1..5], [1..5] ) | ➔ false |
| overlaps after( (1..5), [1..5] ) | ➔ false |
| overlaps after( (1..5], [1..6] ) | ➔ false |
| overlaps after( (1..5], (1..5] ) | ➔ false |
| overlaps after( (1..5], [2..5] ) | ➔ false |
| finishes( 10, [1..10] ) | ➔ true |
| finishes( 10, [1..10) ) | ➔ false |
| finishes( [5..10], [1..10] ) | ➔ true |
| finishes( [5..10), [1..10] ) | ➔ false |
| finishes( [5..10), [1..10) ) | ➔ true |
| finishes( [1..10], [1..10] ) | ➔ true |
| finishes( (1..10], [1..10] ) | ➔ true |
| finished by( [1..10], 10 ) | ➔ true |
| finished by( [1..10), 10 ) | ➔ false |
| finished by( [1..10], [5..10] ) | ➔ true |
| finished by( [1..10], [5..10) ) | ➔ false |
| finished by( [1..10), [5..10) ) | ➔ true |
| finished by( [1..10], [1..10] ) | ➔ true |
| finished by( [1..10], (1..10] ) | ➔ true |
| includes( [1..10], 5 ) | ➔ true |
| includes( [1..10], 12 ) | ➔ false |
| includes( [1..10], 1 ) | ➔ true |
| includes( [1..10], 10 ) | ➔ true |
| includes( (1..10], 1 ) | ➔ false |
| includes( [1..10), 10 ) | ➔ false |
| includes( [1..10], [4..6] ) | ➔ true |
| includes( [1..10], [1..5] ) | ➔ true |
| includes( (1..10], (1..5] ) | ➔ true |
| includes( [1..10], (1..10) ) | ➔ true |
| includes( [1..10), [5..10) ) | ➔ true |
| includes( [1..10], [1..10) ) | ➔ true |
| includes( [1..10], (1..10] ) | ➔ true |
| includes( [1..10], [1..10] ) | ➔ true |
| starts( 1, [1..10] ) | ➔ true |
| starts( 1, (1..10] ) | ➔ false |
| starts( 2, [1..10] ) | ➔ false |
| starts( [1..5], [1..10] ) | ➔ true |
| starts( (1..5], (1..10] ) | ➔ true |
| starts( (1..5], [1..10] ) | ➔ false |
| starts( [1..5], (1..10] ) | ➔ false |
| starts( [1..10], [1..10] ) | ➔ true |
| starts( [1..10), [1..10] ) | ➔ true |
| starts( (1..10), (1..10) ) | ➔ true |
| started by( [1..10], 1 ) | ➔ true |
| started by( (1..10], 1 ) | ➔ false |
| started by( [1..10], 2 ) | ➔ false |
| started by( [1..10], [1..5] ) | ➔ true |
| started by( (1..10], (1..5] ) | ➔ true |
| started by( [1..10], (1..5] ) | ➔ false |
| started by( (1..10], [1..5] ) | ➔ false |
| started by( [1..10], [1..10] ) | ➔ true |
| started by( [1..10], [1..10) ) | ➔ true |
| started by( (1..10), (1..10) ) | ➔ true |
| coincides( 5, 5 ) | ➔ true |
| coincides( 3, 4 ) | ➔ false |
| coincides( [1..5], [1..5] ) | ➔ true |
| coincides( (1..5), [1..5] ) | ➔ false |
| coincides( [1..5], [2..6] ) | ➔ false |
| TEMPORAL | |
| day of year( date(2019, 9, 17) ) | ➔ 260 |
| day of week( date(2019, 9, 17) ) | ➔ "Tuesday" |
| Month of year( date(2019, 9, 17) ) | ➔ "September" |
| week of year( date(2019, 9, 17) ) | ➔ 38 |
| week of year( date(2003, 12, 29) ) | ➔ 1 |
| week of year( date(2004, 1, 4) ) | ➔ 1 |
| week of year( date(2005, 1, 1) ) | ➔ 53 |
| week of year( date(2005, 1, 3) ) | ➔ 1 |
| week of year( date(2005, 1, 9) ) | ➔ 1 |
| list | |
| sort( list: [3,1,4,5,2], precedes: function(x,y) x < y ) | ➔ [1,2,3,4,5] |
| get value( {key1 : "value1"}, "key1" ) | ➔ "value1" |
| get value( {key1 : "value1"}, "unexistent-key" ) | ➔ null |
| get entries( {key1 : "value1", key2 : "value2"} ) | ➔ [ { key : "key1", value : "value1" }, {key : "key2", value : "value2"} ] |
| context([{key:"a", value:1}, {key:"b", value:2}]) | ➔ {a:1, b:2} |
| context([{key:"a", value:1}, {key:"b", value:2, something: "else"}]) | ➔ {a:1, b:2} |
| context([{key:"a", value:1}, {key:"b"}]) | ➔ null |
| context put({x:1}, "y", 2) | ➔ {x:1, y:2} |
| context put({x:1, y:0}, "y", 2) | ➔ {x:1, y:2} |
| context put({x:1, y:0, z:0}, "y", 2) | ➔ {x:1, y:2, z:0} |
| context put({x:1}, ["y"], 2) | ➔ context put({x:1}, "y", 2) |
| context put({x:1}, ["y"], 2) | ➔ {x:1, y:2} |
| context put({x:1, y: {a: 0} }, ["y", "a"], 2) | ➔ context put({x:1, y: {a: 0} }, "y", context put({a: 0}, ["a"], 2)) |
| context put({x:1, y: {a: 0} }, ["y", "a"], 2) | ➔ {x:1, y: {a: 2} } |
| context put({x:1, y: {a: 0} }, [], 2) | ➔ null |
| context merge([{x:1}, {y:2}]) | ➔ {x:1, y:2} |
| context merge([{x:1, y:0}, {y:2}]) | ➔ {x:1, y:2} |
| date( "2012-12-25" ) - date( "2012-12-24" ) | ➔ duration( "P1D" ) |
| date(date and time( "2012-12-25T11:00:00Z" )) | ➔ date( "2012-12-25" ) |
| date( 2012, 12, 25 ) | ➔ date( "2012-12-25" ) |
| date and time ( "2012-12-24T23:59:00" ) | ➔ date and time(date( "2012-12-24" ), time( "23:59:00" )) |
| date and time( "2012-12-24T23:59:00" ) + duration( "PT1M" ) | ➔ date and time( "2012-12-25T00:00:00" ) |
| time( "23:59:00z" ) + duration( "PT2M" ) | ➔ time( "00:01:00@Etc/UTC" ) |
| time(date and time( "2012-12-25T11:00:00Z" )) | ➔ time( "11:00:00Z" ) |
| time( "23:59:00z" ) | ➔ time(23, 59, 0, duration( "PT0H" )) |
| number( "1 000,0", " ", "," ) | ➔ number( "1,000.0", ",", "." ) |
| string( 1.1 ) | ➔ "1.1" |
| string( null ) | ➔ null |
| date and time( "2012-12-24T23:59:00" ) - date and time( "2012-12-22T03:45:00" ) | ➔ duration( "P2DT20H14M" ) |
| duration( "P2Y2M" ) | ➔ duration( "P26M" ) |
| years and months duration( date( "2011-12-22" ), date( "2013-08-24" ) ) | ➔ duration( "P1Y8M" ) |
| now() | |
| today() | |
| invoke("http://namespace_of_model","my model name","my decision name", { a:1, b:2 }) |