53 lines
1.5 KiB
ANTLR
53 lines
1.5 KiB
ANTLR
parser grammar Query;
|
|
|
|
options {
|
|
tokenVocab = QueryLexer;
|
|
}
|
|
|
|
policy: UNIQUE? (repStmt | ecStmt)+ cbfStmt? selectStmt* filterStmt* EOF;
|
|
|
|
selectFilterExpr: cbfStmt? selectStmt? filterStmt* EOF;
|
|
|
|
ecStmt:
|
|
EC Data = NUMBER1 DOT Parity = NUMBER1 // erasure code configuration
|
|
(IN Selector = ident)?; // optional selector name
|
|
|
|
repStmt:
|
|
REP Count = NUMBER1 // number of object replicas
|
|
(IN Selector = ident)?; // optional selector name
|
|
|
|
cbfStmt: CBF BackupFactor = NUMBER1; // container backup factor
|
|
|
|
selectStmt:
|
|
SELECT Count = NUMBER1 // number of nodes to select without container backup factor *)
|
|
(IN clause? Bucket = filterKey)? // bucket name
|
|
FROM Filter = identWC // filter reference or whole netmap
|
|
(AS Name = ident)? // optional selector name
|
|
;
|
|
|
|
clause: CLAUSE_SAME | CLAUSE_DISTINCT; // nodes from distinct buckets
|
|
|
|
filterExpr:
|
|
Op = NOT_OP '(' F1 = filterExpr ')'
|
|
| F1 = filterExpr Op = AND_OP F2 = filterExpr
|
|
| F1 = filterExpr Op = OR_OP F2 = filterExpr
|
|
| '(' Inner = filterExpr ')'
|
|
| expr
|
|
;
|
|
|
|
filterStmt:
|
|
FILTER Expr = filterExpr
|
|
AS Name = ident // obligatory filter name
|
|
;
|
|
|
|
expr:
|
|
AT Filter = ident // reference to named filter
|
|
| Key = filterKey SIMPLE_OP Value = filterValue // attribute comparison
|
|
;
|
|
|
|
filterKey : ident | STRING;
|
|
filterValue : ident | number | STRING;
|
|
number : ZERO | NUMBER1;
|
|
keyword : REP | IN | AS | SELECT | FROM | FILTER;
|
|
ident : keyword | IDENT;
|
|
identWC : ident | WILDCARD;
|