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