Change-Id: I72a497658cfdaea076e1a40330b113ae35381a5e Partial-Bug: #1603950
2.2 KiB
YAQL
YAQL (Yet Another Query Language) is a query language that was also designed as a part of the murano project. MuranoPL makes an extensive use of YAQL. A description of YAQL can be found here.
Simply speaking, YAQL is the language for expression evaluation. The
following examples are all valid YAQL expressions:
2 + 2, foo() > bar(), true != false
.
The interesting thing in YAQL is that it has no built in list of functions. Everything YAQL can access is customizable. YAQL cannot call any function that was not explicitly registered to be accessible by YAQL. The same is true for operators. So the result of the expression 2 * foo(3, 4) completely depends on explicitly provided implementations of "foo" and "operator*".
YAQL uses a dollar sign ($) to access external variables, which are
also explicitly provided by the host application, and function
arguments. $variable
is a syntax to get a value of the
variable "$variable", $1, $2, etc. are the names for function arguments.
"$" is a name for current object: data on which an expression is
evaluated, or a name of a single argument. Thus, "$" in the beginning of
an expression and "$" in the middle of it can refer to different
things.
By default, YAQL has a lot of functions that can be registered in a
YAQL context. This is very similar to how SQL works but uses more
Python-like syntax. For example:
$.where($.myObj.myScalar > 5
,
$.myObj.myArray.len() > 0
, and
$.myObj.myArray.any($ = 4)).select($.myObj.myArray[0])
can
be executed on $ = array
of objects, and result in another
array that is a filtration and projection of a source data.
Note
There is no assignment operator in YAQL, and =
means
comparison, the same what ==
means in Python.
As YAQL has no access to underlying operating system resources and is fully controllable by the host, it is secure to execute YAQL expressions without establishing a trust to the executed code. Also, because functions are not predefined, different methods can be accessible in different context. So, YAQL expressions that are used to specify property contracts are not necessarily valid in workflow definitions.