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());