<OPM query> ::= <SELECT query> | <INSERT query> | <UPDATE query> |
<DELETE query>
;
<SELECT query> ::= <select statement> <from statement>
<optional where statement> ';'
| <select statement> <from statement>
<optional where statement>
ORDER BY <order expressions> ';'
;
<select statement> ::= SELECT <select declarations>
| SELECT DISTINCT <select declarations>
;
<select declarations> ::= <select declaration>
| <select declarations> ',' <select declaration>
;
<select declaration> ::= <attribute alias> '=' <select expression>
| <select expression>
| <single class select declaration>
;
<select expression> ::= <expression>
| <expression> '(' <attribute list> ')'
| <expression> '(' '*' ')'
;
<attribute list> ::= <attribute> | <attribute list> ',' <attribute>
;
<single class select declaration> ::= '(' <attribute list> ')' | '*'
;
<attribute> ::= <projection composition>
| <attribute alias> '=' <projection composition>
;
<from statement> ::= FROM <variable declarations>
| FROM <class name>
;
<variable declarations> ::= <variable declaration>
| <variable declarations> ',' <variable declaration>
;
<variable declaration> ::= <simple variable> IN
<class expression> <optional all versions>
| '(' <variable list> ')' IN <simple variable> '.'
'(' <projection element list> ')'
<optional all versions>
;
<optional all versions> ::= <empty> | ALL VERSIONS
;
<simple variable> ::= <identifier>
;
<variable list> ::= <simple variable>
| <variable list> ',' <simple variable>
;
<projection element list> ::= <projection element>
| <projection element list> ',' <projection element>
;
<class expression> ::= <class name> | <path expression>
;
<path expression> ::= <simple variable> '.' <projection composition>
;
<projection composition> ::= <projection element>
| <composition element list> <projection element>
;
<composition element list> ::= <composition element>
| <composition element list> <composition element>
;
<composition element> ::= <attribute name> '[' <class name> ']'
| '!' <attribute name> '[' <class name> ']'
| <attribute name> '.'
;
<projection element> ::= <attribute name> '[' <class name> ']'
| '!' <attribute name> '[' <class name> ']'
| <attribute name>
;
<optional where statement> ::= <empty> | WHERE <conditions>
;
<order expressions> ::= <expression> <optional direction>
| <order expressions> ',' <expression>
<optional direction>
;
<optional direction> ::= <empty> | ASC | DESC
;
<expression> ::= <variable> | <primitive value> | <set of values>
;
<variable> ::= <simple variable> | <path expression>
;
<primitive value> ::= <number> | <string>
;
<set of values> ::= '{' <set of numbers> '}'
| '{' <set of strings> '}'
;
<set of numbers> ::= <number>
| <set of numbers> ',' <number>
;
<set of strings> ::= <string> | <set of strings> ',' <string>
;
<conditions> ::= <atomic condition>
| '(' <conditions> ')'
| <conditions> AND <conditions>
| <conditions> OR <conditions>
;
<atomic condition> ::= <expression> <is null op>
| <expression> <bin op> <expression>
| <expression> <all op> <variable>
| <expression> <match op> <string>
;
<is null op> ::= IS NULL | IS NOT NULL
;
<bin op> ::= <comp op> | <in op> | <contains op>
;
<all op> ::= <comp op> ALL
;
<comp op> ::= '=' | NE | '>' | GE | '<' | LE
;
<contains op> ::= CONTAINS | NOT CONTAINS
;
<in op> ::= IN | NOT IN
;
<match op> ::= MATCH | NOT MATCH
;
<attribute name> ::= <identifier>
;
<attribute alias> ::= <idnetifier>
;
<class name> ::= <identifier>
;
<number> ::= <integer> | <real>
;
<INSERT query> ::= INSERT <class name> '(' <assign values> ')' ';'
| INSERT <class name> '(' <assign values> ')'
AS <an id value> ';'
;
<assign values> ::= <assign attribute values>
| <assign values> ',' <assign attribute values>
;
<assign attribute values> ::= <simple single assignment>
| <simple multi assignment>
| <tuple single assignment>
| <tuple multi assignment>
;
<simple single assignment> ::= <attribute name> '=' <attr value>
| <attribute name> '=' NULL
;
<id assignment> ::= <attribute name> '=' <a primitive value>
;
<attr value> ::= <a primitive value> | <an id value>
;
<a primitive value> ::= <integer> | <string> | <real>
;
<an id value> ::= <class name> '[' <id values> ']'
;
<id values> ::= <id assignment> | <id values> ',' <id assignment>
;
<simple multi assignment> ::= <attribute name> '='
'{' <multiple assignments> '}'
;
<multiple assignments> ::= <attr value>
| <multiple assignments> ',' <attr value>
;
<tuple single assignment> ::= '(' <component names> ')' '='
'(' <multiple assignments> ')'
| '(' <component names> ')' '=' NULL
;
<tuple multi assignment> ::= '(' <component names> ')' '='
'{' <multi comp assignments> '}'
;
<multi comp assignment> ::= '(' <multiple assignments> ')'
| <multi comp assignments> ','
'(' <multiple assignments> ')'
;
<component names> ::= <attribute name>
| <component names> ',' <attribute name>
;
<UPDATE query> ::= UPDATE <simple variable> '(' <attribute updates> ')'
<from statement> <optional where statement> ';'
;
<DELETE query> ::= DELETE <simple variable> <from statement>
<optional where statement> ';'
;
<attribute updates> ::= <attribute update>
| <attribute updates> ',' <attribute update>
;
<attribute update> ::= <attribute insert statement>
| <attribute modify statement>
;
<attribute insert statement> ::= ADD <assign attribute values>
;
<attribute modify statement> ::= SET <assign attribute values>
;