next up previous contents
Next: OPM Query Examples Up: The OPM Query Previous: An OPM Example

Syntactic Definition for the OPM Query Language

 

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