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/10/25 16:06:16 UTC
metamodel git commit: METAMODEL-200: Fixed Fixes #62
Repository: metamodel
Updated Branches:
refs/heads/master 9de5b7711 -> bec25c455
METAMODEL-200: Fixed
Fixes #62
Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/bec25c45
Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/bec25c45
Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/bec25c45
Branch: refs/heads/master
Commit: bec25c455e20aa4ddb50d448593fa781a601b58a
Parents: 9de5b77
Author: Kasper Sørensen <i....@gmail.com>
Authored: Sun Oct 25 16:06:13 2015 +0100
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Sun Oct 25 16:06:13 2015 +0100
----------------------------------------------------------------------
.../org/apache/metamodel/query/SelectItem.java | 19 ++++++++++++++++---
.../metamodel/query/parser/SelectItemParser.java | 19 +++++++++++++------
.../apache/metamodel/query/SelectItemTest.java | 6 ++++++
.../metamodel/query/parser/QueryParserTest.java | 6 ++++++
4 files changed, 41 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/metamodel/blob/bec25c45/core/src/main/java/org/apache/metamodel/query/SelectItem.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/query/SelectItem.java b/core/src/main/java/org/apache/metamodel/query/SelectItem.java
index b9883f8..287d1a6 100644
--- a/core/src/main/java/org/apache/metamodel/query/SelectItem.java
+++ b/core/src/main/java/org/apache/metamodel/query/SelectItem.java
@@ -47,6 +47,8 @@ import org.slf4j.LoggerFactory;
*/
public class SelectItem extends BaseObject implements QueryItem, Cloneable {
+ public static final String FUNCTION_APPROXIMATION_PREFIX = "APPROXIMATE ";
+
private static final long serialVersionUID = 317475105509663973L;
private static final Logger logger = LoggerFactory.getLogger(SelectItem.class);
@@ -331,7 +333,10 @@ public class SelectItem extends BaseObject implements QueryItem, Cloneable {
} else if (_column != null) {
final StringBuilder sb = new StringBuilder();
if (_function != null) {
- sb.append(_function.toString());
+ if (_functionApproximationAllowed) {
+ sb.append(FUNCTION_APPROXIMATION_PREFIX);
+ }
+ sb.append(_function.getFunctionName());
sb.append('(');
}
if (includeQuotes) {
@@ -364,7 +369,11 @@ public class SelectItem extends BaseObject implements QueryItem, Cloneable {
sb.append(columnPrefix);
sb.append(_column.getQuotedName());
if (_function != null) {
- sb.insert(0, _function + "(");
+ if (_functionApproximationAllowed) {
+ sb.insert(0, FUNCTION_APPROXIMATION_PREFIX + _function.getFunctionName() + "(");
+ } else {
+ sb.insert(0, _function.getFunctionName() + "(");
+ }
sb.append(")");
}
return sb.toString();
@@ -412,7 +421,11 @@ public class SelectItem extends BaseObject implements QueryItem, Cloneable {
sb.append(_subQuerySelectItem.getSuperQueryAlias());
}
if (_function != null) {
- sb.insert(0, _function.getFunctionName() + "(");
+ if (_functionApproximationAllowed) {
+ sb.insert(0, FUNCTION_APPROXIMATION_PREFIX + _function.getFunctionName() + "(");
+ } else {
+ sb.insert(0, _function.getFunctionName() + "(");
+ }
sb.append(")");
}
return sb;
http://git-wip-us.apache.org/repos/asf/metamodel/blob/bec25c45/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 9e87e1d..9cea18e 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
@@ -106,19 +106,24 @@ public final class SelectItemParser implements QueryPartProcessor {
final String unmodifiedExpression = expression;
+ final boolean functionApproximation;
final FunctionType function;
final int startParenthesis = expression.indexOf('(');
if (startParenthesis > 0 && expression.endsWith(")")) {
- String functionName = expression.substring(0, startParenthesis);
+ functionApproximation = (expression.startsWith(SelectItem.FUNCTION_APPROXIMATION_PREFIX));
+ final String functionName = expression.substring((functionApproximation ? SelectItem.FUNCTION_APPROXIMATION_PREFIX.length() : 0), startParenthesis);
function = FunctionTypeFactory.get(functionName.toUpperCase());
if (function != null) {
expression = expression.substring(startParenthesis + 1, expression.length() - 1).trim();
if (function instanceof CountAggregateFunction && "*".equals(expression)) {
- return SelectItem.getCountAllItem();
+ final SelectItem selectItem = SelectItem.getCountAllItem();
+ selectItem.setFunctionApproximationAllowed(functionApproximation);
+ return selectItem;
}
}
} else {
function = null;
+ functionApproximation = false;
}
int lastIndexOfDot = expression.lastIndexOf(".");
@@ -146,9 +151,10 @@ public final class SelectItemParser implements QueryPartProcessor {
if ("*".equals(columnName)) {
throw new MultipleSelectItemsParsedException(fromItem);
} else if (fromItem.getTable() != null) {
- Column column = fromItem.getTable().getColumnByName(columnName);
+ final Column column = fromItem.getTable().getColumnByName(columnName);
if (column != null) {
- SelectItem selectItem = new SelectItem(function, column, fromItem);
+ final SelectItem selectItem = new SelectItem(function, column, fromItem);
+ selectItem.setFunctionApproximationAllowed(functionApproximation);
return selectItem;
}
} else if (fromItem.getSubQuery() != null) {
@@ -170,9 +176,10 @@ public final class SelectItemParser implements QueryPartProcessor {
}
if (_allowExpressionBasedSelectItems) {
- return new SelectItem(function, expression, null);
+ final SelectItem selectItem = new SelectItem(function, expression, null);
+ selectItem.setFunctionApproximationAllowed(functionApproximation);
+ return selectItem;
}
return null;
}
-
}
http://git-wip-us.apache.org/repos/asf/metamodel/blob/bec25c45/core/src/test/java/org/apache/metamodel/query/SelectItemTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/query/SelectItemTest.java b/core/src/test/java/org/apache/metamodel/query/SelectItemTest.java
index 57f3bcc..e6bbdca 100644
--- a/core/src/test/java/org/apache/metamodel/query/SelectItemTest.java
+++ b/core/src/test/java/org/apache/metamodel/query/SelectItemTest.java
@@ -44,6 +44,12 @@ public class SelectItemTest extends MetaModelTestCase {
SelectItem selectItem = new SelectItem(_schema.getTableByName(TABLE_PROJECT).getColumns()[0]);
assertEquals("project.project_id", selectItem.toSql());
}
+
+ public void testToSqlFuntionApproximation() throws Exception {
+ SelectItem selectItem = new SelectItem(FunctionType.MAX, _schema.getTableByName(TABLE_PROJECT).getColumns()[0]);
+ selectItem.setFunctionApproximationAllowed(true);
+ assertEquals("APPROXIMATE MAX(project.project_id)", selectItem.toSql());
+ }
public void testSubQuerySelectItem() throws Exception {
Table projectTable = _schema.getTableByName(TABLE_PROJECT);
http://git-wip-us.apache.org/repos/asf/metamodel/blob/bec25c45/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 d1c198f..92befe2 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
@@ -94,6 +94,12 @@ public class QueryParserTest extends TestCase {
Query q = MetaModelHelper.parseQuery(dc, "SELECT fo.o AS f FROM sch.tbl");
assertEquals("SELECT tbl.fo.o AS f FROM sch.tbl", q.toSql());
}
+
+ public void testApproximateCountQuery() throws Exception {
+ Query q = MetaModelHelper.parseQuery(dc, "SELECT APPROXIMATE COUNT(*) FROM sch.tbl");
+ assertEquals("SELECT APPROXIMATE COUNT(*) FROM sch.tbl", q.toSql());
+ assertTrue(q.getSelectClause().getItem(0).isFunctionApproximationAllowed());
+ }
public void testSelectAlias() throws Exception {
Query q = MetaModelHelper.parseQuery(dc, "SELECT foo AS f FROM sch.tbl");