Getting Started with AuQL¶
AuQL can seem daunting, but getting started need not be difficult. This article presents a number of simple but practical scripts that illustrate AuQL syntax and also demonstrate practical solutions to common types of scripting tasks.
Basic Integer Operations¶
Among the simplest possible scripts, this example asks whether one is less than two.
Example:
# is 1 less than 2?
function main(){
result = Logic.LessThan(1, 2)
return(value = result)
}
Passing Values To and From Functions¶
The following script demonstrates how to pass two parameters (called arguments
in some langauges) as inputs for a function. AuQL Parameters are named and
typed (left
and right
are both specified as integers). A default
value can also provided as they are here, but this is not required. The two
parameters are referenced by name as inputs of the addition operation.
In addition passing paremeters in, AuQL allows functions to pass a value back to
the calling context. In this case, the sum of the Math.Add
function called in
this function's first statement is returned to the user as the named value
result
. As with input parameters, AuQL functions can return an arbitrary
number of parameters by separating each parameter to return with commas
(e.g. return(x = 5, y = 3, z = 4)
).
function main(left = int(1), right = int(2)){
sum = Math.Add(left, right)
return(result = sum)
}
Formatting Strings¶
The following script demonstrates string manipulation, in this case for the purpose of creating user-friendly messages out of dynamic information.
function main(org = str("Aunalytics"), rate = int(89)){
# Define a template string
template = "Job completion rate for %s is %s% as of '%s'"
# Pack values into an array using Util.ArrayOf()
args = Util.ArrayOf(org, rate, Date.Now())
# Format output string with String.Format()
output = String.Format(template, args)
return(value = output)
}
Invoking Subscripts¶
This example multiplies each element of the array [1, 2, 3, 4, 5]
by
two and returns the mapped array. Here we are using the Util.MapArray
operator, which requires a function to be passed as an argument. We
define the mapper function below the main function and "import" it to the main
function using the Util.Function
operator.
function main(){
arr = [1,2,3,4,5]
mapper = Util.Function("mapper")
output = Util.MapArray(arr, mapper)
return(value = output)
}
function mapper(value = int()){
product = Math.Multiply(value, 2)
return(value = product)
}
Is My Dataset Growing?¶
This script fetches information from a Memento Series that has the stats of a record written to it periodically. It then asserts that the size of the record is growing by testing whether the newest filesize is greater than the second newest.
function main(series_id = str("a27c46b6-6634-4f41-951a-5ca753c8793f"), atlas_id = str())
{
# fetch the latest two mementos
mementos = AU.Memento.LatestN(series_id, 2)
# fetch and parse from the newest memento
new_memento_str = Util.Get(mementos, 0)
new_memento = Util.Object(new_memento_str)
new_record = Util.Get(new_memento, atlas_id)
new_filesize = Util.Get(new_record, "file_size")
# fetch and parse from the 2nd newest memento
old_memento_str = Util.Get(mementos, 1)
old_memento = Util.Object(old_memento_str)
old_record = Util.Get(old_memento, atlas_id)
old_filesize = Util.Get(old_record, "file_size")
# is the 1st greater than the 2nd?
comparator = Logic.GreaterThan(new_filesize, old_filesize)
return(value = comparator)
}
AI-Designed Date Checking Algorithm¶
This script is an interesting one insofar as the logic chain was developed by AI and put into a Rule by a human. The script asks whether today is a day that the algorithm determined to be a "good" day.
function main(max_date = String()) {
convert_to_date = Util.MakeDate(date = max_date)
days_diff = Date.Difference(Date.Now(), convert_to_date, unit = String("days"))
md_dow = Date.GetDay(convert_to_date)
cd_dow = Date.GetDay(convert_to_date)
gt1 = Logic.GreaterThan(days_diff, 2)
gt2 = Logic.GreaterThan(cd_dow, 2)
gt3 = Logic.GreaterThan(md_dow, 4)
gt4 = Logic.GreaterThan(days_diff, 3)
lte1 = Logic.LessThanEqual(cd_dow, 2)
and1_1 = Logic.And(gt1, gt2)
and2_1 = Logic.And(gt1, lte1)
and2_2 = Logic.And(and2_1, gt3)
and2_3 = Logic.And(and2_2, gt4)
or1_1 = Logic.Or(and1_1, and2_3)
return(value = or1_1)
}
Format Parameters for RunWorkflowMulti¶
This script takes an input object and maps an array in it so that it can be passed to a RunWorkflowMulti Workflow component.
function main(input = Object()){
get = Util.Get(input, "NewRecords")
parseJSON = Util.Object(get)
mapper = Util.Function(str("embedded"))
map = Util.MapArray(parseJSON, mapper, opts = input)
return(value = map)
}
function embedded(value = str(), index = int(), opts = Object()){
unset = Util.Unset(opts, "NewRecords")
setNewFile = Util.Set(unset, "NewRecords", value)
return(value = setNewFile)
}