193 lines
4.7 KiB
ANTLR
193 lines
4.7 KiB
ANTLR
//
|
|
// dbMango
|
|
//
|
|
// Copyright 2025 Deutsche Bank AG
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
grammar MongoAggregationForHumans;
|
|
import JsonGrammar;
|
|
|
|
file
|
|
: 'FROM' STRING pipeline_def
|
|
;
|
|
|
|
pipeline_def
|
|
: 'PIPELINE' '{' stages_list '}'
|
|
;
|
|
|
|
stages_list
|
|
: stage_def
|
|
| stages_list stage_def
|
|
;
|
|
|
|
stage_def
|
|
: match_def ('OPTIONS' json)?
|
|
| bucket_def ('OPTIONS' json)?
|
|
| facet_def ('OPTIONS' json)?
|
|
| addfields_def ('OPTIONS' json)?
|
|
| project_def ('OPTIONS' json)?
|
|
| group_by_def ('OPTIONS' json)?
|
|
| sort_def ('OPTIONS' json)?
|
|
| join_def ('OPTIONS' json)?
|
|
| unwind_def ('OPTIONS' json)?
|
|
| replace_def ('OPTIONS' json)?
|
|
| do_def ('OPTIONS' json)?
|
|
;
|
|
|
|
match_def: 'WHERE' expression
|
|
;
|
|
|
|
bucket_def
|
|
: 'BUCKET' expression 'BOUNDARIES' NUMBER (',' NUMBER)* ('DEFAULT' defaultBucket=(NUMBER | STRING))? ('LET' let_list)? # BucketPlain
|
|
| 'BUCKET' 'AUTO' expression 'BUCKETS' NUMBER ('GRANULARITY' STRING)? ('LET' let_list)? # BucketAuto
|
|
;
|
|
|
|
facet_def
|
|
: 'FACET' VARIABLE pipeline_def (',' VARIABLE pipeline_def)*
|
|
;
|
|
|
|
addfields_def
|
|
: 'ADD' let_list
|
|
;
|
|
|
|
project_def
|
|
: 'PROJECT' ('ID' '{' id_list=let_list '}')? data_list=let_list # ProjectInclude
|
|
| 'PROJECT' 'EXCLUDE' var_list # ProjectExclude
|
|
;
|
|
|
|
replace_def
|
|
: 'REPLACE' 'ID' '{' id_list=let_list '}' data_list=let_list
|
|
;
|
|
|
|
|
|
group_by_def: 'GROUP' 'BY' id_list=let_list ('LET' data_list=let_list)?
|
|
;
|
|
|
|
sort_def: 'SORT' 'BY' sort_var_list
|
|
;
|
|
|
|
join_def: 'JOIN' STRING 'AS' (VARIABLE | STRING) 'ON' equivalence_list ('LET' let_list )? (pipeline_def)?
|
|
;
|
|
|
|
unwind_def: 'UNWIND' VARIABLE ('INDEX' VARIABLE)?
|
|
;
|
|
|
|
do_def: 'DO' json
|
|
;
|
|
|
|
equivalence_list
|
|
: left=VARIABLE '==' right=VARIABLE #VarEquivalence
|
|
| equivalence_list ',' equivalence_list #EquivalenceList
|
|
;
|
|
|
|
sort_var_list
|
|
: VARIABLE (ASC | DESC)?
|
|
| sort_var_list ',' sort_var_list
|
|
;
|
|
|
|
var_list
|
|
: VARIABLE
|
|
| var_list ',' var_list
|
|
;
|
|
|
|
let_list
|
|
: let_list_item
|
|
| let_list ',' let_list
|
|
;
|
|
|
|
let_list_item
|
|
: expression ('AS' (VARIABLE | STRING))? # LetExpressionAs
|
|
| '[' let_list ']' ('AS' (VARIABLE | STRING))? # LetArray
|
|
| '{' let_list '}' ('AS' (VARIABLE | STRING))? # LetObject
|
|
;
|
|
|
|
expression
|
|
: comparizon_expression ( (AND | OR) comparizon_expression )*
|
|
;
|
|
|
|
comparizon_expression
|
|
: additive_expression ( (EQ | NEQ | LT | LTE | GT | GTE) additive_expression )*
|
|
;
|
|
|
|
additive_expression
|
|
: multiplicative_expression ( (PLUS | MINUS) multiplicative_expression )*
|
|
;
|
|
|
|
multiplicative_expression
|
|
: unary_expression ( (MUL | DIV) unary_expression )*
|
|
;
|
|
|
|
unary_expression
|
|
: (PLUS | MINUS | NOT) unary_expression # UnaryExpression
|
|
| brackets_expression # PrimaryExpression
|
|
;
|
|
|
|
brackets_expression
|
|
: atom # AtomExpression
|
|
| VARIABLE NOT? 'IN' '(' expression (',' expression)* ')' # InExpression
|
|
| VARIABLE '(' (unnamed_args_list | named_args_list ) ')' # FuncExpression
|
|
| VARIABLE 'IS' json # ProjectionExpression
|
|
| VARIABLE NOT? 'EXISTS' # ExistsExpression
|
|
| '(' expression ')' # BracketsExpression
|
|
;
|
|
|
|
named_args_list
|
|
: left=VARIABLE ':' expression
|
|
| left=VARIABLE ':' expression_array
|
|
| named_args_list ',' named_args_list
|
|
;
|
|
|
|
unnamed_args_list
|
|
: expression
|
|
| expression_array
|
|
| unnamed_args_list ',' unnamed_args_list
|
|
;
|
|
|
|
expression_array
|
|
: '[' expression_array_item (',' expression_array_item)* ']'
|
|
| '[' ']'
|
|
;
|
|
|
|
expression_array_item
|
|
: expression
|
|
| expression_array
|
|
;
|
|
|
|
|
|
atom
|
|
: STRING
|
|
| NUMBER
|
|
| 'true'
|
|
| 'false'
|
|
| 'null'
|
|
| VARIABLE
|
|
;
|
|
|
|
AND: 'AND' | '&&';
|
|
OR: 'OR' | '||';
|
|
NOT: 'NOT' | '!';
|
|
EQ: '==';
|
|
NEQ: '<>' | '!=';
|
|
GT: '>';
|
|
GTE: '>=';
|
|
LT: '<';
|
|
LTE: '<=';
|
|
ASC: 'ASC';
|
|
DESC: 'DESC';
|
|
MUL: '*';
|
|
DIV: '/';
|
|
PLUS: '+';
|
|
MINUS: '-';
|