Query scope
The query scope allows users to define variables and functions in query strings.
In Python, the Deephaven Query Language resolves variables using the current global symbol table. In Groovy, the Deephaven query language resolves variables using the QueryScope
singleton.
Syntax
QueryScope.addParam(name, value)
Examples
Variable names and function names are case-sensitive.
Manually add variables
In the following example, the variable a
is manually added and assigned the value 7.
QueryScope.addParam("a", 7)
result = emptyTable(5).update("Y = a")
- result
This variable can be used inside a query string.
QueryScope.addParam("a", 7)
source = newTable(intCol("A", 1, 2, 3))
result = source.update("X = 2 + 3 * sqrt(A) + a")
- source
- result
Automatically add variables
At the top level of a program, variables are automatically added to the query scope.
In the following example, a program contains b = 3
at the top level, so the query scope will also contain the name b
with a value of 3.
b = 3
result = emptyTable(5).update("Y = b")
- result
This variable can be used inside a query string.
b = 3
source = newTable(intCol("A", 1, 2, 3))
result = source.update("X = 2 + 3 * sqrt(A) + b")
- source
- result
User-defined functions in a query string
Programming languages frequently implement functions as callable objects. The query scope can make these callable objects available for use inside query strings.
In the following example, myFunction
is defined and is called from the query string.
myFunction = { int a -> a * (a + 1) }
source = newTable(intCol("A", 1, 2, 3))
result = source.update("X = 2 + 3 * (int)myFunction(A)")
- source
- result
Encapsulated query logic in functions
One can encapsulate query logic within functions. Such functions may use variables in query strings. In these cases, the variables need to be manually added to the query scope.
In the following example, the compute
function performs a query using the source
table and the input parameter a
. Here, a
must be added to the query scope to be used in the query string.
f = { int a, int b -> a * b }
compute = { Table source, int a ->
// Values must be added to the query scope to be used in query strings.
QueryScope.addParam("a", a)
return source.update("X = (int)f(a, A)")
}
source = newTable(intCol("A", 1, 2, 3))
result1 = compute(source, 10)
result2 = compute(source, 3)
- source
- result1
- result2