Evgenii Stratonikov
001a23eb31
JSON format is rather verbose an inconvenient to be edited by hand. This commit implements SQL-like language for representing placement policy. Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
52 lines
1.1 KiB
EBNF
52 lines
1.1 KiB
EBNF
Policy ::=
|
|
RepStmt, [RepStmt],
|
|
CbtStmt?,
|
|
[SelectStmt],
|
|
[FilterStmt],
|
|
;
|
|
|
|
RepStmt ::=
|
|
'REP', Number1, (* number of object replicas *)
|
|
('AS', Ident)? (* optional selector name *)
|
|
;
|
|
|
|
CbtStmt ::= 'CBF', Number1 (* container backup factor *)
|
|
;
|
|
|
|
SelectStmt ::=
|
|
'SELECT', Number1, (* number of nodes to select without container backup factor *)
|
|
'IN', Clause?, Ident, (* bucket name *)
|
|
FROM, (Ident | '*'), (* filter reference or whole netmap *)
|
|
('AS', Ident)? (* optional selector name *)
|
|
;
|
|
|
|
Clause ::=
|
|
'SAME' (* nodes from the same bucket *)
|
|
| 'DISTINCT' (* nodes from distinct buckets *)
|
|
;
|
|
|
|
FilterStmt ::=
|
|
'FILTER', AndChain, ['OR', AndChain],
|
|
'AS', Ident (* obligatory filter name *)
|
|
;
|
|
|
|
AndChain ::=
|
|
Expr, ['AND', Expr]
|
|
;
|
|
|
|
Expr ::=
|
|
'@' Ident (* filter reference *)
|
|
| Ident, Op, Value (* attribute filter *)
|
|
;
|
|
|
|
Op ::= 'EQ' | 'NE' | 'GE' | 'GT' | 'LT' | 'LE'
|
|
;
|
|
|
|
Value ::= Ident | Number | String
|
|
;
|
|
|
|
Number1 ::= Digit1 [Digit];
|
|
Number ::= Digit [Digit];
|
|
|
|
Digit1 ::= '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' ;
|
|
Digit ::= '0' | Digit1;
|