Query Grammar
You will find below the definition of this SDL, for queries. This builds on top of the filters grammar.
queries.g4
grammar queries;
import filters;
/**********************************************************************/
/* FORMATTING DATA */
/**********************************************************************/
queries
: projection_operators?
;
projection_operators
: nifti_operator
| json_operator
;
/* If selector is not provided, one (1) will be used as the values for
* each position where there is a point in bag_expression.
*
* If it is provided, it MUST resolve to a NUMBER. */
nifti_operator
: 'nifti' '(' ( selector ',' )? bag_expression ( ',' STRING )? ')'
;
json_operator
: 'json' '(' jslt ',' bag_expression ( ',' STRING )? ')'
;
jslt
: json
;
/**********************************************************************/
/* JSON */
/**********************************************************************/
/**
* Taken and adapted from:
* https://github.com/antlr/grammars-v4/blob/master/json/JSON.g4
*
* Some of the parser / lexer rules are in the imported grammar as well.
*/
json
: json_value
;
json_obj
: '{' json_pair (',' json_pair)* '}'
| '{' '}'
;
json_pair
: STRING ':' json_value
;
json_array
: '[' json_value (',' json_value)* ']'
| '[' ']'
;
json_value
: STRING
| json_number
| json_obj
| json_array
| 'true'
| 'false'
| 'null'
/* Add support to reference values from the selected bag. */
| selector
| aggregation_expr
;
/* The bag expression is implicit here, as this is te
* second argument to the json operator */
aggregation_expr
: 'count' '(' 'distinct'? selector ')'
| 'sum' '(' selector ')'
| 'min' '(' selector ')'
| 'max' '(' selector ')'
| 'nifti' '(' selector ')'
| 'mbb' '(' ')'
;