QPR ProcessAnalyzer Expressions: Difference between revisions
Line 48: | Line 48: | ||
== Basic arithmetic operations == | == Basic arithmetic operations == | ||
* '''Addition (+)''' can be performed on numeric types, strings (concatenation) and [[ | * '''Addition (+)''' can be performed on numeric types, strings (concatenation) and [[Object_Specific_Properties_and_Functions_in_QPR_ProcessAnalyzer_Expressions#TimeSpan|TimeSpans]] (addition of two TimeSpans). | ||
* '''Subtraction (-)''' can be performed on numeric types (arithmetic subtraction), [[ | * '''Subtraction (-)''' can be performed on numeric types (arithmetic subtraction), [[Object_Specific_Properties_and_Functions_in_QPR_ProcessAnalyzer_Expressions#DateTime|DateTimes]] (calculating TimeSpan between two DateTimes) and TimeSpan object. | ||
* '''Multiplication (*)''' can be performed on numeric types, TimeSpan and numeric type (multiplying TimeSpan resulting TimeSpan), | * '''Multiplication (*)''' can be performed on numeric types, TimeSpan and numeric type (multiplying TimeSpan resulting TimeSpan), | ||
* '''Division (/)''' can be performed on numeric types (division), TimeSpan and numeric type (dividing TimeSpan where TimeSpan must be the left hand side operand). | * '''Division (/)''' can be performed on numeric types (division), TimeSpan and numeric type (dividing TimeSpan where TimeSpan must be the left hand side operand). |
Revision as of 21:27, 25 January 2018
Expression and Evaluation Context
An expression is a text to be evaluated that has a result. Result can be any of the supported object types or empty. An expression may consist of multiple expressions, called sub-expressions.
Expression evaluation is always performed within some context. This context and its type defines which kind of functionalities are available. Current context is implicitly accessible in all the expressions. Whenever a function or property is called, functions and properties accessible in the current context are searched first. If function or property is not found in the current context, then more generic context is tried. Error is returned only if the requested functionality is not available in the current context or a generic context. Current context can be accessed explicitly by using variable named _ (underscore).
Expression Chaining and Hierarchies using . and :
Expressions can be chained together two ways:
- Contextless chaining: When . character is used to chain expressions, the resulting objects will not have context information.
- Hierarchical chaining: When : character is used to chain expressions, only the result of the whole chained expression will consist of hierarchical arrays (#29290#) where all the values in the first expression (=context object) will be bound to the arrays those values generated. If the second expression does not return an array, the result will be changed to be an array.
The second expression chained to the first one will be evaluated using the following rules:
- If the result of the first expression is not an array, the second expression will be evaluated with the result of the first expression as its context object.
- If the result of the first expression is an array, for every element in the array, the second expression will be evaluated with the array item as its context object. The result of the evaluation will be an array of evaluation results (one for each element in the array).
- If any of the second expression evaluations returns an array, the resulting object will be an array of arrays. If the first expression evaluation returns a typed array, the result will be hierarchic in a way that first level results are objects that contain the information about the actual object as well as the results generated by the second level expressions.
These rules apply also when chaining more than two expressions together. For example, it is possible to generate three level hierarchy with nodes of type: event log -> case -> event: EventLogById(1).Cases.Events or EventLogById(1):Cases:Events.
Examples:
Contextless chaining: First expression not an array, second expression not an array: "1".("Number is " + _) Returns: "Number is 1" Contextless chaining: First expression is an array, second expression not an array: [1,2,3].("Number is " + _) Returns: ["Number is 1", "Number is 2", "Number is 3"] Contextless chaining: First expression is an array, second expression is an array: [1,2,3].["Number is " + _, "" + _ + ". number"] Returns: [ ["Number is 1", "1. number"], ["Number is 2", "2. number"], ["Number is 3", "3. number"] ] Hierarchical chaining: First expression is an array, second expression is an array: [1,2,3]:["Number is " + _, "" + _ + ". number"] Returns: [ HierarchicalArray(1, ["Number is 1", "1. number"]), HierarchicalArray(2, ["Number is 2", "2. number"]), HierarchicalArray(3, ["Number is 3", "3. number"]) ]
- Hierarchical arrays: Whenever traversing a relation in expression language using hierarchical chaining operator ':' for chaining expressions, a hierarchical array will be returned. It is an object which behaves just like a normal array except it stores also context/root/key/label object which usually represents the object from which the array originated from, for example the original case object when querying events of a case.
- Hierarchical objects: Arrays where at least one object in the array is itself an array is considered to be a hierarchical object. Hierarchical arrays are treated in similar way as normal arrays in hierarchical objects.
- Depth of a hierarchical object is the number of inner arrays that there are in the object, i.e. how deep is the hierarchy.
- Level in hierarchical object consists of all the nodes that are at specific depth in object's array hierarchy. 0 is the level at the root of the object, consisting only of the object itself as single item. Levels increase when moving towards leaves.
- Leaf level is a level that doesn't have any sub levels.
Basic arithmetic operations
- Addition (+) can be performed on numeric types, strings (concatenation) and TimeSpans (addition of two TimeSpans).
- Subtraction (-) can be performed on numeric types (arithmetic subtraction), DateTimes (calculating TimeSpan between two DateTimes) and TimeSpan object.
- Multiplication (*) can be performed on numeric types, TimeSpan and numeric type (multiplying TimeSpan resulting TimeSpan),
- Division (/) can be performed on numeric types (division), TimeSpan and numeric type (dividing TimeSpan where TimeSpan must be the left hand side operand).
Lookup operator
Lookup operator is used to extract a subset of values from an array. The value returned by the expression inside brackets defines the index(es) to extract from the array as follows:
- If the expression inside brackets coerces into a single array of integers, the result of the whole expression will be an array consisting of the array items at indexes specified by the integers.
- If the expression inside brackets coerces into an integer, the result of the whole expression will be the array item at the specified index.
- Otherwise an error will be thrown.
The expression inside brackets will be evaluated in the context of the array being indexed.
Examples:
[1, 2, 3, 4][1] Returns: 2 [1, 2, 3, 4][Count(_) - 1] Returns: 4 ["a", "b", "c", "d"][[0, Count(_) - 1]] Returns: ["a", "d"] [[1, 2], 3, [4, [5, 6]]][2][1][0] Returns: 5