You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fg...@apache.org on 2009/06/25 18:48:08 UTC

svn commit: r788422 - in /incubator/chemistry/trunk/chemistry: chemistry-commons/ chemistry-commons/src/main/antlr3/ chemistry-commons/src/main/antlr3/org/ chemistry-commons/src/main/antlr3/org/apache/ chemistry-commons/src/main/antlr3/org/apache/chemi...

Author: fguillaume
Date: Thu Jun 25 16:48:08 2009
New Revision: 788422

URL: http://svn.apache.org/viewvc?rev=788422&view=rev
Log:
Start of ANTLR grammar for CMIS SQL, mavenized and relicensed from http://hg.nuxeo.org/sandbox/nuxeo-cmis/

Added:
    incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/antlr3/
    incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/antlr3/org/
    incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/antlr3/org/apache/
    incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/antlr3/org/apache/chemistry/
    incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/antlr3/org/apache/chemistry/cmissql/
    incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/antlr3/org/apache/chemistry/cmissql/CmisSql.g
    incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/gunit/
    incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/gunit/org/
    incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/gunit/org/apache/
    incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/gunit/org/apache/chemistry/
    incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/gunit/org/apache/chemistry/cmissql/
    incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/gunit/org/apache/chemistry/cmissql/CmisSql.testsuite
Modified:
    incubator/chemistry/trunk/chemistry/chemistry-commons/pom.xml
    incubator/chemistry/trunk/chemistry/chemistry-parent/pom.xml

Modified: incubator/chemistry/trunk/chemistry/chemistry-commons/pom.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-commons/pom.xml?rev=788422&r1=788421&r2=788422&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-commons/pom.xml (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-commons/pom.xml Thu Jun 25 16:48:08 2009
@@ -37,6 +37,10 @@
       <groupId>stax</groupId>
       <artifactId>stax-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.antlr</groupId>
+      <artifactId>antlr-runtime</artifactId>
+    </dependency>
 
     <dependency>
       <groupId>junit</groupId>
@@ -45,4 +49,32 @@
     </dependency>
 
   </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.antlr</groupId>
+        <artifactId>antlr3-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>antlr</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.antlr</groupId>
+        <artifactId>maven-gunit-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>gunit</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
 </project>

Added: incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/antlr3/org/apache/chemistry/cmissql/CmisSql.g
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/antlr3/org/apache/chemistry/cmissql/CmisSql.g?rev=788422&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/antlr3/org/apache/chemistry/cmissql/CmisSql.g (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/antlr3/org/apache/chemistry/cmissql/CmisSql.g Thu Jun 25 16:48:08 2009
@@ -0,0 +1,211 @@
+/*
+ * 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.
+ *
+ * Authors:
+ *     Stefane Fermigier, Nuxeo
+ */
+/**
+ * First try at a CMIS-SQL grammar.
+ * Directly translated from the CMIS 0.5 EBNF specs.
+ * Some rules have already been changed (or temporarily disabled) while
+ * we work around left-recursion and other issues.
+ */
+grammar CmisSql;
+
+options {
+    language = Java;
+    output = AST;
+}
+
+@header {
+package org.apache.chemistry.cmissql;
+}
+@lexer::header {
+package org.apache.chemistry.cmissql;
+}
+
+// LEXER
+
+ID
+    : ('a'..'z'|'A'..'Z'|'_')('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+    ;
+
+SIGNED_NUMERIC_LITERAL
+    : '0'
+    | '-'? ('1'..'9')('0'..'9')*
+    ;
+
+CHARACTER_STRING_LITERAL
+    : '\'' ( ~'\'' | '\'\'')* '\''
+    ;
+
+WS  : ( ' ' | '\t' | '\r'? '\n' )+ { $channel=HIDDEN; }
+    ;
+
+// PARSER
+
+query: simple_table order_by_clause?;
+
+simple_table
+    : 'SELECT'^ select_list from_clause where_clause?
+    ;
+
+select_list
+    : '*'
+      -> '*'
+    | select_sublist ( ',' select_sublist )*
+      -> ^(select_sublist select_sublist*)
+    ;
+
+select_sublist
+    : value_expression ( 'AS'!? column_name )?
+    | qualifier '.*'
+    //| multi_valued_column_reference
+    ;
+
+value_expression:
+      column_reference
+    | string_value_function
+    | numeric_value_function
+    ;
+
+column_reference:
+    ( qualifier '.' )? column_name;
+
+multi_valued_column_reference:
+    ( qualifier '.' )? multi_valued_column_name;
+
+string_value_function:
+    ( 'UPPER' | 'LOWER' )? '('! column_reference ')'!;
+
+numeric_value_function:
+    'SCORE()';
+
+qualifier:
+      table_name
+    //| correlation_name
+    ;
+
+// FROM stuff
+
+from_clause: 'FROM'^ table_reference;
+
+// Use same trick as http://antlr.org/grammar/1057936474293/DmlSQL2.g to
+// remove left recursion.
+table_reference
+    : table_name ( 'AS'!? correlation_name )?
+    | joined_table
+    ;
+
+joined_table
+    : '(' joined_table ')'
+    //| table_reference join_type? 'JOIN' table_reference join_specification?
+    ;
+
+join_type: 'INNER' | 'LEFT' 'OUTER'?;
+
+join_specification:
+    'ON'^ '('! column_reference '='! column_reference ')'!;
+
+// WHERE stuff
+
+where_clause: 'WHERE'^ search_condition;
+
+// Rewritten from the spec to avoid left-recursion
+search_condition:
+    boolean_term ( 'OR'^ boolean_term )*;
+
+// Rewritten from the spec to avoid left-recursion
+boolean_term:
+    boolean_factor ( 'AND'^ boolean_factor )*;
+
+boolean_factor:
+    'NOT'^?  boolean_test;
+
+boolean_test:
+      predicate
+    | '('! search_condition ')'!
+    ;
+
+predicate:
+      comparison_predicate
+    | in_predicate
+    | like_predicate
+    | null_predicate
+    | quantified_comparison_predicate
+    | quantified_in_predicate
+    | text_search_predicate
+    | folder_predicate
+    ;
+
+comparison_predicate:
+    value_expression comp_op^ literal;
+
+comp_op:
+    '=' | '<>' | '<' | '>' | '<=' | '>=';
+
+literal:
+      SIGNED_NUMERIC_LITERAL
+    | CHARACTER_STRING_LITERAL
+    ;
+
+in_predicate:
+    column_reference 'NOT'? 'IN'^ '('! in_value_list ')'!;
+
+in_value_list:
+    literal ( ','! literal )*;
+
+like_predicate:
+    column_reference 'NOT'? 'LIKE'^ CHARACTER_STRING_LITERAL;
+
+null_predicate
+    // second alternative commented out to remove left recursion for now.
+    //( column_reference | multi_valued_column_reference ) 'IS' 'NOT'? 'NULL';
+    : column_reference 'IS'^ 'NOT'? 'NULL'
+    ;
+
+quantified_comparison_predicate:
+    literal comp_op^ 'ANY' multi_valued_column_reference;
+
+quantified_in_predicate:
+    'ANY' multi_valued_column_reference 'NOT'? 'IN'^ '('! in_value_list ')'!;
+
+text_search_predicate:
+    'CONTAINS'^ '('! qualifier? ','! text_search_expression ')'!;
+
+folder_predicate:
+    ( 'IN_FOLDER' | 'IN_TREE' )^ '(' qualifier? ',' folder_id ')';
+
+order_by_clause:
+    'ORDER BY'^ sort_specification ( ','! sort_specification )*;
+
+sort_specification:
+    column_name ( 'ASC' | 'DESC' )?;
+
+correlation_name:
+    ID;
+
+table_name:
+    ID;
+
+column_name:
+    ID;
+
+multi_valued_column_name:
+    ID;
+
+folder_id:
+    CHARACTER_STRING_LITERAL;
+
+text_search_expression:
+    CHARACTER_STRING_LITERAL;

Added: incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/gunit/org/apache/chemistry/cmissql/CmisSql.testsuite
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/gunit/org/apache/chemistry/cmissql/CmisSql.testsuite?rev=788422&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/gunit/org/apache/chemistry/cmissql/CmisSql.testsuite (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/gunit/org/apache/chemistry/cmissql/CmisSql.testsuite Thu Jun 25 16:48:08 2009
@@ -0,0 +1,125 @@
+/*
+ * 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.
+ *
+ * Authors:
+ *     Stefane Fermigier, Nuxeo
+ */
+gunit CmisSql;
+
+@header{
+package org.apache.chemistry.cmissql;
+}
+
+// Lexer tests
+
+ID:
+"a" OK
+"!" FAIL
+"toto" OK
+"toto123" OK
+"toto123_" OK
+"123" FAIL
+"123abc" FAIL
+
+SIGNED_NUMERIC_LITERAL:
+"123" OK
+"0" OK
+"1" OK
+"-1" OK
+"-123" OK
+"0123" FAIL
+"-0123" FAIL
+"123abc" FAIL
+
+CHARACTER_STRING_LITERAL:
+"'abc'" OK
+"'a''bc'" OK
+"'abc" FAIL
+"abc'" FAIL
+
+// Parser tests
+
+literal:
+"123" OK
+"-123" OK
+"0" OK
+"0123" FAIL
+"abc123" FAIL
+"123abc" FAIL
+"'abc'" OK
+
+order_by_clause:
+"ORDER BY toto" -> (ORDER BY toto)
+"ORDER BY titi ASC" -> (ORDER BY titi ASC)
+"ORDER BY tutu DESC" -> (ORDER BY tutu DESC)
+
+column_reference:
+"toto" -> "toto"
+"toto.titi" -> "toto . titi"
+
+in_predicate:
+"toto IN ( 'a', 'b', 'c')" -> (IN toto 'a' 'b' 'c')
+"toto IN ( 1, 2, 3)" -> (IN toto 1 2 3)
+
+comparison_predicate:
+"a = 1" -> (= a 1)
+"a <> 1" -> (<> a 1)
+
+predicate:
+"a = 1" -> (= a 1)
+"b IN ('test')" -> (IN b 'test')
+"c IS NULL" -> (IS c NULL)
+"c IS NOT NULL" -> (IS c NOT NULL)
+"1 = ANY d" -> (= 1 ANY d)
+"LOWER(type) = 'email'" -> (= LOWER type 'email')
+
+search_condition:
+"toto = 1" -> (= toto 1)
+"a = 1 AND b <> 2 OR c >= 3 AND NOT d <= 4" -> (OR (AND (= a 1) (<> b 2)) (AND (>= c 3) (NOT (<= d 4))))
+
+// ---------------------------------------------------------------
+
+query:
+"SELECT * FROM Document" -> (SELECT * (FROM Document))
+"SELECT a, b, c FROM Document" -> (SELECT (a b c) (FROM Document))
+"SELECT a, b, c FROM Document ORDER BY a, b, c" -> (SELECT (a b c) (FROM Document)) (ORDER BY a b c)
+
+
+// Examples from the specs.
+
+<<
+SELECT TITLE, AUTHORS, DATE
+FROM WHITE_PAPER
+WHERE ( IN_TREE( , 'ID00093854763') ) AND ( 'SMITH' = ANY AUTHORS )
+>> -> (SELECT (TITLE AUTHORS DATE) (FROM WHITE_PAPER) (WHERE (AND (IN_TREE ( , 'ID00093854763' )) (= 'SMITH' ANY AUTHORS))))
+
+<<
+SELECT OBJECT_ID, SCORE() AS X, DESTINATION, DEPARTURE_DATES
+FROM TRAVEL_BROCHURE
+WHERE ( CONTAINS( , 'CARIBBEAN CENTRAL AMERICA CRUISE TOUR') ) AND
+  ( '2010-1-1' < ANY DEPARTURE_DATES )
+ORDER BY X DESC
+>> OK
+
+<<
+SELECT *
+FROM CAR_REVIEW
+WHERE ( LOWER(MAKE) = 'buick' ) OR
+  ( ANY FEATURES IN ('NAVIGATION SYSTEM', 'SATELLITE RADIO', 'MP3' ) )
+>> OK
+
+/* JOINs not working yet.
+<<SELECT Y.CLAIM_NUM, X.PROPERTY_ADDRESS, Y.DAMAGE_ESTIMATES
+FROM POLICY AS X JOIN CLAIMS AS Y ON ( X.POLICY_NUM = Y.POLICY_NUM )
+WHERE ( 100000 <= ANY Y.DAMAGE_ESTIMATES ) AND ( Y.CAUSE NOT LIKE '%Katrina%' )>> OK
+*/

Modified: incubator/chemistry/trunk/chemistry/chemistry-parent/pom.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-parent/pom.xml?rev=788422&r1=788421&r2=788422&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-parent/pom.xml (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-parent/pom.xml Thu Jun 25 16:48:08 2009
@@ -40,8 +40,19 @@
           <artifactId>cxf-codegen-plugin</artifactId>
           <version>${cxf.version}</version>
         </plugin>
+        <plugin>
+          <groupId>org.antlr</groupId>
+          <artifactId>antlr3-maven-plugin</artifactId>
+          <version>3.1.3-1</version>
+        </plugin>
+        <plugin>
+          <groupId>org.antlr</groupId>
+          <artifactId>maven-gunit-plugin</artifactId>
+          <version>3.1.3</version>
+        </plugin>
       </plugins>
     </pluginManagement>
+
     <plugins>
       <!-- Use Java 1.5 everywhere -->
       <plugin>
@@ -146,6 +157,11 @@
 	<artifactId>cxf-rt-frontend-jaxrs</artifactId>
 	<version>${cxf.version}</version>
       </dependency>
+      <dependency>
+        <groupId>org.antlr</groupId>
+        <artifactId>antlr-runtime</artifactId>
+        <version>3.1.3</version>
+      </dependency>
 
       <dependency>
         <groupId>junit</groupId>