Repository: metamodel Updated Branches: refs/heads/master 3a7483c89 -> edb10a137
METAMODEL-115: Fixes query parser to allow lower-case function names etc. This fixes #7 Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/edb10a13 Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/edb10a13 Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/edb10a13 Branch: refs/heads/master Commit: edb10a137932f01df96dea1fd061c98fdc8303b4 Parents: 3a7483c Author: Kasper Sørensen <[email protected]> Authored: Mon Mar 9 19:22:58 2015 +0100 Committer: Kasper Sørensen <[email protected]> Committed: Mon Mar 9 19:22:58 2015 +0100 ---------------------------------------------------------------------- CHANGES.md | 1 + .../java/org/apache/metamodel/query/Query.java | 4 +- .../metamodel/query/parser/QueryParser.java | 2 +- .../query/parser/SelectItemParser.java | 2 +- .../metamodel/query/parser/QueryParserTest.java | 40 ++++++++++++++++++++ 5 files changed, 46 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/edb10a13/CHANGES.md ---------------------------------------------------------------------- diff --git a/CHANGES.md b/CHANGES.md index 5c2e2eb..28171a2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ * [METAMODEL-78] - Fixed a bug that caused SELECT DISTINCT to sometimes return duplicates records on certain DataContext implementations. * [METAMODEL-106] - Improved handling of invalid or non-existing index names passed to ElasticSearchDataContext + * [METAMODEL-115] - Improved query parsing to allow lower-case function names, operators etc. ### Apache MetaModel 4.3.1 http://git-wip-us.apache.org/repos/asf/metamodel/blob/edb10a13/core/src/main/java/org/apache/metamodel/query/Query.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/Query.java b/core/src/main/java/org/apache/metamodel/query/Query.java index f46b007..586d0b5 100644 --- a/core/src/main/java/org/apache/metamodel/query/Query.java +++ b/core/src/main/java/org/apache/metamodel/query/Query.java @@ -297,6 +297,8 @@ public final class Query extends BaseObject implements Cloneable, Serializable { } private FilterItem findFilterItem(String expression) { + String _upperExpression = expression.toUpperCase(); + final QueryPartCollectionProcessor collectionProcessor = new QueryPartCollectionProcessor(); new QueryPartParser(collectionProcessor, expression, " AND ", " OR ").parse(); @@ -329,7 +331,7 @@ public final class Query extends BaseObject implements Cloneable, Serializable { } else { searchStr = operatorCandidate.toSql(); } - final int operatorIndex = expression.indexOf(searchStr); + final int operatorIndex = _upperExpression.indexOf(searchStr); if (operatorIndex > 0) { operator = operatorCandidate; leftSide = expression.substring(0, operatorIndex).trim(); http://git-wip-us.apache.org/repos/asf/metamodel/blob/edb10a13/core/src/main/java/org/apache/metamodel/query/parser/QueryParser.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/parser/QueryParser.java b/core/src/main/java/org/apache/metamodel/query/parser/QueryParser.java index 19af3f8..69dd355 100644 --- a/core/src/main/java/org/apache/metamodel/query/parser/QueryParser.java +++ b/core/src/main/java/org/apache/metamodel/query/parser/QueryParser.java @@ -88,7 +88,7 @@ public class QueryParser { { String selectClause = getSubstring(getLastEndIndex(selectIndices), fromIndices[0]); - if (selectClause.startsWith("DISTINCT ")) { + if (selectClause.toUpperCase().startsWith("DISTINCT ")) { query.selectDistinct(); selectClause = selectClause.substring("DISTINCT ".length()); } http://git-wip-us.apache.org/repos/asf/metamodel/blob/edb10a13/core/src/main/java/org/apache/metamodel/query/parser/SelectItemParser.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/parser/SelectItemParser.java b/core/src/main/java/org/apache/metamodel/query/parser/SelectItemParser.java index 16bb329..84f6cc4 100644 --- a/core/src/main/java/org/apache/metamodel/query/parser/SelectItemParser.java +++ b/core/src/main/java/org/apache/metamodel/query/parser/SelectItemParser.java @@ -110,7 +110,7 @@ public final class SelectItemParser implements QueryPartProcessor { final int startParenthesis = expression.indexOf('('); if (startParenthesis > 0 && expression.endsWith(")")) { String functionName = expression.substring(0, startParenthesis); - function = FunctionType.get(functionName); + function = FunctionType.get(functionName.toUpperCase()); if (function != null) { expression = expression.substring(startParenthesis + 1, expression.length() - 1).trim(); if (function == FunctionType.COUNT && "*".equals(expression)) { http://git-wip-us.apache.org/repos/asf/metamodel/blob/edb10a13/core/src/test/java/org/apache/metamodel/query/parser/QueryParserTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/metamodel/query/parser/QueryParserTest.java b/core/src/test/java/org/apache/metamodel/query/parser/QueryParserTest.java index 53126c5..db377d6 100644 --- a/core/src/test/java/org/apache/metamodel/query/parser/QueryParserTest.java +++ b/core/src/test/java/org/apache/metamodel/query/parser/QueryParserTest.java @@ -18,6 +18,7 @@ */ package org.apache.metamodel.query.parser; +import java.lang.String; import java.util.Arrays; import java.util.List; @@ -95,6 +96,21 @@ public class QueryParserTest extends TestCase { assertEquals("SELECT DISTINCT tbl.foo, tbl.bar AS f FROM sch.tbl", q.toSql()); } + public void testSelectDistinctInLowerCase() throws Exception { + Query q = MetaModelHelper.parseQuery(dc, "SELECT distinct foo, bar AS f FROM sch.tbl"); + assertEquals("SELECT DISTINCT tbl.foo, tbl.bar AS f FROM sch.tbl", q.toSql()); + } + + public void testSelectMinInLowerCase() throws Exception { + Query q = MetaModelHelper.parseQuery(dc, "SELECT min(tbl.foo) FROM sch.tbl"); + assertEquals("SELECT MIN(tbl.foo) FROM sch.tbl", q.toSql()); + } + + public void testSelectAvgInLowerCase() throws Exception { + Query q = MetaModelHelper.parseQuery(dc, "SELECT avg(tbl.foo) FROM sch.tbl"); + assertEquals("SELECT AVG(tbl.foo) FROM sch.tbl", q.toSql()); + } + public void testSimpleSelectFrom() throws Exception { Query q = MetaModelHelper.parseQuery(dc, "SELECT foo\nFROM sch.tbl"); assertEquals("SELECT tbl.foo FROM sch.tbl", q.toSql()); @@ -239,6 +255,30 @@ public class QueryParserTest extends TestCase { assertEquals(5, ((List<?>) operand).get(2)); } + public void testWhereInInLowerCase() throws Exception { + Query q = MetaModelHelper.parseQuery(dc, "SELECT foo FROM sch.tbl WHERE foo in ('a','b',5)"); + assertEquals("SELECT tbl.foo FROM sch.tbl WHERE tbl.foo IN ('a' , 'b' , '5')", q.toSql()); + + FilterItem whereItem = q.getWhereClause().getItem(0); + assertEquals(OperatorType.IN, whereItem.getOperator()); + Object operand = whereItem.getOperand(); + assertTrue(operand instanceof List); + assertEquals("a", ((List<?>) operand).get(0)); + assertEquals("b", ((List<?>) operand).get(1)); + assertEquals(5, ((List<?>) operand).get(2)); + } + + public void testWhereLikeInLowerCase() throws Exception { + Query q = MetaModelHelper.parseQuery(dc, "SELECT foo FROM sch.tbl WHERE foo like 'a%'"); + assertEquals("SELECT tbl.foo FROM sch.tbl WHERE tbl.foo LIKE 'a%'", q.toSql()); + + FilterItem whereItem = q.getWhereClause().getItem(0); + assertEquals(OperatorType.LIKE, whereItem.getOperator()); + Object operand = whereItem.getOperand(); + assertTrue(operand instanceof String); + assertEquals("a%", operand); + } + public void testSimpleSubQuery() throws Exception { Query q = MetaModelHelper.parseQuery(dc, "SELECT f.foo AS fo FROM (SELECT * FROM sch.tbl) f"); assertEquals("SELECT f.foo AS fo FROM (SELECT tbl.foo, tbl.bar, tbl.baz FROM sch.tbl) f", q.toSql());
