From 4b7ade730734038503d29c5157fb842934f511a3 Mon Sep 17 00:00:00 2001 From: Hosur Narahari Date: Wed, 25 Mar 2015 21:29:14 +0530 Subject: [PATCH 1/5] changing select(expression) method of Query to support multiple columns and expressions in single string --- .../org/apache/metamodel/query/Query.java | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) 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 586d0b503..fb8848062 100644 --- a/core/src/main/java/org/apache/metamodel/query/Query.java +++ b/core/src/main/java/org/apache/metamodel/query/Query.java @@ -125,9 +125,35 @@ public Query select(String expression) { if ("*".equals(expression)) { return selectAll(); } - - SelectItem selectItem = findSelectItem(expression, true); - return select(selectItem); + + String[] possibleSelectItems = splitExpressionByComma(expression); + for(String possibleSelectItem : possibleSelectItems) { + SelectItem selectItem = findSelectItem(possibleSelectItem, true); + select(selectItem); + } + return this; + } + + /** + * If multiple columns or expressions are given in comma seperated string, this methods splits and generates + * string array of expressions representing single column. + * @param expression + * @return + */ + public String[] splitExpressionByComma(String expression) { + String[] intermediateSplit = expression.split(","); + List expressionList = new ArrayList(); + for(int i=0 ; i < intermediateSplit.length ; i++) { + String token = intermediateSplit[i]; + int openParanthesisIndex = token.lastIndexOf("("); + int closeParanthesisIndex = token.lastIndexOf(")"); + if(openParanthesisIndex > -1 && (closeParanthesisIndex < 0 || openParanthesisIndex > closeParanthesisIndex)) { + intermediateSplit[i+1] = token + "," + intermediateSplit[i+1]; + continue; + } + expressionList.add(token); + } + return expressionList.toArray(new String[expressionList.size()]); } private SelectItem findSelectItem(String expression, boolean allowExpressionBasedSelectItem) { From a6684b9dde12e7766612a58940ab951bcf4f48c9 Mon Sep 17 00:00:00 2001 From: Hosur Narahari Date: Thu, 26 Mar 2015 20:23:20 +0530 Subject: [PATCH 2/5] change to select(expression) method of Query to have multiple expression in single method --- .../main/java/org/apache/metamodel/query/Query.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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 fb8848062..c292cf2e9 100644 --- a/core/src/main/java/org/apache/metamodel/query/Query.java +++ b/core/src/main/java/org/apache/metamodel/query/Query.java @@ -122,14 +122,14 @@ public Query select(String expression, String alias) { * @return */ public Query select(String expression) { - if ("*".equals(expression)) { - return selectAll(); - } - String[] possibleSelectItems = splitExpressionByComma(expression); for(String possibleSelectItem : possibleSelectItems) { - SelectItem selectItem = findSelectItem(possibleSelectItem, true); - select(selectItem); + if ("*".equals(possibleSelectItem)) { + selectAll(); + continue; + } + SelectItem selectItem = findSelectItem(possibleSelectItem, true); + select(selectItem); } return this; } From 3436ef2bb487311ea563e0bab5e8b5986ec52327 Mon Sep 17 00:00:00 2001 From: Hosur Narahari Date: Thu, 26 Mar 2015 20:27:31 +0530 Subject: [PATCH 3/5] Unit test for issue METAMODEL-126 --- .../metamodel/QueryPostprocessDataContextTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java b/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java index 58ded2619..311b2990d 100644 --- a/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java +++ b/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java @@ -1022,4 +1022,16 @@ public void testQueryWithDotInTableName() throws Exception { assertEquals("file.csv.foo = 'bar'", item.toSql()); } + + public void testQueryWithMultipleColumnsInExpression() { + Query query1 = new Query().from(table1).select("contributor_id,name"); + DataSet set = getDataContext().executeQuery(query1); + assertEquals(set.next(), true); + assertEquals(set.getRow().toString(), "Row[values=[1, kasper]]"); + Query query2 = new Query().from(table1).select("Greatest(1,2,3),max(contributer_id)"); + assertEquals(query2.toString(), "SELECT Greatest(1,2,3), MAX(contributer_id) FROM MetaModelSchema.contributor"); + Query query3 = new Query().from(table1).select("*,count(*)"); + assertEquals(query3.toString(), "SELECT contributor.contributor_id, contributor.name, contributor.country, COUNT(*)" + + " FROM MetaModelSchema.contributor"); + } } \ No newline at end of file From 6b13a57033c5e84f7f635c858d9531992e8b2780 Mon Sep 17 00:00:00 2001 From: Hosur Narahari Date: Sat, 28 Mar 2015 21:08:53 +0530 Subject: [PATCH 4/5] corrected the exprected and actual parameters location in method signature --- .../metamodel/QueryPostprocessDataContextTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java b/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java index 311b2990d..4a4cd272f 100644 --- a/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java +++ b/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java @@ -1026,12 +1026,12 @@ public void testQueryWithDotInTableName() throws Exception { public void testQueryWithMultipleColumnsInExpression() { Query query1 = new Query().from(table1).select("contributor_id,name"); DataSet set = getDataContext().executeQuery(query1); - assertEquals(set.next(), true); - assertEquals(set.getRow().toString(), "Row[values=[1, kasper]]"); + assertEquals(true,set.next()); + assertEquals("Row[values=[1, kasper]]",set.getRow().toString()); Query query2 = new Query().from(table1).select("Greatest(1,2,3),max(contributer_id)"); - assertEquals(query2.toString(), "SELECT Greatest(1,2,3), MAX(contributer_id) FROM MetaModelSchema.contributor"); + assertEquals("SELECT Greatest(1,2,3), MAX(contributer_id) FROM MetaModelSchema.contributor",query2.toString()); Query query3 = new Query().from(table1).select("*,count(*)"); - assertEquals(query3.toString(), "SELECT contributor.contributor_id, contributor.name, contributor.country, COUNT(*)" - + " FROM MetaModelSchema.contributor"); + assertEquals("SELECT contributor.contributor_id, contributor.name, contributor.country, COUNT(*)" + + " FROM MetaModelSchema.contributor",query3.toString()); } } \ No newline at end of file From 724bdc7a3a70fb70112b05165ee389d0b13d573a Mon Sep 17 00:00:00 2001 From: Hosur Narahari Date: Sun, 29 Mar 2015 10:50:07 +0530 Subject: [PATCH 5/5] refactored select(expression) method of Query --- .../org/apache/metamodel/query/Query.java | 33 ++----------------- 1 file changed, 2 insertions(+), 31 deletions(-) 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 c292cf2e9..2af1c9af7 100644 --- a/core/src/main/java/org/apache/metamodel/query/Query.java +++ b/core/src/main/java/org/apache/metamodel/query/Query.java @@ -122,39 +122,10 @@ public Query select(String expression, String alias) { * @return */ public Query select(String expression) { - String[] possibleSelectItems = splitExpressionByComma(expression); - for(String possibleSelectItem : possibleSelectItems) { - if ("*".equals(possibleSelectItem)) { - selectAll(); - continue; - } - SelectItem selectItem = findSelectItem(possibleSelectItem, true); - select(selectItem); - } + QueryPartParser clauseParser = new QueryPartParser(new SelectItemParser(this, true), expression, ","); + clauseParser.parse(); return this; } - - /** - * If multiple columns or expressions are given in comma seperated string, this methods splits and generates - * string array of expressions representing single column. - * @param expression - * @return - */ - public String[] splitExpressionByComma(String expression) { - String[] intermediateSplit = expression.split(","); - List expressionList = new ArrayList(); - for(int i=0 ; i < intermediateSplit.length ; i++) { - String token = intermediateSplit[i]; - int openParanthesisIndex = token.lastIndexOf("("); - int closeParanthesisIndex = token.lastIndexOf(")"); - if(openParanthesisIndex > -1 && (closeParanthesisIndex < 0 || openParanthesisIndex > closeParanthesisIndex)) { - intermediateSplit[i+1] = token + "," + intermediateSplit[i+1]; - continue; - } - expressionList.add(token); - } - return expressionList.toArray(new String[expressionList.size()]); - } private SelectItem findSelectItem(String expression, boolean allowExpressionBasedSelectItem) { SelectItemParser parser = new SelectItemParser(this, allowExpressionBasedSelectItem);