You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2015/03/09 19:23:04 UTC

metamodel git commit: METAMODEL-115: Fixes query parser to allow lower-case function names etc. This fixes #7

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 <i....@gmail.com>
Authored: Mon Mar 9 19:22:58 2015 +0100
Committer: Kasper Sørensen <i....@gmail.com>
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());