package org.xcmis.search.parser; import org.junit.Before; import org.junit.Test; import org.xcmis.search.InvalidQueryException; import org.xcmis.search.model.source.SelectorName; import org.xcmis.search.parser.CmisQueryParser; /* * Copyright (C) 2010 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ /** * @author <a href="mailto:Sergey.Kabashnyuk@exoplatform.org">Sergey Kabashnyuk</a> * @version $Id: exo-jboss-codetemplates.xml 34360 2009-07-22 23:58:59Z ksm $ * */ public class CmisSqlQueryParserTest { private CmisQueryParser parser; @Before public void beforeEach() { parser = new CmisQueryParser(); } // ---------------------------------------------------------------------------------------------------------------- // parseQuery // ---------------------------------------------------------------------------------------------------------------- @Test public void shouldParseNominalQueries() throws InvalidQueryException { parse("SELECT * FROM tableA"); parse("SELECT column1 FROM tableA"); parse("SELECT tableA.column1 FROM tableA"); parse("SELECT tableA.column1, tableB.column2 FROM tableA JOIN tableB ON (tableA.id = tableB.id)"); parse("SELECT tableA.column1, tableB.column2 FROM tableA INNER JOIN tableB ON (tableA.id = tableB.id)"); //parse("SELECT tableA.column1, tableB.column2 FROM tableA OUTER JOIN tableB ON (tableA.id = tableB.id)"); parse("SELECT tableA.column1, tableB.column2 FROM tableA LEFT OUTER JOIN tableB ON (tableA.id = tableB.id)"); //parse("SELECT tableA.column1, tableB.column2 FROM tableA RIGHT OUTER JOIN tableB ON (tableA.id = tableB.id)"); } @Test public void shouldParseQueriesWithNonSqlColumnNames() throws InvalidQueryException { parse("SELECT * FROM [exo:tableA]"); parse("SELECT [jcr:column1] FROM [exo:tableA]"); //parse("SELECT 'jcr:column1' FROM 'exo:tableA'"); //parse("SELECT \"jcr:column1\" FROM \"exo:tableA\""); } @Test public void shouldParseQueriesSelectingFromAllTables() throws InvalidQueryException { parse("SELECT * FROM nt:base"); } @Test(expected = InvalidQueryException.class) public void shouldFailToParseQueriesWithNoFromClause() throws InvalidQueryException { parse("SELECT 'jcr:column1'"); } @Test(expected = InvalidQueryException.class) public void shouldFailToParseQueriesWithIncompleteFromClause() throws InvalidQueryException { parse("SELECT 'jcr:column1' FROM "); } @Test(expected = InvalidQueryException.class) public void shouldFailToParseQueriesWithUnmatchedSingleQuoteCharacters() throws InvalidQueryException { parse("SELECT 'jcr:column1' FROM \"exo:tableA'"); } @Test(expected = InvalidQueryException.class) public void shouldFailToParseQueriesWithUnmatchedDoubleQuoteCharacters() throws InvalidQueryException { parse("SELECT \"jcr:column1' FROM \"exo:tableA\""); } @Test(expected = InvalidQueryException.class) public void shouldFailToParseQueriesWithUnmatchedBracketQuoteCharacters() throws InvalidQueryException { parse("SELECT [jcr:column1' FROM [exo:tableA]"); } @Test public void shouldParseQueriesWithSelectStar() throws InvalidQueryException { parse("SELECT * FROM tableA"); parse("SELECT tableA.* FROM tableA"); parse("SELECT tableA.column1, tableB.* FROM tableA JOIN tableB ON (tableA.id = tableB.id)"); parse("SELECT tableA.*, tableB.column2 FROM tableA JOIN tableB ON (tableA.id = tableB.id)"); parse("SELECT tableA.*, tableB.* FROM tableA JOIN tableB ON (tableA.id = tableB.id)"); } @Test public void shouldParseQueriesWithAllKindsOfJoins() throws InvalidQueryException { parse("SELECT tableA.column1, tableB.column2 FROM tableA JOIN tableB ON (tableA.id = tableB.id)"); parse("SELECT tableA.column1, tableB.column2 FROM tableA INNER JOIN tableB ON (tableA.id = tableB.id)"); //parse("SELECT tableA.column1, tableB.column2 FROM tableA OUTER JOIN tableB ON (tableA.id = tableB.id)"); parse("SELECT tableA.column1, tableB.column2 FROM tableA LEFT OUTER JOIN tableB ON (tableA.id = tableB.id)"); //parse("SELECT tableA.column1, tableB.column2 FROM tableA RIGHT OUTER JOIN tableB ON (tableA.id = tableB.id)"); //parse("SELECT tableA.column1, tableB.column2 FROM tableA FULL OUTER JOIN tableB ON (tableA.id = tableB.id)"); //parse("SELECT tableA.column1, tableB.column2 FROM tableA CROSS JOIN tableB ON (tableA.id = tableB.id)"); } @Test public void shouldParseQueriesWithMultipleJoins() throws InvalidQueryException { parse("SELECT * FROM tableA JOIN tableB ON (tableA.id = tableB.id)"); parse("SELECT * FROM tableA JOIN tableB ON (tableA.id = tableB.id) JOIN tableC ON (tableA.id2 = tableC.id2)"); } @Test public void shouldParseQueriesWithEquiJoinCriteria() throws InvalidQueryException { parse("SELECT tableA.column1, tableB.column2 FROM tableA JOIN tableB ON (tableA.id = tableB.id)"); parse("SELECT * FROM tableA JOIN tableB ON (tableA.id = tableB.id) JOIN tableC ON (tableA.id2 = tableC.id2)"); } @Test(expected = InvalidQueryException.class) public void shouldFailToParseEquiJoinCriteriaMissingPropertyName() throws InvalidQueryException { parse("SELECT tableA.column1, tableB.column2 FROM tableA JOIN tableB ON tableA = tableB.id"); } @Test(expected = InvalidQueryException.class) public void shouldFailToParseEquiJoinCriteriaMissingTableName() throws InvalidQueryException { parse("SELECT tableA.column1, tableB.column2 FROM tableA JOIN tableB ON column1 = tableB.id"); } @Test(expected = InvalidQueryException.class) public void shouldFailToParseEquiJoinCriteriaMissingEquals() throws InvalidQueryException { parse("SELECT tableA.column1, tableB.column2 FROM tableA JOIN tableB ON column1 tableB.id"); } @Test public void shouldParseQueriesOnMultpleLines() throws InvalidQueryException { parse("SELECT * \nFROM tableA"); parse("SELECT \ncolumn1 \nFROM tableA"); parse("SELECT \ntableA.column1 \nFROM\n tableA"); parse("SELECT tableA.\ncolumn1, \ntableB.column2 \nFROM tableA JOIN \ntableB ON (tableA.id \n= tableB.\nid)"); } @Test public void shouldParseQueriesThatUseDifferentCaseForKeywords() throws InvalidQueryException { parse("select * from tableA"); parse("SeLeCt * from tableA"); parse("select column1 from tableA"); parse("select tableA.column1 from tableA"); parse("select tableA.column1, tableB.column2 from tableA join tableB on (tableA.id = tableB.id)"); } // ---------------------------------------------------------------------------------------------------------------- // parseSetQuery // ---------------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------------------------- // parseSelect // ---------------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------------------------- // parseFrom // ---------------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------------------------- // parseJoinCondition // ---------------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------------------------- // parseWhere // ---------------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------------------------- // parseConstraint // ---------------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------------------------- // Utility methods // ---------------------------------------------------------------------------------------------------------------- protected void parse(String query) throws InvalidQueryException { parser.parseQuery(query); } protected SelectorName selectorName(String name) { return new SelectorName(name); } }