Protobuf type {@code Term}
A [Term] is either a piece of data (see **Datum** above), or an operator and its operands. If you have a [Datum], it's stored in the member [datum]. If you have an operator, its positional arguments are stored in [args] and its optional arguments are stored in [optargs]. A note about type signatures: We use the following notation to denote types: arg1_type, arg2_type, argrest_type... -> result_type So, for example, if we have a function `avg` that takes any number of arguments and averages them, we might write: NUMBER... -> NUMBER Or if we had a function that took one number modulo another: NUMBER, NUMBER -> NUMBER Or a function that takes a table and a primary key of any Datum type, then retrieves the entry with that primary key: Table, DATUM -> OBJECT Some arguments must be provided as literal values (and not the results of sub terms). These are marked with a `!`. Optional arguments are specified within curly braces as argname `:` value type (e.x `{use_outdated:BOOL}`) Many RQL operations are polymorphic. For these, alterantive type signatures are separated by `|`. The RQL type hierarchy is as follows: Top DATUM NULL BOOL NUMBER STRING OBJECT SingleSelection ARRAY Sequence ARRAY Stream StreamSelection Table Database Function Ordering - used only by ORDER_BY Pathspec -- an object, string, or array that specifies a path Error