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 2010/07/29 19:13:30 UTC
svn commit: r980513 [10/15] - in
/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server:
chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/dummy/
chemistry-opencmis-server-bindings/src/main/java/org/apach...
Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/ProcessQueryTest.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/ProcessQueryTest.java?rev=980513&r1=980512&r2=980513&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/ProcessQueryTest.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/ProcessQueryTest.java Thu Jul 29 17:13:28 2010
@@ -1,541 +1,541 @@
-/*
- * 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 static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.antlr.runtime.tree.Tree;
-import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
-import org.apache.chemistry.opencmis.inmemory.TypeManagerImpl;
-import org.apache.chemistry.opencmis.server.support.query.CalendarHelper;
-import org.apache.chemistry.opencmis.server.support.query.CmisQlStrictLexer;
-import org.apache.chemistry.opencmis.server.support.query.QueryConditionProcessor;
-import org.apache.chemistry.opencmis.server.support.query.QueryObject;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ProcessQueryTest extends AbstractQueryTest {
-
- static private class TestQueryProcessor implements QueryConditionProcessor {
-
- private static Log log = LogFactory.getLog(ProcessQueryTest.class);
-
- private static final String ON_START = "onStartWasCalled";
- private static final String ON_STOP = "onStopWasCalled";
- private static final String ON_EQUALS_WASCALLED = "onEqualsWasCalled";
- private static final String ON_NOT_EQUALS = "onNotEqualsWasCalled";
- private static final String ON_GREATER_THAN = "onGreaterThanWasCalled";
- private static final String ON_GREATER_OR_EQUALS ="onGreaterOrEqualsWasCalled";
- private static final String ON_LESS_THAN = "onLessThanWasCalled";
- private static final String ON_LESS_OR_EQUALS = "onLessOrEqualsWasCalled";
- private static final String ON_NOT = "onNotWasCalled";
- private static final String ON_AND = "onAndWasCalled";
- private static final String ON_OR = "onOrWasCalled";
- private static final String ON_IN = "onInWasCalled";
- private static final String ON_NOT_IN = "onNotInWasCalled";
- private static final String ON_IN_ANY = "onInAnyWasCalled";
- private static final String ON_NOT_IN_ANY ="onNotInAnyWasCalled";
- private static final String ON_EQ_ANY = "onEqAnyWasCalled";
- private static final String ON_IS_NULL = "onIsNullWasCalled";
- private static final String ON_IS_NOT_NULL ="onIsNotNullWasCalled";
- private static final String ON_IS_LIKE = "onIsLikeWasCalled";
- private static final String ON_IS_NOT_LIKE = "onIsNotLikeWasCalled";
- private static final String ON_CONTAINS = "onContainsWasCalled";
- private static final String ON_IN_FOLDER = "onInFolderWasCalled";
- private static final String ON_IN_TREE = "onInTreeWasCalled";
- private static final String ON_SCORE = "onScoreWasCalled";
-
-
- final Map<String, Boolean> rulesTrackerMap =
- new HashMap<String, Boolean>() {
- private static final long serialVersionUID = 1L;
- {
- put(ON_START, false);
- put(ON_STOP, false);
- put(ON_EQUALS_WASCALLED, false);
- put(ON_NOT_EQUALS, false);
- put(ON_GREATER_THAN, false);
- put(ON_GREATER_OR_EQUALS, false);
- put(ON_LESS_THAN, false);
- put(ON_LESS_OR_EQUALS, false);
- put(ON_NOT, false);
- put(ON_AND, false);
- put(ON_OR, false);
- put(ON_IN, false);
- put(ON_NOT_IN, false);
- put(ON_IN_ANY, false);
- put(ON_NOT_IN_ANY, false);
- put(ON_EQ_ANY, false);
- put(ON_IS_NULL, false);
- put(ON_IS_NOT_NULL, false);
- put(ON_IS_LIKE, false);
- put(ON_IS_NOT_LIKE, false);
- put(ON_CONTAINS, false);
- put(ON_IN_FOLDER, false);
- put(ON_IN_TREE, false);
- put(ON_SCORE, false);
- }};
-
- public TestQueryProcessor() {
- }
-
-
- public void onStartProcessing(Tree node) {
- log.debug("TestQueryProcessor:onStartProcessing()");
- rulesTrackerMap.put(ON_START, true);
- assertEquals(CmisQlStrictLexer.WHERE, node.getType());
- }
-
- public void onStopProcessing() {
- log.debug("TestQueryProcessor:onStopProcessing()");
- rulesTrackerMap.put(ON_STOP, true);
- }
-
-
- public void onEquals(Tree eqNode, Tree leftNode, Tree rightNode) {
- rulesTrackerMap.put(ON_EQUALS_WASCALLED, true);
- assertEquals(CmisQlStrictLexer.EQ, eqNode.getType());
- assertTrue(CmisQlStrictLexer.COL==leftNode.getType() || CmisQlStrictLexer.SCORE==leftNode.getType());
- assertTrue(isLiteral(rightNode));
- }
-
- public void onNotEquals(Tree neNode, Tree leftNode, Tree rightNode) {
- rulesTrackerMap.put(ON_NOT_EQUALS, true);
- assertEquals(CmisQlStrictLexer.NEQ, neNode.getType());
- assertEquals(CmisQlStrictLexer.COL, leftNode.getType());
- assertTrue(isLiteral(rightNode));
- Object value=onLiteral(rightNode, Integer.class);
- assertEquals(100, value);
- }
-
- public void onLessOrEquals(Tree leqNode, Tree leftNode, Tree rightNode) {
- rulesTrackerMap.put(ON_LESS_OR_EQUALS, true);
- assertEquals(CmisQlStrictLexer.LTEQ, leqNode.getType());
- assertEquals(CmisQlStrictLexer.COL, leftNode.getType());
- assertTrue(isLiteral(rightNode));
- Object value=onLiteral(rightNode, Integer.class);
- assertEquals(100, value);
- }
-
- public void onLessThan(Tree ltNode, Tree leftNode, Tree rightNode) {
- rulesTrackerMap.put(ON_LESS_THAN, true);
- assertEquals(CmisQlStrictLexer.LT, ltNode.getType());
- assertEquals(CmisQlStrictLexer.COL, leftNode.getType());
- assertTrue(isLiteral(rightNode));
- Object value=onLiteral(rightNode, Integer.class);
- assertEquals(100, value);
- }
-
- public void onGreaterOrEquals(Tree geNode, Tree leftNode, Tree rightNode) {
- rulesTrackerMap.put(ON_GREATER_OR_EQUALS, true);
- assertEquals(CmisQlStrictLexer.GTEQ, geNode.getType());
- assertEquals(CmisQlStrictLexer.COL, leftNode.getType());
- assertTrue(isLiteral(rightNode));
- Object value=onLiteral(rightNode, Integer.class);
- assertEquals(100, value);
- }
-
- public void onGreaterThan(Tree gtNode, Tree leftNode, Tree rightNode) {
- rulesTrackerMap.put(ON_GREATER_THAN, true);
- assertEquals(CmisQlStrictLexer.GT, gtNode.getType());
- assertEquals(CmisQlStrictLexer.COL, leftNode.getType());
- assertTrue(isLiteral(rightNode));
- Object value=onLiteral(rightNode, Integer.class);
- assertEquals(100, value);
- }
-
- public void onNot(Tree opNode, Tree leftNode) {
- rulesTrackerMap.put(ON_NOT, true);
- assertEquals(CmisQlStrictLexer.NOT, opNode.getType());
- }
-
- public void onAnd(Tree opNode, Tree leftNode, Tree rightNode) {
- assertEquals(CmisQlStrictLexer.AND, opNode.getType());
- rulesTrackerMap.put(ON_AND, true);
- }
-
- public void onOr(Tree opNode, Tree leftNode, Tree rightNode) {
- assertEquals(CmisQlStrictLexer.OR, opNode.getType());
- rulesTrackerMap.put(ON_OR, true);
- }
-
- public void onIn(Tree opNode, Tree colNode, Tree listNode) {
- assertEquals(CmisQlStrictLexer.IN, opNode.getType());
- assertEquals(CmisQlStrictLexer.COL, colNode.getType());
- assertEquals(CmisQlStrictLexer.IN_LIST, listNode.getType());
- Object value=onLiteral(listNode.getChild(0), String.class);
- assertEquals("'Joe'", value);
- value=onLiteral(listNode.getChild(1), String.class);
- assertEquals("'Jim'", value);
- rulesTrackerMap.put(ON_IN, true);
- }
-
- public void onNotIn(Tree node, Tree colNode, Tree listNode) {
- assertEquals(CmisQlStrictLexer.NOT_IN, node.getType());
- assertEquals(CmisQlStrictLexer.COL, colNode.getType());
- assertEquals(CmisQlStrictLexer.IN_LIST, listNode.getType());
- Object value=onLiteral(listNode.getChild(0), String.class);
- assertEquals("'Joe'", value);
- value=onLiteral(listNode.getChild(1), String.class);
- assertEquals("'Jim'", value);
- rulesTrackerMap.put(ON_NOT_IN, true);
- }
-
- public void onEqAny(Tree node, Tree literalNode, Tree colNode) {
- assertEquals(CmisQlStrictLexer.EQ_ANY, node.getType());
- assertEquals(CmisQlStrictLexer.COL, colNode.getType());
- assertTrue(isLiteral(literalNode));
- Object value=onLiteral(literalNode, String.class);
- assertEquals("'Joe'", value);
- rulesTrackerMap.put(ON_EQ_ANY, true);
- }
-
- public void onInAny(Tree node, Tree colNode, Tree listNode) {
- assertEquals(CmisQlStrictLexer.IN_ANY, node.getType());
- assertEquals(CmisQlStrictLexer.COL, colNode.getType());
- assertEquals(CmisQlStrictLexer.IN_LIST, listNode.getType());
- Object value=onLiteral(listNode.getChild(0), String.class);
- assertEquals("'Joe'", value);
- value=onLiteral(listNode.getChild(1), String.class);
- assertEquals("'Jim'", value);
- rulesTrackerMap.put(ON_IN_ANY, true);
- }
-
- public void onNotInAny(Tree node, Tree colNode, Tree listNode) {
- assertEquals(CmisQlStrictLexer.NOT_IN_ANY, node.getType());
- assertEquals(CmisQlStrictLexer.COL, colNode.getType());
- assertEquals(CmisQlStrictLexer.IN_LIST, listNode.getType());
- Object value=onLiteral(listNode.getChild(0), String.class);
- assertEquals("'Joe'", value);
- value=onLiteral(listNode.getChild(1), String.class);
- assertEquals("'Jim'", value);
- rulesTrackerMap.put(ON_NOT_IN_ANY, true);
- }
-
- public void onIsNull(Tree nullNode, Tree colNode) {
- assertEquals(CmisQlStrictLexer.COL, colNode.getType());
- assertEquals(CmisQlStrictLexer.IS_NULL, nullNode.getType());
- rulesTrackerMap.put(ON_IS_NULL, true);
- }
-
- public void onIsNotNull(Tree notNullNode, Tree colNode) {
- assertEquals(CmisQlStrictLexer.COL, colNode.getType());
- assertEquals(CmisQlStrictLexer.IS_NOT_NULL, notNullNode.getType());
- rulesTrackerMap.put(ON_IS_NOT_NULL, true);
- }
-
- public void onIsLike(Tree node, Tree colNode, Tree stringNode) {
- assertEquals(CmisQlStrictLexer.LIKE, node.getType());
- assertEquals(CmisQlStrictLexer.COL, colNode.getType());
- assertEquals(CmisQlStrictLexer.STRING_LIT, stringNode.getType());
- Object value=onLiteral(stringNode, String.class);
- assertEquals("'Harry*'", value);
- rulesTrackerMap.put(ON_IS_LIKE, true);
- }
-
- public void onIsNotLike(Tree node, Tree colNode, Tree stringNode) {
- assertEquals(CmisQlStrictLexer.NOT_LIKE, node.getType());
- assertEquals(CmisQlStrictLexer.COL, colNode.getType());
- assertEquals(CmisQlStrictLexer.STRING_LIT, stringNode.getType());
- Object value=onLiteral(stringNode, String.class);
- assertEquals("'Harry*'", value);
- rulesTrackerMap.put(ON_IS_NOT_LIKE, true);
- }
-
- public void onContains(Tree node, Tree colNode, Tree paramNode) {
- assertEquals(CmisQlStrictLexer.CONTAINS, node.getType());
- assertTrue(colNode==null || CmisQlStrictLexer.STRING_LIT == paramNode.getType());
- assertEquals(CmisQlStrictLexer.STRING_LIT, paramNode.getType());
- rulesTrackerMap.put(ON_CONTAINS, true);
- }
-
- public void onInFolder(Tree node, Tree colNode, Tree paramNode) {
- assertEquals(CmisQlStrictLexer.IN_FOLDER, node.getType());
- assertTrue(colNode==null || CmisQlStrictLexer.STRING_LIT == paramNode.getType());
- assertEquals(CmisQlStrictLexer.STRING_LIT, paramNode.getType());
- rulesTrackerMap.put(ON_IN_FOLDER, true);
- }
-
- public void onInTree(Tree node, Tree colNode, Tree paramNode) {
- assertEquals(CmisQlStrictLexer.IN_TREE, node.getType());
- assertTrue(colNode==null || CmisQlStrictLexer.STRING_LIT == paramNode.getType());
- assertEquals(CmisQlStrictLexer.STRING_LIT, paramNode.getType());
- rulesTrackerMap.put(ON_IN_TREE, true);
- }
-
- public void onScore(Tree node, Tree paramNode) {
- assertEquals(CmisQlStrictLexer.SCORE, node.getType());
- rulesTrackerMap.put(ON_SCORE, true);
- }
-
-
- // private helper functions:
-
- private boolean isLiteral(Tree node) {
- int type = node.getType();
- return type==CmisQlStrictLexer.BOOL_LIT || type==CmisQlStrictLexer.NUM_LIT ||
- type==CmisQlStrictLexer.STRING_LIT || type==CmisQlStrictLexer.TIME_LIT;
- }
-
- private Object onLiteral(Tree node, Class<?> clazz) {
- int type = node.getType();
- switch (type) {
- case CmisQlStrictLexer.BOOL_LIT:
- return clazz==Boolean.class ? Boolean.parseBoolean(node.getText()) : null;
- case CmisQlStrictLexer.NUM_LIT:
- if (clazz == Integer.class)
- return Integer.parseInt(node.getText());
- else if (clazz == Long.class)
- return Long.parseLong(node.getText());
- else if (clazz == Short.class)
- return Short.parseShort(node.getText());
- else if (clazz == Double.class)
- return Double.parseDouble(node.getText());
- else if (clazz == Float.class)
- return Float.parseFloat(node.getText());
- else return null;
- case CmisQlStrictLexer.STRING_LIT:
- return clazz==String.class ? node.getText() : null;
- case CmisQlStrictLexer.TIME_LIT:
- return clazz==GregorianCalendar.class ? CalendarHelper.fromString(node.getText()) : null;
- default:
- log.error("Unknown literal. " + node);
- return null;
- }
- }
-
- }
-
- private TypeManagerImpl tm;
- private TestQueryProcessor queryProcessor;
-
- @Before
- public void setUp() throws Exception {
- tm = new TypeManagerImpl();
- tm.initTypeSystem(null); // create CMIS default types
-
- // create some types for testing
- List<TypeDefinition> typeDefs = super.createTypes();
- for (TypeDefinition typeDef : typeDefs)
- tm.addTypeDefinition(typeDef);
-
- // initialize query object with type manager
- queryProcessor = new TestQueryProcessor();
- QueryObject qo = new QueryObject(tm, queryProcessor);
- super.setUp(qo);
- }
-
- @After
- public void tearDown() throws Exception {
- super.tearDown();
- }
-
- @Test
- public void testStartStopProcessing() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN = 100";
- traverseStatementAndCatchExc(statement); // calls query processor
- assertTrue(queryProcessor.rulesTrackerMap.get(TestQueryProcessor.ON_START));
- assertTrue(queryProcessor.rulesTrackerMap.get(TestQueryProcessor.ON_STOP));
- }
-
- @Test
- public void testEq() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN = 100";
- testStatement(statement, TestQueryProcessor.ON_EQUALS_WASCALLED);
- }
-
- @Test
- public void testNeq() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN <> 100";
- testStatement(statement, TestQueryProcessor.ON_NOT_EQUALS);
- }
-
- @Test
- public void testLt() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN < 100";
- testStatement(statement, TestQueryProcessor.ON_LESS_THAN);
- }
-
- @Test
- public void testLteq() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN <= 100";
- testStatement(statement, TestQueryProcessor.ON_LESS_OR_EQUALS);
- }
-
- @Test
- public void testGt() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN > 100";
- testStatement(statement, TestQueryProcessor.ON_GREATER_THAN);
- }
-
- @Test
- public void testGteq() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN >= 100";
- testStatement(statement, TestQueryProcessor.ON_GREATER_OR_EQUALS);
- }
-
- @Test
- public void testNot() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE NOT ISBN = 100";
- testStatementMultiRule(statement, TestQueryProcessor.ON_NOT);
- }
-
- @Test
- public void testAnd() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN = 100 AND Title='Harry'";
- testStatementMultiRule(statement, TestQueryProcessor.ON_AND);
- }
-
- @Test
- public void testOr() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN = 100 OR Title='Harry'";
- testStatementMultiRule(statement,TestQueryProcessor.ON_OR);
- }
-
- @Test
- public void testIn() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE Author IN ('Joe', 'Jim')";
- testStatement(statement, TestQueryProcessor.ON_IN);
- }
-
- @Test
- public void testNotIn() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE Author NOT IN ('Joe', 'Jim')";
- testStatement(statement, TestQueryProcessor.ON_NOT_IN);
- }
-
- @Test
- public void testEqAny() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE 'Joe' = ANY Author";
- testStatement(statement, TestQueryProcessor.ON_EQ_ANY);
- }
-
- @Test
- public void testInAny() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ANY Author IN ('Joe', 'Jim')";
- testStatement(statement, TestQueryProcessor.ON_IN_ANY);
- }
-
- @Test
- public void testNotInAny() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ANY Author NOT IN ('Joe', 'Jim')";
- testStatement(statement, TestQueryProcessor.ON_NOT_IN_ANY);
- }
-
- @Test
- public void testOnIsNullWasCalled() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE Author IS NULL";
- testStatement(statement, TestQueryProcessor.ON_IS_NULL);
- }
-
- @Test
- public void testOnIsNotNullWasCalled() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE Author IS NOT NULL";
- testStatement(statement, TestQueryProcessor.ON_IS_NOT_NULL);
- }
-
- @Test
- public void testOnLikeWasCalled() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE Author LIKE 'Harry*'";
- testStatement(statement, TestQueryProcessor.ON_IS_LIKE);
- }
-
- @Test
- public void testOnNotLikeWasCalled() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE Author NOT LIKE 'Harry*'";
- testStatement(statement, TestQueryProcessor.ON_IS_NOT_LIKE);
- }
-
- @Test
- public void testOnContainsWasCalled1() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE CONTAINS('Hello')";
- testStatement(statement, TestQueryProcessor.ON_CONTAINS);
- }
-
- @Test
- public void testOnContainsWasCalled2() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE CONTAINS(BookType, 'Harry')";
- testStatement(statement, TestQueryProcessor.ON_CONTAINS);
- }
-
- @Test
- public void testOnInFolderWasCalled1() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE IN_FOLDER('ID1234')";
- testStatement(statement, TestQueryProcessor.ON_IN_FOLDER);
- }
-
- @Test
- public void testOnInFolderWasCalled2() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE IN_FOLDER(BookType, 'ID1234')";
- testStatement(statement, TestQueryProcessor.ON_IN_FOLDER);
- }
-
- @Test
- public void testOnInTreeWasCalled1() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE IN_Tree('ID1234')";
- testStatement(statement, TestQueryProcessor.ON_IN_TREE);
- }
-
- @Test
- public void testOnInTreeWasCalled2() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE IN_Tree(BookType, 'ID1234')";
- testStatement(statement, TestQueryProcessor.ON_IN_TREE);
- }
-
- @Test
- public void testOnScoreCalled() {
- String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE SCORE()=100";
- testStatementMultiRule(statement, TestQueryProcessor.ON_SCORE);
- }
-
- // private helper functions
-
- private void testStatementMultiRule(String statement, String ruleAssertion) {
- traverseStatementAndCatchExc(statement); // calls query processor
- Tree whereRoot = getWhereTree(parserTree);
- assertTrue(queryProcessor.rulesTrackerMap.get(ruleAssertion));
- }
-
- private void testStatement(String statement, String ruleAssertion) {
- testStatementMultiRule(statement, ruleAssertion);
- checkOtherRulesNotCalled(ruleAssertion);
- }
-
- private void checkOtherRulesNotCalled(String ruleAssertion) {
- for (Entry<String, Boolean> e : queryProcessor.rulesTrackerMap.entrySet()) {
- if (!e.getKey().equals(ruleAssertion) && !e.getKey().equals("onPropertyValueWasCalled")
- && !e.getKey().equals(TestQueryProcessor.ON_START) && !e.getKey().equals(TestQueryProcessor.ON_STOP)
- && !e.getKey().contains("Literal"))
- assertFalse("Rule " + e.getKey() + " was expected not to be executed, but was executed.",
- queryProcessor.rulesTrackerMap.get(e.getKey()));
- }
- }
-
-}
+/*
+ * 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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.antlr.runtime.tree.Tree;
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
+import org.apache.chemistry.opencmis.inmemory.TypeManagerImpl;
+import org.apache.chemistry.opencmis.server.support.query.CalendarHelper;
+import org.apache.chemistry.opencmis.server.support.query.CmisQlStrictLexer;
+import org.apache.chemistry.opencmis.server.support.query.QueryConditionProcessor;
+import org.apache.chemistry.opencmis.server.support.query.QueryObject;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ProcessQueryTest extends AbstractQueryTest {
+
+ static private class TestQueryProcessor implements QueryConditionProcessor {
+
+ private static Log log = LogFactory.getLog(ProcessQueryTest.class);
+
+ private static final String ON_START = "onStartWasCalled";
+ private static final String ON_STOP = "onStopWasCalled";
+ private static final String ON_EQUALS_WASCALLED = "onEqualsWasCalled";
+ private static final String ON_NOT_EQUALS = "onNotEqualsWasCalled";
+ private static final String ON_GREATER_THAN = "onGreaterThanWasCalled";
+ private static final String ON_GREATER_OR_EQUALS ="onGreaterOrEqualsWasCalled";
+ private static final String ON_LESS_THAN = "onLessThanWasCalled";
+ private static final String ON_LESS_OR_EQUALS = "onLessOrEqualsWasCalled";
+ private static final String ON_NOT = "onNotWasCalled";
+ private static final String ON_AND = "onAndWasCalled";
+ private static final String ON_OR = "onOrWasCalled";
+ private static final String ON_IN = "onInWasCalled";
+ private static final String ON_NOT_IN = "onNotInWasCalled";
+ private static final String ON_IN_ANY = "onInAnyWasCalled";
+ private static final String ON_NOT_IN_ANY ="onNotInAnyWasCalled";
+ private static final String ON_EQ_ANY = "onEqAnyWasCalled";
+ private static final String ON_IS_NULL = "onIsNullWasCalled";
+ private static final String ON_IS_NOT_NULL ="onIsNotNullWasCalled";
+ private static final String ON_IS_LIKE = "onIsLikeWasCalled";
+ private static final String ON_IS_NOT_LIKE = "onIsNotLikeWasCalled";
+ private static final String ON_CONTAINS = "onContainsWasCalled";
+ private static final String ON_IN_FOLDER = "onInFolderWasCalled";
+ private static final String ON_IN_TREE = "onInTreeWasCalled";
+ private static final String ON_SCORE = "onScoreWasCalled";
+
+
+ final Map<String, Boolean> rulesTrackerMap =
+ new HashMap<String, Boolean>() {
+ private static final long serialVersionUID = 1L;
+ {
+ put(ON_START, false);
+ put(ON_STOP, false);
+ put(ON_EQUALS_WASCALLED, false);
+ put(ON_NOT_EQUALS, false);
+ put(ON_GREATER_THAN, false);
+ put(ON_GREATER_OR_EQUALS, false);
+ put(ON_LESS_THAN, false);
+ put(ON_LESS_OR_EQUALS, false);
+ put(ON_NOT, false);
+ put(ON_AND, false);
+ put(ON_OR, false);
+ put(ON_IN, false);
+ put(ON_NOT_IN, false);
+ put(ON_IN_ANY, false);
+ put(ON_NOT_IN_ANY, false);
+ put(ON_EQ_ANY, false);
+ put(ON_IS_NULL, false);
+ put(ON_IS_NOT_NULL, false);
+ put(ON_IS_LIKE, false);
+ put(ON_IS_NOT_LIKE, false);
+ put(ON_CONTAINS, false);
+ put(ON_IN_FOLDER, false);
+ put(ON_IN_TREE, false);
+ put(ON_SCORE, false);
+ }};
+
+ public TestQueryProcessor() {
+ }
+
+
+ public void onStartProcessing(Tree node) {
+ log.debug("TestQueryProcessor:onStartProcessing()");
+ rulesTrackerMap.put(ON_START, true);
+ assertEquals(CmisQlStrictLexer.WHERE, node.getType());
+ }
+
+ public void onStopProcessing() {
+ log.debug("TestQueryProcessor:onStopProcessing()");
+ rulesTrackerMap.put(ON_STOP, true);
+ }
+
+
+ public void onEquals(Tree eqNode, Tree leftNode, Tree rightNode) {
+ rulesTrackerMap.put(ON_EQUALS_WASCALLED, true);
+ assertEquals(CmisQlStrictLexer.EQ, eqNode.getType());
+ assertTrue(CmisQlStrictLexer.COL==leftNode.getType() || CmisQlStrictLexer.SCORE==leftNode.getType());
+ assertTrue(isLiteral(rightNode));
+ }
+
+ public void onNotEquals(Tree neNode, Tree leftNode, Tree rightNode) {
+ rulesTrackerMap.put(ON_NOT_EQUALS, true);
+ assertEquals(CmisQlStrictLexer.NEQ, neNode.getType());
+ assertEquals(CmisQlStrictLexer.COL, leftNode.getType());
+ assertTrue(isLiteral(rightNode));
+ Object value=onLiteral(rightNode, Integer.class);
+ assertEquals(100, value);
+ }
+
+ public void onLessOrEquals(Tree leqNode, Tree leftNode, Tree rightNode) {
+ rulesTrackerMap.put(ON_LESS_OR_EQUALS, true);
+ assertEquals(CmisQlStrictLexer.LTEQ, leqNode.getType());
+ assertEquals(CmisQlStrictLexer.COL, leftNode.getType());
+ assertTrue(isLiteral(rightNode));
+ Object value=onLiteral(rightNode, Integer.class);
+ assertEquals(100, value);
+ }
+
+ public void onLessThan(Tree ltNode, Tree leftNode, Tree rightNode) {
+ rulesTrackerMap.put(ON_LESS_THAN, true);
+ assertEquals(CmisQlStrictLexer.LT, ltNode.getType());
+ assertEquals(CmisQlStrictLexer.COL, leftNode.getType());
+ assertTrue(isLiteral(rightNode));
+ Object value=onLiteral(rightNode, Integer.class);
+ assertEquals(100, value);
+ }
+
+ public void onGreaterOrEquals(Tree geNode, Tree leftNode, Tree rightNode) {
+ rulesTrackerMap.put(ON_GREATER_OR_EQUALS, true);
+ assertEquals(CmisQlStrictLexer.GTEQ, geNode.getType());
+ assertEquals(CmisQlStrictLexer.COL, leftNode.getType());
+ assertTrue(isLiteral(rightNode));
+ Object value=onLiteral(rightNode, Integer.class);
+ assertEquals(100, value);
+ }
+
+ public void onGreaterThan(Tree gtNode, Tree leftNode, Tree rightNode) {
+ rulesTrackerMap.put(ON_GREATER_THAN, true);
+ assertEquals(CmisQlStrictLexer.GT, gtNode.getType());
+ assertEquals(CmisQlStrictLexer.COL, leftNode.getType());
+ assertTrue(isLiteral(rightNode));
+ Object value=onLiteral(rightNode, Integer.class);
+ assertEquals(100, value);
+ }
+
+ public void onNot(Tree opNode, Tree leftNode) {
+ rulesTrackerMap.put(ON_NOT, true);
+ assertEquals(CmisQlStrictLexer.NOT, opNode.getType());
+ }
+
+ public void onAnd(Tree opNode, Tree leftNode, Tree rightNode) {
+ assertEquals(CmisQlStrictLexer.AND, opNode.getType());
+ rulesTrackerMap.put(ON_AND, true);
+ }
+
+ public void onOr(Tree opNode, Tree leftNode, Tree rightNode) {
+ assertEquals(CmisQlStrictLexer.OR, opNode.getType());
+ rulesTrackerMap.put(ON_OR, true);
+ }
+
+ public void onIn(Tree opNode, Tree colNode, Tree listNode) {
+ assertEquals(CmisQlStrictLexer.IN, opNode.getType());
+ assertEquals(CmisQlStrictLexer.COL, colNode.getType());
+ assertEquals(CmisQlStrictLexer.IN_LIST, listNode.getType());
+ Object value=onLiteral(listNode.getChild(0), String.class);
+ assertEquals("'Joe'", value);
+ value=onLiteral(listNode.getChild(1), String.class);
+ assertEquals("'Jim'", value);
+ rulesTrackerMap.put(ON_IN, true);
+ }
+
+ public void onNotIn(Tree node, Tree colNode, Tree listNode) {
+ assertEquals(CmisQlStrictLexer.NOT_IN, node.getType());
+ assertEquals(CmisQlStrictLexer.COL, colNode.getType());
+ assertEquals(CmisQlStrictLexer.IN_LIST, listNode.getType());
+ Object value=onLiteral(listNode.getChild(0), String.class);
+ assertEquals("'Joe'", value);
+ value=onLiteral(listNode.getChild(1), String.class);
+ assertEquals("'Jim'", value);
+ rulesTrackerMap.put(ON_NOT_IN, true);
+ }
+
+ public void onEqAny(Tree node, Tree literalNode, Tree colNode) {
+ assertEquals(CmisQlStrictLexer.EQ_ANY, node.getType());
+ assertEquals(CmisQlStrictLexer.COL, colNode.getType());
+ assertTrue(isLiteral(literalNode));
+ Object value=onLiteral(literalNode, String.class);
+ assertEquals("'Joe'", value);
+ rulesTrackerMap.put(ON_EQ_ANY, true);
+ }
+
+ public void onInAny(Tree node, Tree colNode, Tree listNode) {
+ assertEquals(CmisQlStrictLexer.IN_ANY, node.getType());
+ assertEquals(CmisQlStrictLexer.COL, colNode.getType());
+ assertEquals(CmisQlStrictLexer.IN_LIST, listNode.getType());
+ Object value=onLiteral(listNode.getChild(0), String.class);
+ assertEquals("'Joe'", value);
+ value=onLiteral(listNode.getChild(1), String.class);
+ assertEquals("'Jim'", value);
+ rulesTrackerMap.put(ON_IN_ANY, true);
+ }
+
+ public void onNotInAny(Tree node, Tree colNode, Tree listNode) {
+ assertEquals(CmisQlStrictLexer.NOT_IN_ANY, node.getType());
+ assertEquals(CmisQlStrictLexer.COL, colNode.getType());
+ assertEquals(CmisQlStrictLexer.IN_LIST, listNode.getType());
+ Object value=onLiteral(listNode.getChild(0), String.class);
+ assertEquals("'Joe'", value);
+ value=onLiteral(listNode.getChild(1), String.class);
+ assertEquals("'Jim'", value);
+ rulesTrackerMap.put(ON_NOT_IN_ANY, true);
+ }
+
+ public void onIsNull(Tree nullNode, Tree colNode) {
+ assertEquals(CmisQlStrictLexer.COL, colNode.getType());
+ assertEquals(CmisQlStrictLexer.IS_NULL, nullNode.getType());
+ rulesTrackerMap.put(ON_IS_NULL, true);
+ }
+
+ public void onIsNotNull(Tree notNullNode, Tree colNode) {
+ assertEquals(CmisQlStrictLexer.COL, colNode.getType());
+ assertEquals(CmisQlStrictLexer.IS_NOT_NULL, notNullNode.getType());
+ rulesTrackerMap.put(ON_IS_NOT_NULL, true);
+ }
+
+ public void onIsLike(Tree node, Tree colNode, Tree stringNode) {
+ assertEquals(CmisQlStrictLexer.LIKE, node.getType());
+ assertEquals(CmisQlStrictLexer.COL, colNode.getType());
+ assertEquals(CmisQlStrictLexer.STRING_LIT, stringNode.getType());
+ Object value=onLiteral(stringNode, String.class);
+ assertEquals("'Harry*'", value);
+ rulesTrackerMap.put(ON_IS_LIKE, true);
+ }
+
+ public void onIsNotLike(Tree node, Tree colNode, Tree stringNode) {
+ assertEquals(CmisQlStrictLexer.NOT_LIKE, node.getType());
+ assertEquals(CmisQlStrictLexer.COL, colNode.getType());
+ assertEquals(CmisQlStrictLexer.STRING_LIT, stringNode.getType());
+ Object value=onLiteral(stringNode, String.class);
+ assertEquals("'Harry*'", value);
+ rulesTrackerMap.put(ON_IS_NOT_LIKE, true);
+ }
+
+ public void onContains(Tree node, Tree colNode, Tree paramNode) {
+ assertEquals(CmisQlStrictLexer.CONTAINS, node.getType());
+ assertTrue(colNode==null || CmisQlStrictLexer.STRING_LIT == paramNode.getType());
+ assertEquals(CmisQlStrictLexer.STRING_LIT, paramNode.getType());
+ rulesTrackerMap.put(ON_CONTAINS, true);
+ }
+
+ public void onInFolder(Tree node, Tree colNode, Tree paramNode) {
+ assertEquals(CmisQlStrictLexer.IN_FOLDER, node.getType());
+ assertTrue(colNode==null || CmisQlStrictLexer.STRING_LIT == paramNode.getType());
+ assertEquals(CmisQlStrictLexer.STRING_LIT, paramNode.getType());
+ rulesTrackerMap.put(ON_IN_FOLDER, true);
+ }
+
+ public void onInTree(Tree node, Tree colNode, Tree paramNode) {
+ assertEquals(CmisQlStrictLexer.IN_TREE, node.getType());
+ assertTrue(colNode==null || CmisQlStrictLexer.STRING_LIT == paramNode.getType());
+ assertEquals(CmisQlStrictLexer.STRING_LIT, paramNode.getType());
+ rulesTrackerMap.put(ON_IN_TREE, true);
+ }
+
+ public void onScore(Tree node, Tree paramNode) {
+ assertEquals(CmisQlStrictLexer.SCORE, node.getType());
+ rulesTrackerMap.put(ON_SCORE, true);
+ }
+
+
+ // private helper functions:
+
+ private boolean isLiteral(Tree node) {
+ int type = node.getType();
+ return type==CmisQlStrictLexer.BOOL_LIT || type==CmisQlStrictLexer.NUM_LIT ||
+ type==CmisQlStrictLexer.STRING_LIT || type==CmisQlStrictLexer.TIME_LIT;
+ }
+
+ private Object onLiteral(Tree node, Class<?> clazz) {
+ int type = node.getType();
+ switch (type) {
+ case CmisQlStrictLexer.BOOL_LIT:
+ return clazz==Boolean.class ? Boolean.parseBoolean(node.getText()) : null;
+ case CmisQlStrictLexer.NUM_LIT:
+ if (clazz == Integer.class)
+ return Integer.parseInt(node.getText());
+ else if (clazz == Long.class)
+ return Long.parseLong(node.getText());
+ else if (clazz == Short.class)
+ return Short.parseShort(node.getText());
+ else if (clazz == Double.class)
+ return Double.parseDouble(node.getText());
+ else if (clazz == Float.class)
+ return Float.parseFloat(node.getText());
+ else return null;
+ case CmisQlStrictLexer.STRING_LIT:
+ return clazz==String.class ? node.getText() : null;
+ case CmisQlStrictLexer.TIME_LIT:
+ return clazz==GregorianCalendar.class ? CalendarHelper.fromString(node.getText()) : null;
+ default:
+ log.error("Unknown literal. " + node);
+ return null;
+ }
+ }
+
+ }
+
+ private TypeManagerImpl tm;
+ private TestQueryProcessor queryProcessor;
+
+ @Before
+ public void setUp() throws Exception {
+ tm = new TypeManagerImpl();
+ tm.initTypeSystem(null); // create CMIS default types
+
+ // create some types for testing
+ List<TypeDefinition> typeDefs = super.createTypes();
+ for (TypeDefinition typeDef : typeDefs)
+ tm.addTypeDefinition(typeDef);
+
+ // initialize query object with type manager
+ queryProcessor = new TestQueryProcessor();
+ QueryObject qo = new QueryObject(tm, queryProcessor);
+ super.setUp(qo);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testStartStopProcessing() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN = 100";
+ traverseStatementAndCatchExc(statement); // calls query processor
+ assertTrue(queryProcessor.rulesTrackerMap.get(TestQueryProcessor.ON_START));
+ assertTrue(queryProcessor.rulesTrackerMap.get(TestQueryProcessor.ON_STOP));
+ }
+
+ @Test
+ public void testEq() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN = 100";
+ testStatement(statement, TestQueryProcessor.ON_EQUALS_WASCALLED);
+ }
+
+ @Test
+ public void testNeq() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN <> 100";
+ testStatement(statement, TestQueryProcessor.ON_NOT_EQUALS);
+ }
+
+ @Test
+ public void testLt() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN < 100";
+ testStatement(statement, TestQueryProcessor.ON_LESS_THAN);
+ }
+
+ @Test
+ public void testLteq() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN <= 100";
+ testStatement(statement, TestQueryProcessor.ON_LESS_OR_EQUALS);
+ }
+
+ @Test
+ public void testGt() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN > 100";
+ testStatement(statement, TestQueryProcessor.ON_GREATER_THAN);
+ }
+
+ @Test
+ public void testGteq() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN >= 100";
+ testStatement(statement, TestQueryProcessor.ON_GREATER_OR_EQUALS);
+ }
+
+ @Test
+ public void testNot() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE NOT ISBN = 100";
+ testStatementMultiRule(statement, TestQueryProcessor.ON_NOT);
+ }
+
+ @Test
+ public void testAnd() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN = 100 AND Title='Harry'";
+ testStatementMultiRule(statement, TestQueryProcessor.ON_AND);
+ }
+
+ @Test
+ public void testOr() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ISBN = 100 OR Title='Harry'";
+ testStatementMultiRule(statement,TestQueryProcessor.ON_OR);
+ }
+
+ @Test
+ public void testIn() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE Author IN ('Joe', 'Jim')";
+ testStatement(statement, TestQueryProcessor.ON_IN);
+ }
+
+ @Test
+ public void testNotIn() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE Author NOT IN ('Joe', 'Jim')";
+ testStatement(statement, TestQueryProcessor.ON_NOT_IN);
+ }
+
+ @Test
+ public void testEqAny() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE 'Joe' = ANY Author";
+ testStatement(statement, TestQueryProcessor.ON_EQ_ANY);
+ }
+
+ @Test
+ public void testInAny() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ANY Author IN ('Joe', 'Jim')";
+ testStatement(statement, TestQueryProcessor.ON_IN_ANY);
+ }
+
+ @Test
+ public void testNotInAny() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE ANY Author NOT IN ('Joe', 'Jim')";
+ testStatement(statement, TestQueryProcessor.ON_NOT_IN_ANY);
+ }
+
+ @Test
+ public void testOnIsNullWasCalled() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE Author IS NULL";
+ testStatement(statement, TestQueryProcessor.ON_IS_NULL);
+ }
+
+ @Test
+ public void testOnIsNotNullWasCalled() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE Author IS NOT NULL";
+ testStatement(statement, TestQueryProcessor.ON_IS_NOT_NULL);
+ }
+
+ @Test
+ public void testOnLikeWasCalled() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE Author LIKE 'Harry*'";
+ testStatement(statement, TestQueryProcessor.ON_IS_LIKE);
+ }
+
+ @Test
+ public void testOnNotLikeWasCalled() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE Author NOT LIKE 'Harry*'";
+ testStatement(statement, TestQueryProcessor.ON_IS_NOT_LIKE);
+ }
+
+ @Test
+ public void testOnContainsWasCalled1() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE CONTAINS('Hello')";
+ testStatement(statement, TestQueryProcessor.ON_CONTAINS);
+ }
+
+ @Test
+ public void testOnContainsWasCalled2() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE CONTAINS(BookType, 'Harry')";
+ testStatement(statement, TestQueryProcessor.ON_CONTAINS);
+ }
+
+ @Test
+ public void testOnInFolderWasCalled1() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE IN_FOLDER('ID1234')";
+ testStatement(statement, TestQueryProcessor.ON_IN_FOLDER);
+ }
+
+ @Test
+ public void testOnInFolderWasCalled2() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE IN_FOLDER(BookType, 'ID1234')";
+ testStatement(statement, TestQueryProcessor.ON_IN_FOLDER);
+ }
+
+ @Test
+ public void testOnInTreeWasCalled1() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE IN_Tree('ID1234')";
+ testStatement(statement, TestQueryProcessor.ON_IN_TREE);
+ }
+
+ @Test
+ public void testOnInTreeWasCalled2() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE IN_Tree(BookType, 'ID1234')";
+ testStatement(statement, TestQueryProcessor.ON_IN_TREE);
+ }
+
+ @Test
+ public void testOnScoreCalled() {
+ String statement = "SELECT BookType.Title, BookType.Author FROM BookType WHERE SCORE()=100";
+ testStatementMultiRule(statement, TestQueryProcessor.ON_SCORE);
+ }
+
+ // private helper functions
+
+ private void testStatementMultiRule(String statement, String ruleAssertion) {
+ traverseStatementAndCatchExc(statement); // calls query processor
+ Tree whereRoot = getWhereTree(parserTree);
+ assertTrue(queryProcessor.rulesTrackerMap.get(ruleAssertion));
+ }
+
+ private void testStatement(String statement, String ruleAssertion) {
+ testStatementMultiRule(statement, ruleAssertion);
+ checkOtherRulesNotCalled(ruleAssertion);
+ }
+
+ private void checkOtherRulesNotCalled(String ruleAssertion) {
+ for (Entry<String, Boolean> e : queryProcessor.rulesTrackerMap.entrySet()) {
+ if (!e.getKey().equals(ruleAssertion) && !e.getKey().equals("onPropertyValueWasCalled")
+ && !e.getKey().equals(TestQueryProcessor.ON_START) && !e.getKey().equals(TestQueryProcessor.ON_STOP)
+ && !e.getKey().contains("Literal"))
+ assertFalse("Rule " + e.getKey() + " was expected not to be executed, but was executed.",
+ queryProcessor.rulesTrackerMap.get(e.getKey()));
+ }
+ }
+
+}
Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/ProcessQueryTest.java
------------------------------------------------------------------------------
svn:eol-style = native