dbMango/Rms.Risk.Mango.Language/MongoAggregationForHumans.g4
Alexander Shabarshov 2a7a24c9e7 Initial contribution
2025-11-03 14:43:26 +00:00

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: '-';