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.am.kasper.soren...@gmail.com> Authored: Sun Oct 25 16:06:13 2015 +0100 Committer: Kasper Sørensen <i.am.kasper.soren...@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");