Generic Functions in QPR ProcessAnalyzer: Difference between revisions
Line 709: | Line 709: | ||
* '''Priority''' (string): Defines the email message priority. Available values are ''High'', ''Normal'' (default) and ''Low''. More information: https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.mailpriority. | * '''Priority''' (string): Defines the email message priority. Available values are ''High'', ''Normal'' (default) and ''Low''. More information: https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.mailpriority. | ||
* '''DeliveryNotification''' (string): Defines the delivery notifications for the email message. Possible values are ''Delay'', ''Never'', ''None'', ''OnFailure'' and ''OnSuccess''. More information: https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.deliverynotificationoptions. | * '''DeliveryNotification''' (string): Defines the delivery notifications for the email message. Possible values are ''Delay'', ''Never'', ''None'', ''OnFailure'' and ''OnSuccess''. More information: https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.deliverynotificationoptions. | ||
* '''BodyEncoding''' (string): Defines encoding | * '''BodyEncoding''' (string): Defines encoding for the message body. Supported encodings are ''ASCIIEncoding'', ''UTF7Encoding'', ''UTF8Encoding'' (default), ''UnicodeEncoding'' and ''UTF32Encoding''. More information: https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding?redirectedfrom=MSDN&view=netcore-3.1#remarks. | ||
* '''SubjectEncoding''' (string): Defines encoding for the subject | * '''SubjectEncoding''' (string): Defines encoding for the message subject. Supported encodings are same as in the ''BodyEncoding'' property. Default value is ''UTF8Encoding''. | ||
Example: | Example: |
Revision as of 15:23, 2 October 2020
Aggregation functions
Following aggregation functions are available:
- Average: Average of the items (sum of items divided by count of items). Can be used for numbers, DateTimes and TimeSpans.
- Count: Number of items. Can be used for any type of data.
- Median: Median, i.e. the middle value of the sorted data. If there are even number of items, the average of the two middle items. Can be used for numbers, DateTimes and TimeSpans.
- Min: Lowest/first value in the data. Can be used for data that can be sorted.
- Max: Highest/last value in the data. Can be used for data that can be sorted.
- Percentile: Percentile value. Can be used for numbers, DateTimes and TimeSpans.
- Stdev: (Sample) standard deviation. Can be calculated for numbers, DateTimes and TimeSpans.
- Stdevp: (Population) standard deviation. Can be calculated for numbers, DateTimes and TimeSpans.
- Sum: Sum of the items. Can be used for numbers and TimeSpans.
- StringJoin: joins array of strings together. The first parameter is a string that is placed between the joined strings.
- Var: (Sample) variance. Can be used for numbers.
- Varp: (Population) variance. Can be used for numbers.
Examples:
Sum([3, 2, 4]) Returns: 9 Count([[1, 2], [3, 4, 5]]) Returns: [2, 3] Sum([[1, 2], [3, 4, 5]]) Returns: [3, 12] Percentile([1,2,3,4,5], 0.75) Return: 4 Sum([]) Returns: null StringJoin(", ", ["one", "two", "three"]) Returns: one, two, three
When aggregating numerical values, null values are treated as zeros. Nulls can be removed with RemoveNulls function. In the Min and Max functions, nulls are ignored. Null values can be removed before aggregating (the following example shows how).
Average([1, 5, null]) Returns: 2 Average(RemoveNulls([1, 5, null]) Returns: 3
Aggregation operations are performed to the leaf level. i.e. the deepest level in the hierarchy. When aggregating, the leaf level arrays are replaced by the aggregated values, and thus the depth of the hierarchy decreases by one. In addition to the aggregation functions, functions that modify the contents of leaf arrays (OrderBy, Distinct, ...), the operation will be performed separately for every leaf array.
OrderByValue([[4, 3], [2, 1]]) Returns: [[3, 4], [1, 2]]
Mathematical functions
Function | Parameters | Description |
---|---|---|
Abs (Number) | Number |
Calculates the absolute value of a specified number. Examples: Abs(4) Returns: 4 Abs(-2.7) Returns: 2.7 Abs(0) Returns: 0 |
Acos (Number) | Number |
Calculates the angle whose cosine is the specified number. The parameter is a number representing a cosine, which must be between -1 and 1. Examples: Acos(0.3584) Returns: 1.204242852965772 Acos(-0.3584) Returns: 1.9373498006240213 |
ArgMax (Object) |
|
Returns those objects in the array giving maximum values for the given expression when evaluated in the object's context. Examples: ArgMax([5, 1, 6, 4, 3, 3, 6, 5, 4, 1, 1], _) Returns: [6, 6] ArgMax(EventLogById(1).Cases, Duration) Returns: An array of cases having the longest duration. |
ArgMin (Object) |
|
Returns those objects in the array giving minimum values for the given expression when evaluated in the object's context. Examples: ArgMin([5, 1, 6, 4, 3, 3, 6, 5, 4, 1, 1], _) Returns: [1, 1, 1] ArgMin(EventLogById(1).Cases, Duration) Returns: An array of cases having the shortest duration. |
Asin (Number) | Number |
Calculates the angle whose sine is the specified number. The parameter is a number representing a sine, which must be between -1 and 1. Examples: Asin(-0.3584) Returns: 0.36655347382912462 Asin(+0.3584) Returns: -0.36655347382912462 |
Atan (Number) | Number |
Calculates the angle whose tangent is the specified number. Examples: Atan(1) Returns: 0.78539816339744828 Atan(-1) Returns: -0.78539816339744828 |
Ceiling (Integer) |
Number |
Returns the smallest integer that is greater than or equal to the specified number. Example: Ceiling(1.3) Returns: 2 |
Cos (Number) | Number |
Calculates the cosine of the specified angle measured in radians. Examples: Cos(1) Returns: 0.54030230586813977 Cos(-1) Returns: 0.54030230586813977 |
Exp (Number) | Number |
Calculates the e raised to the specified power. Examples: Exp(1) Returns: 2.7182818284590451 Exp(-1) Returns: 0.36787944117144233 |
Floor (Integer) |
Number |
Returns the largest integer that is less than or equal to the specified number. Example: Floor(1.9) Returns: 1 |
IEEERemainder (Number) |
|
Calculates the remainder resulting from the division of a specified number by another specified number. Uses formula: dividend - (divisor * Round(dividend / divisor)) Note that the formula is different than in the % operator, which uses formula: (Abs(dividend) - (Abs(divisor) * (Floor(Math.Abs(dividend) / Abs(divisor))))) * Sign(dividend) Examples: IEEERemainder(26, 4) Returns: 2 IEEERemainder(0, 0) Returns: NaN |
Log (Number) |
|
Calculates the logarithm of a specified number. If the second parameter is not provided, it's the natural logarithm (base e). The second parameter can be used to define another base for the logarithm. Examples: Log(5) Returns: 1.6094379124341003 Log(10, 2) Returns: 3.3219280948873626 |
Log10 (Number) |
Number |
Calculates the base 10 logarithm of a specified number. Examples: Log10(5) Returns: 0.69897000433601886 Log10(-5) Returns: NaN |
Pow (Number) |
|
Calculate a specified number raised to the specified power. Examples: Pow(5, 3) Returns: 125 Pow(-5, 3) Returns: -125 |
Round (Float) |
Number of decimals (Integer) |
For numbers, rounds the number to the specified number of decimal. Number of decimals can also be negative, in which case the number is rounded to the nearest tens, hundreds, thousands, etc. For DateTimes, rounds given date time by given time span or given number of seconds. Note that the number and DateTime to be rounded needs to be provided as a context object (not as a parameter). Examples: (1.254).Round(1) Returns: 1.3 (162.111111).Round(-2) Returns: 200 DateTime(2017, 1, 2, 3, 4, 5).Round(10) Returns: DateTime(2017, 1, 2, 3, 4, 10) DateTime(2017, 1, 2, 3, 4, 5).Round(TimeSpan(1)) Returns: DateTime(2017, 1, 2) |
Sign (Number) |
Number |
Calculates an integer that indicates the sign of a number, either -1, 0 or 1. Examples: Sign(10) Returns: 1 Sign(0) Returns: 0 Sign(10) Returns: -1 |
Sin (Number) |
Number |
Calculates the sine of the specified angle. Examples: Sin(3.14) Returns: 0.0015926529164868282 Sin(-3.14) Returns: -0.0015926529164868282 |
Sqrt (Number) |
Number |
Calculates the square root of a specified number. Examples: Sqrt(81) Returns: 9 Sqrt(0.9) Returns: 0.3 |
Tan (Number) |
Number |
Calculates the tangent of the specified angle. Examples: Tan(1) Returns: 1.5574077246549023 Tan(-1) Returns: -1.5574077246549023 |
Conversion functions
Function | Parameters | Description |
---|---|---|
ToFloat (Number) |
Object to convert |
Converts the given object to a decimal number. |
ToInteger (Integer) |
Object to convert |
Converts the given object into an integer. If the object can not be converted into an integer, an exception will be thrown. If the object as a decimal number, it will also be rounded to the nearest integer. Examples: ToInteger(1.234) Returns: 1 ToInteger(-1.5) Returns: -2 ToInteger(1313.6) Returns: 1314 ToInteger(123456789012345678) Returns: 123456789012345678 ToInteger("5") Returns: 5 ToInteger("-5") Returns: -5 |
ToString (String) |
|
Converts the given object to a string. The optional second parameter defines formatting that is needed when converting the following data types:
Examples: ToString(1) + " < " + ToString(2) Returns: "1 < 2". "Case=\'" + ToString(a) + "\'" Returns: "Case='<string representation of object a>'" ToString(DateTime(2017,1,2,3,4,5,6)) Returns: "2017-01-02T03:04:05" ToString(DateTime(2017,1,2,3,4,5,6), "dd.MM.yyyy") Returns "02.01.2017" ToString(1.2, "0.00") Returns "1.20" ToString(TimeSpan(16,4,3,17,250), "%d") Returns "16" |
Miscellaneous functions
Function | Parameters | Description |
---|---|---|
Where |
Condition expression |
Returns the context object if the given expression evaluates to true. Examples: [1,2,3,4].Where(_>2) Returns: [3,4] EventLogById(1).Cases.Where(Duration > TimeSpan(10)) Returns all cases where duration is more than 10 days (in eventlog id 1). EventLogById(1).Events.Where(Timestamp < DateTime(2020, 1,1)) Returns all events which occurred before 1.1.2020 (in eventlog id 1). |
If |
|
If the first parameter is true, returns the value of the second parameter. Otherwise returns the value of the third parameter. The function always evaluates only either the second or third parameter, but never both. Note that the function needs to starts with a capital letter, because otherwise it's interpreted as the if operator. Examples: If(Now.Second % 2 == 0, "Even second", "Odd second") Returns: "Event second" or "Odd second" depending on the time of the evaluation. For("i", 0, i < 10, i + 1, i).If(_ % 2 == 0, _, _remove) Returns: [0, 2, 4, 6, 8] |
RemoveNulls (Array) |
Array |
Removes all the supported null values from given hierarchical object. Never removes arrays containing removed null values. Returns given object with null values removed. Examples: RemoveNulls([1, [], [null], [2, _remove, [_empty, 3, 4], _empty, null, 5]]) Returns: [1, [], [], [2, [3, 4], 5]] RemoveNulls([""foo"":null, ""bar"":2, ""poof"": [1, _empty, 3]]) Returns: [ "foo": 0, "bar": 2, "poof": [ 1, 3 ] ] |
Catch |
|
Calculates the given expression and if any exceptions are thrown during the calculation, catches that exception and returns the given result. Note that this function does not catch any syntactical errors. Examples: Catch(1, 1234) Returns: 1 Catch(undefined, 1234) Returns: 1234 Catch([1,2].undefined, 1234) Returns: 1234 Catch(EventLogById(-1), 1234) Returns: 1234 |
AsParallel |
Additional parameters |
Performs all the following chaining operations in parallel to improve performance. Items are divided into parts which size is determined by the ParallelTaskSize parameter, and each part is executed as an independent task in parallel. Parallel execution has a certain cost, so it might not be optimal to run each item as a separate task (increase ParallelTaskSize to decrease number of tasks). On the other hand, to large ParallelTaskSize leads to too few parallel tasks, and then all processing capacity is not used. As a parameter, takes a dictionary that accepts optional property ParallelTaskSize, which is the size of the segments the root array will be split into. If the length of the input array is not divisible by ParallelTaskSize, the last segment will have less items than this configured value. The default size is 1. The AsParallel function call doesn't need to be part of the chaining, and thus it can be called before the chaining. Examples: Run several ODBC queries simultaneously: let regions = ["New York", "Los Angeles", "Dallas", "London"]; AsParallel(["ParallelTaskSize": 1]); regions.ImportOdbc("...", "SELECT * FROM [Data] Where Region = '" + _ + "'") Run a complex filtering operation for cases: Cases.AsParallel(["ParallelTaskSize": 1000]).Where(...) Sum(Sum(([NumberRange(1, 100)].AsParallel(["ParallelTaskSize": 1]).For("i", 0, i < 100000, i + 1, i))[0])) Returns: 499995000000 The same expression without parallel processing: Sum(Sum(NumberRange(1, 100).For("i", 0, i < 100000, i + 1, i))) Returns: 499995000000 Sum([NumberRange(1, 100)].AsParallel(["ParallelTaskSize": 1]).WriteLog(_)) Returns: 5050 In addition, outputs all the numbers from 1 to 100 into log file in the order in which the tasks were executed. The previous example can also be written like this: AsParallel(["ParallelTaskSize": 1]); Sum(NumberRange(1, 100).WriteLog(_)); Returns: 5050 Count((([el.Cases].AsParallel(["ParallelTaskSize": 1000]):AnalyzeConformance(cm))[0]).Where(_==null)) Returns the number of cases conforming to a design/conformance model cm. The same expression without parallel processing: Count((el.Cases:AnalyzeConformance(cm)).Where(_==null)) AsParallel(["ParallelTaskSize": 1]); el.Cases.Events.Type.Name Returns a hierarchical object having cases of given event log (el) as root objects and array of event type names of the events in each case in the order of occurrence. The expressions related to every case in the returned hierarchical object are processed in a separate independent task (thus, each task will process "Events.Type.Name" expression in a separate task where the root object is a case). |
IsNull (Boolean) |
Value to test (Object) |
Tests whether given object is null, _empty or _remove. Returns true if it is any of those. If given a hierarchical object, applies the function as described in at the leaf level. Examples: ForEach("item", [1, "a", null, _empty, _remove], IsNull(item)) Returns: [false, false, true, true, true] IsNull(["foo":[null,"a"], "bar":[2,null]]) Returns: [ HierarchicalArray("foo", [true, false]), HierarchicalArray("bar", [false, true]) ] |
IsNullTop (Boolean) |
Object to test (Object) |
Tests whether given object is null, _empty or _remove. Returns true if it is any of those. The function does not aggregate values in hierarchical objects. Examples: ForEach("item", [1, "a", null, _empty, _remove], IsNullTop(item)) Returns: [false, false, true, true, true] IsNullTop(["foo":[null,"a"], "bar":[2,null]]) Returns: false |
GroupBy |
|
Groups given array by given expressions. Returns the given array splitted into groups in a way that each specified group expression creates one level of hierarchical arrays having the root object the same as the group expression result. Examples: GroupBy([1,2,2,3,3,4,5,5,4,4,4], _) Returns: [[1:[1], 2:[2, 2], 3:[3, 3], 4:[4, 4, 4, 4], 5:[5,5]] |
GroupByValue | Array to group |
Groups all unique values in given array. Returns the given array in a format which has all the values in the original array only once as root objects and the root objects in the original array as contents of the arrays inside contexts. In a way, this just switches root objects of hierarchical arrays to be the actual values and actual values to be root objects (without duplicates). For every item in the array, the behavior is as follows:
Examples: GroupByValue([1,2,2,3,3,4,5,5,4,4,4]) Returns: (The same as GroupBy([1,2,2,3,3,4,5,5,4,4,4], _)) [1:[1], 2:[2, 2], 3:[3, 3], 4:[4, 4, 4, 4], 5:[5,5]] GroupByValue([1:["a","b"],2:["b","c"],3:["c"],4:["d","e"],5:["d","d","d"]]) Returns: ["a":[1], "b":[1, 2], "c":[2, 3], "d":[4, 5, 5, 5], "e":[4]] Get count of item "2" in the array: Let(\"groupped\", GroupByValue([1,2,4,1,4,2,3,3,2,4])); Count(GetValueOfContext(2, groupped)) Returns: 3 |
Coalesce |
|
Returns the second parameter if the first parameter is null or empty. If the the given object is a hierarchical object, all the leaf level values are coalesced separately. Examples: Coalesce(0, 1) Returns: 0 Coalesce(null, 1) Coalesce(_empty, 1) Coalesce(_remove, 1) All return: 1 Coalesce([[null, 1], [null, null]], 3) Returns: [[3, 1], [3, 3]] Coalesce([[null, 1], 2], 3) Returns: [[3, 1], null] Coalesce([1, [null, 2], null], 3) Returns: [1, [null, 2], 3] |
Transpose |
Matrix to transpose |
Transposes the given matrix. Examples: Transpose([[1,2], [3,4], [1,4]]) Returns: [[1, 3, 1], [2, 4, 4]] |
GarbageCollection | Calling this function performs a garbage collection in the QPR ProcessAnalyzer Server. The function returns the maximum generation before the garbage collection was run. This function is an experimental functionality, which purpose is to investigate the memory consumption and memory handling behavior of the QPR ProcessAnalyzer Server. | |
GetContext |
Hierarchical array |
Returns the context of given hierarchical array, i.e. list of keys in the object. If the given object is not an hierarchical array, returns null. Examples: GetContext("a":1) Returns: "a" ["a":1, "b":2, 2:3].GetContext(_) Returns: ["a", "b", 2] ([1,2,3]:(_*2)).GetContext(_) Returns: [1, 2, 3] ["a":1, 2, 3].GetContext(_) Returns: ["a", null, null] |
GetValueOfContext |
|
Returns the value of specified context object in given hierarchical array, i.e. the value behind the key. If the key if found multiple times, the first occurrence is returned. Returns _empty if the given key was not found. Examples: GetValueOfContext("bar", ["foo":1, "bar":2]) Returns: [2] GetValueOfContext("bar", ["foo":1, "bar":2, "bar":"second"]) Returns: [2] GetValueOfContext("test", ["foo":1, "bar":2]) Returns: _empty |
SendEmail | Parameters dictionary | Sends an email message using the provided parameters. SMTP server settings need to be configured to be able to send email messages. Following parameters are supported:
Example: SendEmail(#{ "From": "example.from@address.com", "To": ["recipient.one@address.com", "recipient.two@address.com", "recipient.three@address.com"], "Subject": "Example E-mail", "Body": "QPR ProcessAnalyzer example script started running" }); |
WriteLog |
message (String) |
Writes given text into QPR ProcessAnalyzer log file. The return value of the function is the provided message parameter. Examples: WriteLog("Calculation executed.") Writes to log: Calculation executed. Sum(WriteLog([1, 2, 3, 4])) Returns: 10 Also writes an entry into the log showing the [1, 2, 3, 4] -array in the pretty printed fashion. NumberRange(0, 4).(WriteLog("Iteration #" + (_ + 1)), _) Returns: [0, 1, 2, 3, 4] Also writes the following entries into log: Iteration #1 Iteration #2 Iteration #3 Iteration #4 Iteration #5 |
Ordering functions
Function | Parameters | Description |
---|---|---|
OrderBy (array) |
|
Orders the given array using values from the given order expression. The order expression is evaluated once for each item in the array. The order expression supports all atomic (=not collection) primitive value types. Examples: OrderBy(["a", "x", "b", "z", "n", "l", "a"], _) Return: ["a", "a", "b", "l", "n", "x", "z"] OrderBy([9,8,7,6,5,4,3,2,1], _%3) Returns: [9,6,3,7,4,1,8,5,2] OrderBy([9,8,7,6,5,4,3,2,1], _%3 + _/30) Returns: [3,6,9,1,4,7,2,5,8] |
OrderByDescending (array) |
|
Result is same as in the OrderBy function, except the order is reverse. |
OrderByTop (array) |
|
Orders given top-level array by the value of given expression using ascending order. Supports all value types, including multi-dimensional arrays. Order expression is evaluated in the context of each array item whose value determines the order of that item. Examples: OrderByTop([[1, 2, 3], [2, 2, 2], [3, 2, 1]], _[2]) Returns: [[3, 2, 1], [2, 2, 2], [1, 2, 3]] |
OrderByValue (array) |
|
Orders the given array using the natural order of items, for example numbers it's the increasing order, and for strings it's text ordering. OrderByValue(["a", "x", "b", "z", "n", "l", "a"]) Return: ["a", "a", "b", "l", "n", "x", "z"] |
OrderByValueDescending (array) |
|
Result is same as in the OrderByValue function, except the order is reverse. |
Looping functions
Function | Parameters | Description |
---|---|---|
For |
|
Iterates the given expression until the given condition is met, and returns the results of the iterated expressions for every iteration as an array. Examples: For("i", 0, i < 4, i + 1, i) Returns: [0, 1, 2, 3] For("x", 0, x < 3, x + 1, For("y", 0, y < 3, y + 1, StringJoin(",", [x, y])) Returns: [["0,0", "0,1", "0,2"], ["1,0", "1,1", "1,2"], ["2,0", "2,1", "2,2"]] For("i", 0, i < 4, i + 1, DateTime(2010 + i)) Returns: [DateTime(2010), DateTime(2011), DateTime(2012), DateTime(2013)] For("str", "a", str != "aaaaa", str + "a", str) Returns: ["a", "aa", "aaa", "aaaa"] |
ForEach |
|
Repeats the given expression as many times there are items in the given array. Item in the array is available as the given variable in the expression. Examples: ForEach("i", [1,2,3], "Value is: " + i) Returns: Value is: 1 Value is: 2 Value is: 3 ForEach("item", EventLogById(1).Cases, Let("c" + item.Name, item)) Results: Creates expression variable variables like "c<casename>" for every case in the model. ForEach("myVariable", ["a", "b", "c"], myVariable + myVariable) Returns: aa bb cc |
NumberRange |
|
Creates an array of numbers within given range with the given interval. Interval parameter is optional, and by default it is one. Examples: NumberRange(1, 3) Returns: [1, 2, 3] NumberRange(1, 3, 0.5) Returns: [1, 1.5, 2, 2.5, 3] NumberRange(1, 3, 0.8) Returns: [1, 1.8, 2.6] |
Repeat |
|
Repeats the defined expression the defined number of times. Examples: Repeat(3, "Repeat me!") Returns: "Repeat me!" "Repeat me!" "Repeat me!" Repeat(1, 5) Returns 5 |
TimeRange |
|
Generates a timestamp array starting from the start timestamp with the defined interval, and ending when the end timestamp is reached. Note that this function only creates timestamps with equal durations, so it's not possible to e.g. create timestamps for each month (to do that, you can use the loops). Generate datetimes starting from Monday 2017-01-01 and ending to Monday 2017-12-31 including all Mondays between them: Timerange(Datetime(2018,1,1), Datetime(2018,1,1), Timespan(7)) |
Recursion functions
Function | Parameters | Description |
---|---|---|
Recurse |
|
Evaluates the given expression recursively until given condition or recursion depth is met. The function returns all the traversed objects in a single array. When the stop condition expression evaluates to false, it will stop the current recursion without including the false evaluated object into the result. Default stop condition is !IsNull(_). The default maximum depth is 1000. Examples: (1).Recurse(_ + 1, _ < 5) Returns: [1, 2, 3, 4] event.Recurse(NextInCase) Returns: An array of all the events following given event inside the same case. event.Recurse(NextInCase, Type.Name != "Invoice") Returns: An array of all the events following given event inside the same case until event whose type name is "Invoice", which will itself not be included into the result. event.Recurse(NextInCase, Type.Name != "Invoice", 2) Returns: An array of all the events following given event inside the same case until event whose type name is "Invoice" or until the recursion depth of 2 has been reached, which will itself not be included into the result. |
RecurseWithHierarchy |
|
Evaluates the given expression recursively until given condition or recursion depth is met. The function returns the traversed object hierarchy. When the stop condition expression evaluates to false, it will stop the current recursion without including the false evaluated object into the result. Default stop condition is !IsNull(_). The default maximum depth is 1000. Examples: [1,2].RecurseWithHierarchy([1,2], false, 2) Returns: [1:[1:[1,2],2:[1,2]],2:[1:[1,2], 2:[1,2]]] (1).RecurseWithHierarchy(_ + 1, _ < 5) Returns: 1:[2:[3:[4]]] RemoveLeaves(eventLog.Flows:From.Where(IsNull(_))).To.RecurseWithHierarchy(OutgoingFlows.To, !IsNull(_), 2) Returns: A hierarchy consisting of all the starter events of given event log and recursively all the event types reachable from them via flows until depth of 2 is reached. |
RecursiveFind |
|
Evaluates given expression recursively until given condition or recursion depth is met. The function collects all the traversed objects that match the given find expression along the way. When the find condition expression evaluates to true for the current object, it causes the following:
When the stop condition expression evaluates to false, it will stop the current recursion without including the false evaluated object into the result. Default stop condition is !IsNull(_). The default maximum depth is 1000. Continue after finding tells should the recursion be continued after a match has been found in the current branch. Examples: (1).RecursiveFind(_ + 1, _ == 100) Returns: 100 eventLog.Cases:GetAt(0, Events).RecursiveFind(NextInCase, Organization=="Finance", !IsNull(_)) Returns: For each case, returns the first (by time) event whose organization equals to "Finance". eventLog.Cases:Events.Where(Organization=="Finance") eventLog.Cases:GetAt(0, Events).RecursiveFind(NextInCase, Organization=="Finance", true, true) Returns: Both return for each case all events whose organization equals to "Finance". |
Hierachical object functions
Function | Parameters | Description |
---|---|---|
FindRepeats |
|
Searches for repeating patterns in given array. Parameters:
Returns an array of arrays indicating the repeating patterns and their positions in the array formatted as follows:
Examples: FindRepeats([0, 1, 2, 0, 1, 2]) Returns: [ [[0, 1, 2], [0, 3]], [[0, 1], [0, 3]], [[1, 2], [1, 4]], [[0], [0, 3]], [[1], [1, 4]], [[2], [2, 5]] ] FindRepeats([0, 1, 2, 0, 1, 2], 0, true) Returns: [[[0, 1, 2], [0, 3]]] FindRepeats([1, "b", DateTime(2017), 1, "b", DateTime(2017)], 3) Returns: [[1, "b", DateTime(2017)], [0, 3]] |
Flatten |
|
Collects all the actual leaf values from given array, array of arrays or hierarchical object and returns them in a single array. If given a hierarchical object, this function collects actual leaf values instead of leaf level values. Elements in the returned array are in the same order they were found when traversing the input object using depth first search. When context object is included, should context objects in the internal nodes of a hierarchical object be also included into the result. Default is false. Examples: Flatten(1) Returns: 1 Flatten([1, 2]) Returns: [1,2] Flatten([[[1, 2],[3, 4]],[[5, 6]]]) Returns: [1, 2, 3, 4, 5, 6] Flatten([[1, 2], 3]) Returns: [1, 2, 3] Flatten([[1,2,3,4], null, [5], [1, null]]) Returns: [1, 2, 3, 4, null, 5, 1, null] Flatten(["a":1, "b":2]) Flatten(["a":1, "b":2], false) Returns: [1, 2] Flatten(["a":1, "b":2], true) Returns: ["a", 1, "b", 2] |
RemoveLeaves |
|
Remove one level of hierarchy from a hierarchical object replacing all the bottom level hierarchical arrays with the context objects of the hierarchical arrays. Returns the given object with all the bottom level hierarchical arrays with the context objects of the hierarchical arrays. Examples: RemoveLeaves(["foo":1, "bar":2]) Returns: ["foo", "bar"] RemoveLeaves(eventLog.Flows:From.Where(IsNull(_))) Results: All the flows starting the cases in the event log. |
ReplaceLeafValues |
|
Replace all leaf values of given array or hierarchical object at given levels up from the leaf level with results of given expression. Examples: ReplaceLeafValues([1,2, null], "x", If(IsNull(x), null, x+1), 0) Result: [2, 4, null] ReplaceLeafValues([[[1,2],[2,3]],[[3,4],[4,5]]], "x", Flatten(x), 0) Result: [[[[1],[2]],[[2],[3]]],[[[3],[4]],[[4],[5]]]] ReplaceLeafValues([[[1,2],[2,3]],[[3,4],[4,5]]], "x", Flatten(x), 1) Result: [[[1,2],[2,3]],[[3,4],[4,5]]] ReplaceLeafValues([[[1,2],[2,3]],[[3,4],[4,5]]], "x", Flatten(x), 2) Result: [[1,2,2,3],[3,4,4,5]] ReplaceLeafValues([[[1,2],[2,3]],[[3,4],[4,5]]], "x", Flatten(x), 3) Result: [1,2,2,3,3,4,4,5] |
SliceMiddle |
|
Extracts a continuous range of an array or hierarchical object. If given a hierarchical object, applies the function at the level that is specified levels level up from the leaf level. Start index: Negative value means that the index is counting from the end of the array. If array does not have element at this given index, empty array is returned. End index: not included into the extracted range. Negative value means that the index is counting from the end of the array. If array does not have element at this given index, all the elements to the end from the start index will be extracted. Levels up: At which level of the hierarchical object are we operating (number of levels up from the leaf level). Should be at least 1 (since 0 level does not contain arrays). Examples: SliceMiddle(1, 2, 1, [[0, 1, 2, 3], [4, 5, 6, 7]]) Returns: [[1], [5]] SliceMiddle(2, 4, 1, [[0, 1, 2, 3], [4, 5, 6, 7]]) Returns: [[2, 3], [6, 7]] SliceMiddle(0, 1, 2, [[0, 1, 2, 3], [4, 5, 6, 7]]) Returns: [0, 1, 2, 3] SliceMiddle(3, 5, 1, [0, 1, 2, 3, 4, 5, 6, 7]) Returns: [3, 4] SliceMiddle(-3, -1, 1, [0, 1, 2, 3, 4, 5, 6, 7]) Returns: [5, 6] SliceMiddle(3, -1, 1, [0, 1, 2, 3, 4, 5, 6, 7]) Returns: [3, 4, 5, 6] |
Variable handling functions
Function | Parameters | Description |
---|---|---|
Def |
|
Creates a new user defined function. Parameters starting from the second, are the parameters that user gives when calling the function. The last parameter is the expression to evaluate when the function is called. In that definition expression the named parameters are used. Instead of the Def function, a recommended way to define functions is the lambda syntax. Examples: Def("Inc", "a", a + 1); Inc(2); Returns: 3 Def("Add", "a", "b", a + b); [1, 2, 3].Add(_, 2); Returns: [3, 4, 5] Def("AddSelf", "b", _ + b); [1, 2, 3].AddSelf(2); Returns: [3, 4, 5] Def("Fib", "a", If(a < 2, 1, Fib(a - 1) + Fib(a - 2))); Fib(10); Returns: 89 |
Let |
|
Defines a user defined variable to the scope where the Let function is located. Note that the function name needs to starts with a capital letter, because otherwise it's interpreted as a let operator. Examples: Let("var1", "Orange"); "Value is " + var1; Returns: Value is Orange |
Set |
|
Sets a value for an existing user defined variable. The variable to set must have been created previously in some visible scope. Instead of the Set function, a recommended way to set variables, is the assignment operator. |
Variable |
|
Function to get a variable value. The function is needed when there are spaces in a variable name, because that variable cannot be referenced otherwise in the expressions. |