You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by je...@apache.org on 2010/06/14 20:51:25 UTC
svn commit: r954587 [1/4] - in /incubator/chemistry/opencmis/trunk:
chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/dataobjects/
chemistry-opencmis-server/chemistry-opencmis-server-inm...
Author: jens
Date: Mon Jun 14 18:51:24 2010
New Revision: 954587
URL: http://svn.apache.org/viewvc?rev=954587&view=rev
Log:
CMIS-216
Implement basic query support for in-memory server
Added:
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/antlr3/org/apache/chemistry/opencmis/inmemory/query/CMISQLLexerStrict.g
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/antlr3/org/apache/chemistry/opencmis/inmemory/query/CMISQLParserStrict.g
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/antlr3/org/apache/chemistry/opencmis/inmemory/query/CmisQueryWalker.g
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/TypeManagerImpl.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/CmisSelector.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/ColumnReference.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/FunctionReference.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/IQueryConditionProcessor.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/QueryObject.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/AbstractQueryTest.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/EvalQueryTest.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/ProcessQueryTest.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/QueryParseTest.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/QueryTestDataCreator.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/QueryTypesTest.java
Removed:
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/antlr3/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryWalker.g
Modified:
incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/dataobjects/PropertiesImpl.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/DataObjectCreator.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/TypeManager.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryDiscoveryServiceImpl.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoreManagerImpl.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/types/PropertyCreationHelper.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/DiscoveryServiceTest.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/TypeValidationTest.java
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/UnitTestTypeSystemCreator.java
Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/dataobjects/PropertiesImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/dataobjects/PropertiesImpl.java?rev=954587&r1=954586&r2=954587&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/dataobjects/PropertiesImpl.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/dataobjects/PropertiesImpl.java Mon Jun 14 18:51:24 2010
@@ -42,6 +42,10 @@ public class PropertiesImpl extends Abst
public PropertiesImpl() {
}
+ public PropertiesImpl(Map<String, PropertyData<?>> properties) {
+ fProperties = properties;
+ }
+
/**
* Constructor.
*
Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/antlr3/org/apache/chemistry/opencmis/inmemory/query/CMISQLLexerStrict.g
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/antlr3/org/apache/chemistry/opencmis/inmemory/query/CMISQLLexerStrict.g?rev=954587&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/antlr3/org/apache/chemistry/opencmis/inmemory/query/CMISQLLexerStrict.g (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/antlr3/org/apache/chemistry/opencmis/inmemory/query/CMISQLLexerStrict.g Mon Jun 14 18:51:24 2010
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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
+ * Florent Guillaume, Nuxeo
+ */
+/**
+ * CMISQL lexer.
+ */
+lexer grammar CMISQLLexerStrict;
+
+tokens {
+ TABLE;
+ COL;
+ SEL_LIST;
+ IN_LIST;
+ IN_ANY;
+ NOT_IN_ANY;
+ EQ_ANY;
+ NOT_IN;
+ NOT_LIKE;
+ IS_NULL;
+ IS_NOT_NULL;
+ ORDER_BY;
+}
+
+@header {
+/*
+ * THIS FILE IS AUTO-GENERATED, DO NOT EDIT.
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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
+ * Florent Guillaume, Nuxeo
+ *
+ * THIS FILE IS AUTO-GENERATED, DO NOT EDIT.
+ */
+package org.apache.chemistry.opencmis.inmemory.query;
+}
+
+// ----- Generic SQL -----
+
+SELECT : ('S'|'s')('E'|'e')('L'|'l')('E'|'e')('C'|'c')('T'|'t');
+//DISTINCT : ('D'|'d')('I'|'i')('S'|'s')('T'|'t')('I'|'i')('N'|'n')('C'|'c')('T'|'t');
+FROM : ('F'|'f')('R'|'r')('O'|'o')('M'|'m');
+AS : ('A'|'a')('S'|'s');
+JOIN : ('J'|'j')('O'|'o')('I'|'i')('N'|'n');
+INNER : ('I'|'i')('N'|'n')('N'|'n')('E'|'e')('R'|'r');
+OUTER : ('O'|'o')('U'|'u')('T'|'t')('E'|'e')('R'|'r');
+LEFT : ('L'|'l')('E'|'e')('F'|'f')('T'|'t');
+RIGHT : ('R'|'r')('I'|'i')('G'|'g')('H'|'h')('T'|'t');
+ON : ('O'|'o')('N'|'n');
+WHERE : ('W'|'w')('H'|'h')('E'|'e')('R'|'r')('E'|'e');
+ORDER : ('O'|'o')('R'|'r')('D'|'d')('E'|'e')('R'|'r');
+BY : ('B'|'b')('Y'|'y');
+ASC : ('A'|'a')('S'|'s')('C'|'c');
+DESC : ('D'|'d')('E'|'e')('S'|'s')('C'|'c');
+
+// ----- Operators -----
+
+IS : ('I'|'i')('S'|'s');
+NULL : ('N'|'n')('U'|'u')('L'|'l')('L'|'l');
+AND : ('A'|'a')('N'|'n')('D'|'d');
+OR : ('O'|'o')('R'|'r');
+NOT : ('N'|'n')('O'|'o')('T'|'t');
+IN : ('I'|'i')('N'|'n');
+LIKE : ('L'|'l')('I'|'i')('K'|'k')('E'|'e');
+ANY : ('A'|'a')('N'|'n')('Y'|'y');
+CONTAINS : ('C'|'c')('O'|'o')('N'|'n')('T'|'t')('A'|'a')('I'|'i')('N'|'n')('S'|'s');
+SCORE : ('S'|'s')('C'|'c')('O'|'o')('R'|'r')('E'|'e');
+IN_FOLDER : ('I'|'i')('N'|'n')'_'('F'|'f')('O'|'o')('L'|'l')('D'|'d')('E'|'e')('R'|'r');
+IN_TREE : ('I'|'i')('N'|'n')'_'('T'|'t')('R'|'r')('E'|'e')('E'|'e');
+TIMESTAMP : 'TIMESTAMP'|'timestamp';
+
+STAR : '*';
+LPAR : '(';
+RPAR : ')';
+COMMA : ',';
+DOT : '.';
+EQ : '=';
+NEQ : '<>';
+LT : '<';
+GT : '>';
+LTEQ : '<=';
+GTEQ : '>=';
+
+// ----- Literals -----
+
+BOOL_LIT : 'TRUE' | 'true' | 'FALSE' | 'false';
+
+fragment Sign : ('+'|'-')?;
+fragment Digits : ('0'..'9')+;
+fragment ExactNumLit : Digits DOT Digits | Digits DOT | DOT Digits | Digits;
+fragment ApproxNumLit : ExactNumLit ('e'|'E') Sign Digits;
+NUM_LIT : Sign (ExactNumLit | ApproxNumLit);
+
+STRING_LIT : '\'' (~'\''|'\'\'')* '\'';
+
+WS : ( ' ' | '\t' | '\r'? '\n' )+ { $channel=HIDDEN; };
+
+TIME_LIT : TIMESTAMP WS STRING_LIT;
+
+ID :
+ ('a'..'z'|'A'..'Z'|'_')
+ ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|':')*
+ ;
Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/antlr3/org/apache/chemistry/opencmis/inmemory/query/CMISQLParserStrict.g
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/antlr3/org/apache/chemistry/opencmis/inmemory/query/CMISQLParserStrict.g?rev=954587&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/antlr3/org/apache/chemistry/opencmis/inmemory/query/CMISQLParserStrict.g (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/antlr3/org/apache/chemistry/opencmis/inmemory/query/CMISQLParserStrict.g Mon Jun 14 18:51:24 2010
@@ -0,0 +1,290 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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
+ * Florent Guillaume, Nuxeo
+ */
+/**
+ * CMISQL parser.
+ */
+parser grammar CMISQLParserStrict;
+
+options {
+ tokenVocab = CMISQLLexerStrict;
+ output = AST;
+}
+
+@header {
+/*
+ * THIS FILE IS AUTO-GENERATED, DO NOT EDIT.
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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
+ * Florent Guillaume, Nuxeo
+ *
+ * THIS FILE IS AUTO-GENERATED, DO NOT EDIT.
+ */
+package org.apache.chemistry.opencmis.inmemory.query;
+}
+
+@members {
+ public String errorMessage;
+
+ @Override
+ public void displayRecognitionError(String[] tokenNames,
+ RecognitionException e) {
+ if (errorMessage == null) {
+ String hdr = getErrorHeader(e);
+ String msg = getErrorMessage(e, tokenNames);
+ errorMessage = hdr + " " + msg;
+ }
+ }
+}
+
+// For CMIS SQL it will be sufficient to stop on first error:
+@rulecatch {
+}
+
+query:
+ SELECT select_list from_clause where_clause? order_by_clause?
+ -> ^(SELECT select_list from_clause order_by_clause? where_clause?)
+ ;
+
+select_list
+ : STAR
+ | select_sublist ( COMMA select_sublist )*
+ -> ^(SEL_LIST select_sublist+)
+ ;
+
+select_sublist
+ : value_expression ( AS!? column_name )?
+ | qualifier DOT STAR
+ //| multi_valued_column_reference
+ ;
+
+value_expression:
+ column_reference
+ | numeric_value_function
+ ;
+
+column_reference:
+ ( qualifier DOT )? column_name
+ -> ^(COL qualifier? column_name)
+ ;
+
+multi_valued_column_reference:
+ ( qualifier DOT )? multi_valued_column_name
+ -> ^(COL qualifier? multi_valued_column_name)
+ ;
+
+numeric_value_function:
+ SCORE LPAR RPAR -> ^(SCORE);
+
+qualifier:
+ table_name
+ //| correlation_name
+ ;
+
+from_clause: FROM^ table_reference;
+
+table_reference:
+ one_table table_join*
+ ;
+
+table_join:
+ join_kind one_table join_specification?
+ -> ^(JOIN join_kind one_table join_specification?)
+ ;
+
+one_table:
+ LPAR! table_reference RPAR!
+ | table_name
+ -> ^(TABLE table_name)
+ | table_name AS? correlation_name
+ -> ^(TABLE table_name correlation_name)
+ ;
+
+join_kind:
+ JOIN
+ -> INNER
+ | INNER JOIN
+ -> INNER
+ | LEFT OUTER? JOIN
+ -> LEFT
+ | RIGHT OUTER? JOIN
+ -> RIGHT
+ ;
+
+join_specification:
+ ON^ column_reference EQ column_reference
+ ;
+
+///////////////////////////////////////////////////////////
+// Begin Where
+
+where_clause: WHERE^ search_condition;
+
+search_condition:
+ boolean_term (OR^ boolean_term)*;
+
+boolean_term:
+ boolean_factor (AND^ boolean_factor)*;
+
+boolean_factor:
+ NOT^ boolean_test
+ | boolean_test
+ ;
+
+boolean_test:
+ predicate
+ | LPAR search_condition RPAR -> 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 EQ literal
+ -> ^(EQ value_expression literal)
+ | value_expression NEQ literal
+ -> ^(NEQ value_expression literal)
+ | value_expression LT literal
+ -> ^(LT value_expression literal)
+ | value_expression GT literal
+ -> ^(GT value_expression literal)
+ | value_expression LTEQ literal
+ -> ^(LTEQ value_expression literal)
+ | value_expression GTEQ literal
+ -> ^(GTEQ value_expression literal)
+ ;
+
+literal:
+ NUM_LIT
+ | STRING_LIT
+ | TIME_LIT
+ | BOOL_LIT
+ ;
+
+in_predicate:
+ column_reference IN LPAR in_value_list RPAR
+ -> ^(IN column_reference in_value_list)
+ | column_reference NOT IN LPAR in_value_list RPAR
+ -> ^(NOT_IN column_reference in_value_list)
+ ;
+
+in_value_list:
+ literal ( COMMA literal )*
+ -> ^(IN_LIST literal+)
+ ;
+
+like_predicate:
+ column_reference LIKE STRING_LIT
+ -> ^(LIKE column_reference STRING_LIT)
+ | column_reference NOT LIKE STRING_LIT
+ -> ^(NOT_LIKE column_reference STRING_LIT)
+ ;
+
+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 -> ^(IS_NOT_NULL column_reference)
+ | NULL -> ^(IS_NULL column_reference)
+ )
+ ;
+
+quantified_comparison_predicate:
+ literal EQ ANY multi_valued_column_reference
+ -> ^(EQ_ANY literal multi_valued_column_reference)
+ ;
+
+quantified_in_predicate:
+ ANY multi_valued_column_reference
+ ( NOT IN LPAR in_value_list RPAR
+ -> ^(NOT_IN_ANY multi_valued_column_reference in_value_list )
+ | IN LPAR in_value_list RPAR
+ -> ^(IN_ANY multi_valued_column_reference in_value_list )
+ )
+ ;
+
+text_search_predicate:
+ CONTAINS LPAR (qualifier COMMA)? text_search_expression RPAR
+ -> ^(CONTAINS qualifier? text_search_expression)
+ ;
+
+// end where
+/////////////////////////////////////////////////////////////////
+
+folder_predicate:
+ ( f=IN_FOLDER | f=IN_TREE ) LPAR (qualifier COMMA)? folder_id RPAR
+ -> ^($f qualifier? folder_id)
+ ;
+
+order_by_clause:
+ ORDER BY sort_specification ( COMMA sort_specification )*
+ -> ^(ORDER_BY sort_specification+)
+ ;
+
+sort_specification:
+ column_reference -> column_reference ASC
+ | column_reference ( ASC | DESC )
+ ;
+
+correlation_name:
+ ID;
+
+table_name:
+ ID;
+
+column_name:
+ ID;
+
+multi_valued_column_name:
+ ID;
+
+folder_id:
+ STRING_LIT;
+
+text_search_expression:
+ STRING_LIT;
Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/antlr3/org/apache/chemistry/opencmis/inmemory/query/CmisQueryWalker.g
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/antlr3/org/apache/chemistry/opencmis/inmemory/query/CmisQueryWalker.g?rev=954587&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/antlr3/org/apache/chemistry/opencmis/inmemory/query/CmisQueryWalker.g (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/antlr3/org/apache/chemistry/opencmis/inmemory/query/CmisQueryWalker.g Mon Jun 14 18:51:24 2010
@@ -0,0 +1,324 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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:
+ * Florent Guillaume, Nuxeo
+ */
+/**
+ * CMISQL tree grammar, walker for the inmemory implementation.
+ * This aims at implementing proper semantics without any speed
+ * optimization.
+ */
+tree grammar CmisQueryWalker;
+
+options {
+ tokenVocab = CMISQLParserStrict;
+ ASTLabelType = CommonTree;
+ output = AST;
+}
+
+@header {
+/*
+ * THIS FILE IS AUTO-GENERATED, DO NOT EDIT.
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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:
+ * Florent Guillaume, Nuxeo
+ *
+ * THIS FILE IS AUTO-GENERATED, DO NOT EDIT.
+ */
+package org.apache.chemistry.opencmis.inmemory.query;
+
+import java.math.BigDecimal;
+
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.HashMap;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+}
+
+@members {
+ private static Log LOG = LogFactory.getLog(CmisQueryWalker.class);
+
+ public QueryObject queryObj;
+ public String errorMessage;
+
+ @Override
+ public void displayRecognitionError(String[] tokenNames,
+ RecognitionException e) {
+ if (errorMessage == null) {
+ String hdr = getErrorHeader(e);
+ String msg = getErrorMessage(e, tokenNames);
+ errorMessage = hdr + " " + msg;
+ }
+ }
+
+ public String getErrorMessageString() {
+ return errorMessage;
+ }
+
+ protected void mismatch(IntStream input, int ttype, BitSet follow)
+ throws RecognitionException
+ {
+ throw new MismatchedTokenException(ttype, input);
+ }
+
+ public void recoverFromMismatchedSet(IntStream input, RecognitionException e, antlr.collections.impl.BitSet follow)
+ throws RecognitionException
+ {
+ throw e;
+ }
+}
+
+// For CMIS SQL it will be sufficient to stop on first error:
+@rulecatch {
+ catch (RecognitionException e) {
+ throw e;
+ }
+}
+
+query [QueryObject qo]
+ @init {
+ queryObj = qo;
+ }:
+ ^(SELECT select_list from_clause order_by_clause? where_clause)
+ {
+ queryObj.resolveTypes();
+ queryObj.processWhereClause($where_clause.tree);
+ }
+ ;
+
+select_list:
+ STAR
+ {
+ //queryObj.addSelectReference($STAR.getToken(), new ColumnReference($STAR.text));
+ // LOG.debug("Adding * to col refs: " + $STAR);
+ queryObj.addSelectReference($STAR, new ColumnReference($STAR.text));
+ }
+ | ^(SEL_LIST select_sublist+)
+ ;
+
+select_sublist
+ scope { String current; }
+ :
+ value_expression column_name?
+ {
+ // add selector
+ queryObj.addSelectReference($value_expression.start, $value_expression.result);
+ // add alias for column
+ if ($column_name.text != null) {
+ queryObj.addAlias($column_name.text, $value_expression.result);
+ }
+ }
+ | s=qualifier DOT STAR
+ {
+ // queryObj.addSelectReference($STAR.getToken(), new ColumnReference($qualifier.value, $STAR.text));
+ // LOG.debug("Adding x.* to col refs: " + $s.start);
+ queryObj.addSelectReference($s.start, new ColumnReference($qualifier.value, $STAR.text));
+ }
+ ;
+
+
+value_expression returns [CmisSelector result]:
+ column_reference
+ {
+ $result = $column_reference.result;
+ }
+ | SCORE^
+ {
+ $result = new FunctionReference(FunctionReference.CmisQlFunction.SCORE);
+ }
+ ;
+
+column_reference returns [ColumnReference result]:
+ ^(COL qualifier? column_name)
+ {
+ $result = new ColumnReference($qualifier.value, $column_name.text);
+ }
+ ;
+
+// multi_valued_column_reference returns [Object value]:
+// ^(COL qualifier? column_name)
+
+qualifier returns [String value]:
+ table_name
+// | correlation_name
+ {
+ $value = $table_name.text;
+ }
+ ;
+
+from_clause:
+ ^(FROM table_reference)
+ ;
+
+table_reference:
+ one_table table_join*
+ ;
+
+table_join:
+ ^(JOIN join_kind one_table join_specification?)
+ {
+ //throw new UnsupportedOperationException("JOIN");
+ }
+ ;
+
+one_table:
+ ^(TABLE table_name correlation_name?)
+ {
+ queryObj.addType($correlation_name.text, $table_name.text);
+ }
+ ;
+
+join_kind:
+ INNER | LEFT | OUTER;
+
+join_specification:
+ ^(ON cr1=column_reference EQ cr2=column_reference)
+ {
+ queryObj.addJoinReference($cr1.start, $cr1.result);
+ queryObj.addJoinReference($cr2.start, $cr2.result);
+ }
+ ;
+
+where_clause:
+ ^(WHERE search_condition)
+ | /* nothing */
+ ;
+
+search_condition
+@init {
+ List<Object> listLiterals;
+}:
+ ^(OR s1=search_condition s2=search_condition)
+ | ^(AND s1=search_condition s2=search_condition)
+ | ^(NOT search_condition)
+ | ^(EQ search_condition search_condition)
+ | ^(NEQ search_condition search_condition)
+ | ^(LT search_condition search_condition)
+ | ^(GT search_condition search_condition)
+ | ^(GTEQ search_condition search_condition)
+ | ^(LTEQ search_condition search_condition)
+ | ^(LIKE search_condition search_condition)
+ | ^(NOT_LIKE search_condition search_condition)
+ | ^(IS_NULL search_condition)
+ | ^(IS_NOT_NULL search_condition)
+ | ^(EQ_ANY search_condition search_condition)
+ | ^(IN_ANY search_condition in_value_list )
+ | ^(NOT_IN_ANY search_condition in_value_list)
+ | ^(CONTAINS qualifier? text_search_expression)
+ | ^(IN_FOLDER qualifier? search_condition)
+ | ^(IN_TREE qualifier? search_condition)
+ | ^(IN column_reference in_value_list)
+ {
+ LOG.debug("IN list: " + $in_value_list.inList);
+ }
+ | ^(NOT_IN column_reference in_value_list)
+ | value_expression
+ {
+ LOG.debug(" add node to where: " + $value_expression.start + " id: " + System.identityHashCode($value_expression.start));
+ queryObj.addWhereReference($value_expression.start, $value_expression.result);
+ }
+ | literal
+ ;
+
+in_value_list returns [Object inList]
+@init {
+ List<Object> inLiterals = new ArrayList<Object>();
+}:
+ ^(IN_LIST (l=literal {inLiterals.add($l.value);})+ )
+ {
+ $inList = inLiterals;
+ }
+ ;
+
+text_search_expression:
+ STRING_LIT; // TODO: extend grammar with full text part
+
+
+literal returns [Object value]:
+ NUM_LIT
+ {
+ try {
+ $value = Long.valueOf($NUM_LIT.text);
+ } catch (NumberFormatException e) {
+ $value = new BigDecimal($NUM_LIT.text);
+ }
+ }
+ | STRING_LIT
+ {
+ String s = $STRING_LIT.text;
+ $value = s.substring(1, s.length() - 1);
+ }
+ | TIME_LIT
+ {
+ String s = $TIME_LIT.text;
+ s = s.substring(s.indexOf('\'') + 1, s.length() - 1);
+ try {
+ // $value = CalendarHelper.fromString(s);
+ } catch (IllegalArgumentException e) {
+ throw new UnwantedTokenException(Token.INVALID_TOKEN_TYPE, input);
+ }
+ }
+ | BOOL_LIT
+ {
+ $value = Boolean.valueOf($BOOL_LIT.text);
+ }
+ ;
+
+order_by_clause:
+ ^(ORDER_BY sort_specification+)
+ ;
+
+sort_specification:
+ column_reference ASC
+ {
+ queryObj.addSortCriterium($column_reference.start, $column_reference.result, true);
+ }
+ | column_reference DESC
+ {
+ queryObj.addSortCriterium($column_reference.start, $column_reference.result, false);
+ }
+ ;
+
+correlation_name:
+ ID;
+
+table_name:
+ ID;
+
+column_name:
+ ID;
Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/DataObjectCreator.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/DataObjectCreator.java?rev=954587&r1=954586&r2=954587&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/DataObjectCreator.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/DataObjectCreator.java Mon Jun 14 18:51:24 2010
@@ -37,7 +37,6 @@ import org.apache.chemistry.opencmis.com
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PolicyIdListImpl;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.Content;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.Folder;
-import org.apache.chemistry.opencmis.inmemory.storedobj.api.ObjectStore;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.StoredObject;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.Version;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.VersionedDocument;
Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/TypeManager.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/TypeManager.java?rev=954587&r1=954586&r2=954587&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/TypeManager.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/TypeManager.java Mon Jun 14 18:51:24 2010
@@ -18,39 +18,13 @@
*/
package org.apache.chemistry.opencmis.inmemory;
-import java.util.ArrayList;
import java.util.Collection;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionContainer;
-import org.apache.chemistry.opencmis.commons.impl.Converter;
-import org.apache.chemistry.opencmis.commons.impl.dataobjects.AbstractPropertyDefinition;
-import org.apache.chemistry.opencmis.commons.impl.dataobjects.TypeDefinitionContainerImpl;
-import org.apache.chemistry.opencmis.commons.impl.jaxb.CmisPropertyDefinitionType;
-import org.apache.chemistry.opencmis.inmemory.types.DocumentTypeCreationHelper;
-import org.apache.chemistry.opencmis.inmemory.types.InMemoryDocumentTypeDefinition;
-import org.apache.chemistry.opencmis.inmemory.types.InMemoryFolderTypeDefinition;
-import org.apache.chemistry.opencmis.inmemory.types.InMemoryPolicyTypeDefinition;
-import org.apache.chemistry.opencmis.inmemory.types.InMemoryRelationshipTypeDefinition;
-
-/**
- * Class that manages a type system for a repository types can be added, the
- * inheritance can be managed and type can be retrieved for a given type id.
- *
- * @author Jens
- *
- */
-public class TypeManager {
- /**
- * map from repository id to a types map
- */
- private Map<String, TypeDefinitionContainer> fTypesMap = new HashMap<String, TypeDefinitionContainer>();
+public interface TypeManager {
/**
* return a type definition from the type definition id
@@ -59,9 +33,7 @@ public class TypeManager {
* id of the type definition
* @return type definition for this id
*/
- public TypeDefinitionContainer getTypeById(String typeId) {
- return fTypesMap.get(typeId);
- }
+ public abstract TypeDefinitionContainer getTypeById(String typeId);
/**
* return a type definition from the type query name or null if not found
@@ -70,30 +42,14 @@ public class TypeManager {
* query name of the type definition
* @return type definition for this query name
*/
- public TypeDefinition getTypeByQueryName(String typeQueryName) {
- for (Entry<String, TypeDefinitionContainer> entry : fTypesMap.entrySet()) {
- if (entry.getValue().getTypeDefinition().getQueryName().equals(typeQueryName))
- return entry.getValue().getTypeDefinition();
- }
- return null;
- }
+ public abstract TypeDefinition getTypeByQueryName(String typeQueryName);
/**
* return a list of all types known in this repository
*
* @return
*/
- public synchronized Collection<TypeDefinitionContainer> getTypeDefinitionList() {
-
- List<TypeDefinitionContainer> typeRoots = new ArrayList<TypeDefinitionContainer>();
- // iterate types map and return a list collecting the root types:
- for (TypeDefinitionContainer typeDef : fTypesMap.values()) {
- if (typeDef.getTypeDefinition().getParentTypeId() == null)
- typeRoots.add(typeDef);
- }
-
- return typeRoots;
- }
+ public abstract Collection<TypeDefinitionContainer> getTypeDefinitionList();
/**
* return a list of the root types as defined in the CMIS spec (for
@@ -101,84 +57,8 @@ public class TypeManager {
*
* @return
*/
- public List<TypeDefinitionContainer> getRootTypes() {
- // just take first repository
- List<TypeDefinitionContainer> rootTypes = new ArrayList<TypeDefinitionContainer>();
-
- for (TypeDefinitionContainer type : fTypesMap.values())
- if (isRootType(type))
- rootTypes.add(type);
-
- return rootTypes;
- }
-
- /**
- * Initialize the type system with the given types. This list must not
- * contain the CMIS default types. The default type are always contained by
- * default.
- *
- * @param typesList
- * list of types to add to the repository
- *
- */
- public void initTypeSystem(List<TypeDefinition> typesList) {
+ public abstract List<TypeDefinitionContainer> getRootTypes();
- createCmisDefaultTypes();
-
- // merge all types from the list and build the correct hierachy with
- // children
- // and property lists
- if (null != typesList) {
- for (TypeDefinition typeDef : typesList)
- addTypeDefinition(typeDef);
- }
-
- }
-
- /**
- * Add a type to the type system. Add all properties from inherited types,
- * add type to children of parent types.
- *
- * @param repositoryId
- * repository to which the type is added
- * @param cmisType
- * new type to add
- */
- public void addTypeDefinition(TypeDefinition cmisType) {
- if (fTypesMap.containsKey(cmisType.getId()))
- throw new RuntimeException("You cannot add type with id " + cmisType.getId()
- + " because it already exists.");
-
- TypeDefinitionContainerImpl typeContainer = new TypeDefinitionContainerImpl(cmisType);
-
- if (!fTypesMap.containsKey(cmisType.getParentTypeId()))
- throw new RuntimeException("Cannot add type, because parent with id " + cmisType.getParentTypeId()
- + " does not exist.");
-
- // add new type to children of parent types
- TypeDefinitionContainer parentTypeContainer = fTypesMap.get(cmisType.getParentTypeId());
- parentTypeContainer.getChildren().add(typeContainer);
-
- // recursively add inherited properties
- Map<String, PropertyDefinition<?>> propDefs = typeContainer.getTypeDefinition().getPropertyDefinitions();
- addInheritedProperties(propDefs, parentTypeContainer.getTypeDefinition());
-
- // add type to type map
- fTypesMap.put(cmisType.getId(), typeContainer);
- }
-
- /**
- * Remove all types from the type system. After this call only the default
- * CMIS types are present in the type system. Use this method with care, its
- * mainly intended for unit tests
- *
- * @param repositoryId
- */
- public void clearTypeSystem() {
- fTypesMap.clear();
- createCmisDefaultTypes();
- }
-
/**
* retrieve the property id from a type for a given property query name
*
@@ -189,76 +69,6 @@ public class TypeManager {
* @return
* property id of property or null if not found
*/
- public String getPropertyIdForQueryName(TypeDefinition typeDefinition, String propQueryName) {
- for (PropertyDefinition<?> pd : typeDefinition.getPropertyDefinitions().values()) {
- if (pd.getQueryName().equals(propQueryName))
- return pd.getId();
- }
- return null;
- }
-
- private void addInheritedProperties(Map<String, PropertyDefinition<?>> propDefs, TypeDefinition typeDefinition) {
-
- if (null == typeDefinition)
- return;
-
- if (null != typeDefinition.getPropertyDefinitions())
- addInheritedPropertyDefinitions(propDefs, typeDefinition.getPropertyDefinitions());
- // propDefs.putAll(typeDefinition.getPropertyDefinitions());
-
- TypeDefinitionContainer parentTypeContainer = fTypesMap.get(typeDefinition.getParentTypeId());
- TypeDefinition parentType = (null == parentTypeContainer ? null : parentTypeContainer.getTypeDefinition());
- addInheritedProperties(propDefs, parentType);
- }
-
- private void addInheritedPropertyDefinitions(Map<String, PropertyDefinition<?>> propDefs,
- Map<String, PropertyDefinition<?>> superPropDefs) {
-
- for (Entry<String, PropertyDefinition<?>> superProp : superPropDefs.entrySet()) {
- PropertyDefinition<?> superPropDef = superProp.getValue();
- PropertyDefinition<?> clone = clonePropertyDefinition(superPropDef);
- ((AbstractPropertyDefinition<?>) clone).setIsInherited(true);
- propDefs.put(superProp.getKey(), clone);
- }
- }
-
- private void createCmisDefaultTypes() {
- List<TypeDefinition> typesList = DocumentTypeCreationHelper.createDefaultTypes();
- for (TypeDefinition typeDef : typesList) {
- TypeDefinitionContainerImpl typeContainer = new TypeDefinitionContainerImpl(typeDef);
- fTypesMap.put(typeDef.getId(), typeContainer);
- }
- }
-
- private static boolean isRootType(TypeDefinitionContainer c) {
- if (c.getTypeDefinition().equals(InMemoryFolderTypeDefinition.getRootFolderType())
- || c.getTypeDefinition().equals(InMemoryDocumentTypeDefinition.getRootDocumentType())
- || c.getTypeDefinition().equals(InMemoryRelationshipTypeDefinition.getRootRelationshipType())
- || c.getTypeDefinition().equals(InMemoryPolicyTypeDefinition.getRootPolicyType()))
- return true;
- else
- return false;
- }
-
- private static PropertyDefinition<?> clonePropertyDefinition(PropertyDefinition<?> src) {
- // use JAXB converter to easily clone a property definition
- CmisPropertyDefinitionType tmp = Converter.convert(src);
- PropertyDefinition<?> clone = Converter.convert(tmp);
- return clone;
- }
-
- // private static PropertyDefinition<?>
- // clonePropertyDefinition2(PropertyDefinition<?> src)
- // throws IOException, ClassNotFoundException {
- // ByteArrayOutputStream bout = new ByteArrayOutputStream();
- // ObjectOutputStream oout = new ObjectOutputStream(bout);
- // oout.writeObject(src);
- // byte[] bytes = bout.toByteArray();
- //
- // ByteArrayInputStream bin = new ByteArrayInputStream(bytes);
- // ObjectInputStream oin = new ObjectInputStream(bin);
- // PropertyDefinition<?> clone = (PropertyDefinition<?>) oin.readObject();
- // return clone;
- // }
+ public abstract String getPropertyIdForQueryName(TypeDefinition typeDefinition, String propQueryName);
-}
+}
\ No newline at end of file
Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/TypeManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/TypeManagerImpl.java?rev=954587&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/TypeManagerImpl.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/TypeManagerImpl.java Mon Jun 14 18:51:24 2010
@@ -0,0 +1,244 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.chemistry.opencmis.inmemory;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionContainer;
+import org.apache.chemistry.opencmis.commons.impl.Converter;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.AbstractPropertyDefinition;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.TypeDefinitionContainerImpl;
+import org.apache.chemistry.opencmis.commons.impl.jaxb.CmisPropertyDefinitionType;
+import org.apache.chemistry.opencmis.inmemory.types.DocumentTypeCreationHelper;
+import org.apache.chemistry.opencmis.inmemory.types.InMemoryDocumentTypeDefinition;
+import org.apache.chemistry.opencmis.inmemory.types.InMemoryFolderTypeDefinition;
+import org.apache.chemistry.opencmis.inmemory.types.InMemoryPolicyTypeDefinition;
+import org.apache.chemistry.opencmis.inmemory.types.InMemoryRelationshipTypeDefinition;
+
+/**
+ * Class that manages a type system for a repository types can be added, the
+ * inheritance can be managed and type can be retrieved for a given type id.
+ *
+ * @author Jens
+ *
+ */
+public class TypeManagerImpl implements TypeManager {
+
+ /**
+ * map from repository id to a types map
+ */
+ private Map<String, TypeDefinitionContainer> fTypesMap = new HashMap<String, TypeDefinitionContainer>();
+
+ /* (non-Javadoc)
+ * @see org.apache.chemistry.opencmis.inmemory.TypeManager#getTypeById(java.lang.String)
+ */
+ public TypeDefinitionContainer getTypeById(String typeId) {
+ return fTypesMap.get(typeId);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.chemistry.opencmis.inmemory.TypeManager#getTypeByQueryName(java.lang.String)
+ */
+ public TypeDefinition getTypeByQueryName(String typeQueryName) {
+ for (Entry<String, TypeDefinitionContainer> entry : fTypesMap.entrySet()) {
+ if (entry.getValue().getTypeDefinition().getQueryName().equals(typeQueryName))
+ return entry.getValue().getTypeDefinition();
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.chemistry.opencmis.inmemory.TypeManager#getTypeDefinitionList()
+ */
+ public synchronized Collection<TypeDefinitionContainer> getTypeDefinitionList() {
+
+ List<TypeDefinitionContainer> typeRoots = new ArrayList<TypeDefinitionContainer>();
+ // iterate types map and return a list collecting the root types:
+ for (TypeDefinitionContainer typeDef : fTypesMap.values()) {
+ if (typeDef.getTypeDefinition().getParentTypeId() == null)
+ typeRoots.add(typeDef);
+ }
+
+ return typeRoots;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.chemistry.opencmis.inmemory.TypeManager#getRootTypes()
+ */
+ public List<TypeDefinitionContainer> getRootTypes() {
+ // just take first repository
+ List<TypeDefinitionContainer> rootTypes = new ArrayList<TypeDefinitionContainer>();
+
+ for (TypeDefinitionContainer type : fTypesMap.values())
+ if (isRootType(type))
+ rootTypes.add(type);
+
+ return rootTypes;
+ }
+
+ /**
+ * Initialize the type system with the given types. This list must not
+ * contain the CMIS default types. The default type are always contained by
+ * default.
+ *
+ * @param typesList
+ * list of types to add to the repository
+ *
+ */
+ public void initTypeSystem(List<TypeDefinition> typesList) {
+
+ createCmisDefaultTypes();
+
+ // merge all types from the list and build the correct hierachy with
+ // children
+ // and property lists
+ if (null != typesList) {
+ for (TypeDefinition typeDef : typesList)
+ addTypeDefinition(typeDef);
+ }
+
+ }
+
+ /**
+ * Add a type to the type system. Add all properties from inherited types,
+ * add type to children of parent types.
+ *
+ * @param repositoryId
+ * repository to which the type is added
+ * @param cmisType
+ * new type to add
+ */
+ public void addTypeDefinition(TypeDefinition cmisType) {
+ if (fTypesMap.containsKey(cmisType.getId()))
+ throw new RuntimeException("You cannot add type with id " + cmisType.getId()
+ + " because it already exists.");
+
+ TypeDefinitionContainerImpl typeContainer = new TypeDefinitionContainerImpl(cmisType);
+
+ if (!fTypesMap.containsKey(cmisType.getParentTypeId()))
+ throw new RuntimeException("Cannot add type, because parent with id " + cmisType.getParentTypeId()
+ + " does not exist.");
+
+ // add new type to children of parent types
+ TypeDefinitionContainer parentTypeContainer = fTypesMap.get(cmisType.getParentTypeId());
+ parentTypeContainer.getChildren().add(typeContainer);
+
+ // recursively add inherited properties
+ Map<String, PropertyDefinition<?>> propDefs = typeContainer.getTypeDefinition().getPropertyDefinitions();
+ addInheritedProperties(propDefs, parentTypeContainer.getTypeDefinition());
+
+ // add type to type map
+ fTypesMap.put(cmisType.getId(), typeContainer);
+ }
+
+ /**
+ * Remove all types from the type system. After this call only the default
+ * CMIS types are present in the type system. Use this method with care, its
+ * mainly intended for unit tests
+ *
+ * @param repositoryId
+ */
+ public void clearTypeSystem() {
+ fTypesMap.clear();
+ createCmisDefaultTypes();
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.chemistry.opencmis.inmemory.TypeManager#getPropertyIdForQueryName(org.apache.chemistry.opencmis.commons.definitions.TypeDefinition, java.lang.String)
+ */
+ public String getPropertyIdForQueryName(TypeDefinition typeDefinition, String propQueryName) {
+ for (PropertyDefinition<?> pd : typeDefinition.getPropertyDefinitions().values()) {
+ if (pd.getQueryName().equals(propQueryName))
+ return pd.getId();
+ }
+ return null;
+ }
+
+ private void addInheritedProperties(Map<String, PropertyDefinition<?>> propDefs, TypeDefinition typeDefinition) {
+
+ if (null == typeDefinition)
+ return;
+
+ if (null != typeDefinition.getPropertyDefinitions())
+ addInheritedPropertyDefinitions(propDefs, typeDefinition.getPropertyDefinitions());
+ // propDefs.putAll(typeDefinition.getPropertyDefinitions());
+
+ TypeDefinitionContainer parentTypeContainer = fTypesMap.get(typeDefinition.getParentTypeId());
+ TypeDefinition parentType = (null == parentTypeContainer ? null : parentTypeContainer.getTypeDefinition());
+ addInheritedProperties(propDefs, parentType);
+ }
+
+ private void addInheritedPropertyDefinitions(Map<String, PropertyDefinition<?>> propDefs,
+ Map<String, PropertyDefinition<?>> superPropDefs) {
+
+ for (Entry<String, PropertyDefinition<?>> superProp : superPropDefs.entrySet()) {
+ PropertyDefinition<?> superPropDef = superProp.getValue();
+ PropertyDefinition<?> clone = clonePropertyDefinition(superPropDef);
+ ((AbstractPropertyDefinition<?>) clone).setIsInherited(true);
+ propDefs.put(superProp.getKey(), clone);
+ }
+ }
+
+ private void createCmisDefaultTypes() {
+ List<TypeDefinition> typesList = DocumentTypeCreationHelper.createDefaultTypes();
+ for (TypeDefinition typeDef : typesList) {
+ TypeDefinitionContainerImpl typeContainer = new TypeDefinitionContainerImpl(typeDef);
+ fTypesMap.put(typeDef.getId(), typeContainer);
+ }
+ }
+
+ private static boolean isRootType(TypeDefinitionContainer c) {
+ if (c.getTypeDefinition().equals(InMemoryFolderTypeDefinition.getRootFolderType())
+ || c.getTypeDefinition().equals(InMemoryDocumentTypeDefinition.getRootDocumentType())
+ || c.getTypeDefinition().equals(InMemoryRelationshipTypeDefinition.getRootRelationshipType())
+ || c.getTypeDefinition().equals(InMemoryPolicyTypeDefinition.getRootPolicyType()))
+ return true;
+ else
+ return false;
+ }
+
+ private static PropertyDefinition<?> clonePropertyDefinition(PropertyDefinition<?> src) {
+ // use JAXB converter to easily clone a property definition
+ CmisPropertyDefinitionType tmp = Converter.convert(src);
+ PropertyDefinition<?> clone = Converter.convert(tmp);
+ return clone;
+ }
+
+ // private static PropertyDefinition<?>
+ // clonePropertyDefinition2(PropertyDefinition<?> src)
+ // throws IOException, ClassNotFoundException {
+ // ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ // ObjectOutputStream oout = new ObjectOutputStream(bout);
+ // oout.writeObject(src);
+ // byte[] bytes = bout.toByteArray();
+ //
+ // ByteArrayInputStream bin = new ByteArrayInputStream(bytes);
+ // ObjectInputStream oin = new ObjectInputStream(bin);
+ // PropertyDefinition<?> clone = (PropertyDefinition<?>) oin.readObject();
+ // return clone;
+ // }
+
+}
Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/CmisSelector.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/CmisSelector.java?rev=954587&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/CmisSelector.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/CmisSelector.java Mon Jun 14 18:51:24 2010
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.chemistry.opencmis.inmemory.query;
+
+public abstract class CmisSelector {
+ private String aliasName; // Alias name for a column (only in SELECT part set)
+
+ public void setAliasName(String alias) {
+ aliasName = alias;
+ }
+
+ public String getAliasName() {
+ return aliasName;
+ }
+ public abstract String getName();
+}
Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/ColumnReference.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/ColumnReference.java?rev=954587&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/ColumnReference.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/ColumnReference.java Mon Jun 14 18:51:24 2010
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.chemistry.opencmis.inmemory.query;
+
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
+
+public class ColumnReference extends CmisSelector {
+
+ private String typeQueryName; // type query name coming from query statement
+ private String propQueryName; // property query name coming from query statement
+
+ // The following fields are set when the types are resolved:
+ private String propertyId;
+ private TypeDefinition typeDef;
+
+ public ColumnReference(String typeQueryName, String propQueryName) {
+ this.typeQueryName = typeQueryName;
+ this.propQueryName = propQueryName;
+ }
+
+ public ColumnReference(String propQueryName) {
+ this.typeQueryName = null;
+ this.propQueryName = propQueryName;
+ }
+
+ public String getTypeQueryName() {
+ return typeQueryName;
+ }
+
+ public String getPropertyQueryName() {
+ return propQueryName;
+ }
+
+ @Override
+ public String getName() {
+ return propQueryName;
+ }
+
+ void setTypeDefinition(String propertyId, TypeDefinition typeDef) {
+ this.typeDef = typeDef;
+ this.propertyId = propertyId;
+ }
+
+ public TypeDefinition getTypeDefinition() {
+ return typeDef;
+ }
+
+ public String getPropertyId() {
+ return propertyId;
+ }
+
+ public String toString() {
+ return "Column Reference for column " + propQueryName + " in type " + typeQueryName;
+ }
+}
Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/FunctionReference.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/FunctionReference.java?rev=954587&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/FunctionReference.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/FunctionReference.java Mon Jun 14 18:51:24 2010
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.chemistry.opencmis.inmemory.query;
+
+public class FunctionReference extends CmisSelector {
+
+ public enum CmisQlFunction { SCORE, };
+
+ private CmisQlFunction function;
+
+ public FunctionReference(CmisQlFunction func) {
+ this.function = func;
+ }
+
+ public CmisQlFunction getFunction() {
+ return function;
+ }
+
+ public String toString() {
+ return "FunctionReference for " + function.toString();
+ }
+
+ @Override
+ public String getName() {
+ return function.toString();
+ }
+
+}
Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/IQueryConditionProcessor.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/IQueryConditionProcessor.java?rev=954587&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/IQueryConditionProcessor.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/IQueryConditionProcessor.java Mon Jun 14 18:51:24 2010
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.chemistry.opencmis.inmemory.query;
+
+import org.antlr.runtime.tree.Tree;
+
+/**
+ * An interface used by the walker when traversing the AST from the grammar.
+ * The interface consists of callback methods that are called when a rule
+ * is processed (as part of the WHERE statement)
+ * @author Jens
+ *
+ */
+public interface IQueryConditionProcessor {
+
+ void onStartProcessing(Tree whereNode);
+ void onStopProcessing();
+
+ // Compare operators
+ void onEquals(Tree eqNode, Tree leftNode, Tree rightNode);
+ void onNotEquals(Tree neNode, Tree leftNode, Tree rightNode);
+ void onGreaterThan(Tree gtNode, Tree leftNode, Tree rightNode);
+ void onGreaterOrEquals(Tree geNode, Tree leftNode, Tree rightNode);
+ void onLessThan(Tree ltNode, Tree leftNode, Tree rightNode);
+ void onLessOrEquals(Tree leqNode, Tree leftNode, Tree rightNode);
+
+ // Boolean operators
+ void onNot(Tree opNode, Tree leftNode);
+ void onAnd(Tree opNode, Tree leftNode, Tree rightNode);
+ void onOr(Tree opNode, Tree leftNode, Tree rightNode);
+
+ // Multi-value:
+ void onIn(Tree node, Tree colNode, Tree listNode);
+ void onNotIn(Tree node, Tree colNode, Tree listNode);
+ void onInAny(Tree node, Tree colNode, Tree listNode);
+ void onNotInAny(Tree node, Tree colNode, Tree listNode);
+ void onEqAny(Tree node, Tree literalNode, Tree colNode);
+
+ // Null comparisons:
+ public void onIsNull(Tree nullNode, Tree colNode);
+ public void onIsNotNull(Tree notNullNode, Tree colNode);
+
+ // String matching:
+ void onIsLike(Tree node, Tree colNode, Tree stringNode);
+ void onIsNotLike(Tree node, Tree colNode, Tree stringNode);
+
+ // Functions:
+ void onContains(Tree node, Tree colNode, Tree paramNode);
+ void onInFolder(Tree node, Tree colNode, Tree paramNode);
+ void onInTree(Tree node, Tree colNode, Tree paramNode);
+ void onScore(Tree node, Tree paramNode);
+}