You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hy...@apache.org on 2014/08/01 08:12:01 UTC

git commit: TAJO-978: RoundFloat8 should return Float8Datum type. (Hyoungjun Kim via hyunsik)

Repository: tajo
Updated Branches:
  refs/heads/master 8024f6ab3 -> 650157c59


TAJO-978: RoundFloat8 should return Float8Datum type. (Hyoungjun Kim via hyunsik)

Closes #96


Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/650157c5
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/650157c5
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/650157c5

Branch: refs/heads/master
Commit: 650157c5907c43a2f9228cd9a3ff59619e24efb6
Parents: 8024f6a
Author: Hyunsik Choi <hy...@apache.org>
Authored: Fri Aug 1 15:06:14 2014 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Fri Aug 1 15:11:46 2014 +0900

----------------------------------------------------------------------
 CHANGES                                         |  3 ++
 .../tajo/engine/function/math/RoundFloat8.java  | 39 ++++++++------------
 .../tajo/engine/function/TestMathFunctions.java | 27 +++++++++-----
 .../tajo/engine/query/TestSelectQuery.java      | 21 +++++++++++
 .../TestSelectQuery/testCaseWhenRound.sql       |  8 ++++
 .../TestSelectQuery/testCaseWhenRound.result    | 22 +++++++++++
 6 files changed, 87 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/650157c5/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index f423548..76cfff7 100644
--- a/CHANGES
+++ b/CHANGES
@@ -97,6 +97,9 @@ Release 0.9.0 - unreleased
 
   BUG FIXES
     
+    TAJO-978: RoundFloat8 should return Float8Datum type. (Hyoungjun Kim via 
+    hyunsik)
+
     TAJO-957: ROUND should be support INT parameter. (Mai Hai Thanh via hyunsik)
 
     TAJO-980: execution page in Web UI broken. (hyunsik)

http://git-wip-us.apache.org/repos/asf/tajo/blob/650157c5/tajo-core/src/main/java/org/apache/tajo/engine/function/math/RoundFloat8.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/RoundFloat8.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/RoundFloat8.java
index 56d40e4..d104431 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/RoundFloat8.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/RoundFloat8.java
@@ -23,13 +23,14 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.eval.FunctionEval;
 import org.apache.tajo.engine.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
+import org.apache.tajo.exception.InvalidOperationException;
 import org.apache.tajo.storage.Tuple;
 
-import java.text.NumberFormat;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 
 /**
  * Function definition
@@ -46,9 +47,6 @@ import java.text.NumberFormat;
         @ParamTypes(paramTypes = {TajoDataTypes.Type.INT8, TajoDataTypes.Type.INT4})}
 )
 public class RoundFloat8 extends GeneralFunction {
-  private NumberFormat numberFormat;
-  private boolean formatConstant;
-
   public RoundFloat8() {
     super(new Column[] {
         new Column("value", TajoDataTypes.Type.FLOAT8),
@@ -57,11 +55,6 @@ public class RoundFloat8 extends GeneralFunction {
   }
 
   @Override
-  public void init(FunctionEval.ParamType [] paramTypes) {
-    formatConstant = paramTypes[1] == FunctionEval.ParamType.CONSTANT;
-  }
-
-  @Override
   public Datum eval(Tuple params) {
     Datum valueDatum = params.get(0);
     Datum roundDatum = params.get(1);
@@ -70,23 +63,23 @@ public class RoundFloat8 extends GeneralFunction {
       return NullDatum.get();
     }
 
-    if (numberFormat == null || !formatConstant) {
-      numberFormat = NumberFormat.getInstance();
-      numberFormat.setGroupingUsed(false);
-      numberFormat.setMaximumFractionDigits(roundDatum.asInt4());
-    }
-
     double value = valueDatum.asFloat8();
-    int roundPnt = roundDatum.asInt4();
-    double roundNum;
+    int rountPoint = roundDatum.asInt4();
 
-    if (value > 0) {
-      roundNum = (long)(value * Math.pow(10, roundPnt) + 0.5d) / Math.pow(10, roundPnt);
+    if (Double.isNaN(value)) {
+      throw new InvalidOperationException("value is not a number.");
     }
-    else {
-      roundNum = (long)(value * Math.pow(10, roundPnt) - 0.5d) / Math.pow(10, roundPnt);
+
+    if (Double.isInfinite(value)) {
+      throw new InvalidOperationException("value is infinite.");
     }
 
-    return DatumFactory.createText(numberFormat.format(roundNum));
+    try {
+      return DatumFactory.createFloat8(BigDecimal.valueOf(value).setScale(rountPoint,
+          RoundingMode.HALF_UP).doubleValue());
+    } catch (Exception e) {
+      throw new InvalidOperationException("RoundFloat8 eval error cause " + e.getMessage() + ", value=" + value +
+          ", round point=" + rountPoint);
+    }
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/650157c5/tajo-core/src/test/java/org/apache/tajo/engine/function/TestMathFunctions.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/function/TestMathFunctions.java b/tajo-core/src/test/java/org/apache/tajo/engine/function/TestMathFunctions.java
index 41fcbfe..8068180 100644
--- a/tajo-core/src/test/java/org/apache/tajo/engine/function/TestMathFunctions.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/function/TestMathFunctions.java
@@ -20,13 +20,13 @@ package org.apache.tajo.engine.function;
 
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.engine.eval.ExprTestBase;
+import org.apache.tajo.exception.InvalidOperationException;
 import org.junit.Test;
 
 import java.io.IOException;
-import java.sql.ResultSet;
 
 import static org.apache.tajo.common.TajoDataTypes.Type.*;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 
 public class TestMathFunctions extends ExprTestBase {
   @Test
@@ -440,19 +440,26 @@ public class TestMathFunctions extends ExprTestBase {
 
   @Test
   public void testRoundWithSpecifiedPrecision() throws IOException {
+    // divide zero
+    try {
+      testSimpleEval("select round(10.0/0.0,2) ", new String[]{""});
+      fail("10.0/0 should throw InvalidOperationException");
+    } catch (InvalidOperationException e) {
+      //success
+    }
+
     testSimpleEval("select round(42.4382,2) ", new String[]{"42.44"});
     testSimpleEval("select round(-42.4382,2) ", new String[]{"-42.44"});
-    testSimpleEval("select round(-425,2) ", new String[]{"-425"});
-    testSimpleEval("select round(425,2) ", new String[]{"425"});
+    testSimpleEval("select round(-425,2) ", new String[]{"-425.0"});
+    testSimpleEval("select round(425,2) ", new String[]{"425.0"});
 
-    testSimpleEval("select round(1234567890,0) ", new String[]{"1234567890"});
-    testSimpleEval("select round(1234567890,1) ", new String[]{"1234567890"});
-    testSimpleEval("select round(1234567890,2) ", new String[]{"1234567890"});
+    testSimpleEval("select round(1234567890,0) ", new String[]{"1.23456789E9"});
+    testSimpleEval("select round(1234567890,1) ", new String[]{"1.23456789E9"});
+    testSimpleEval("select round(1234567890,2) ", new String[]{"1.23456789E9"});
 
     testSimpleEval("select round(1.2345678901234567,13) ", new String[]{"1.2345678901235"});
-    testSimpleEval("select round(1234567890.1234567,3) ", new String[]{"1234567890.123"});
-    testSimpleEval("select round(1234567890.1234567,5) ", new String[]{"1234567890.12346"});
-    //testSimpleEval("select round(1234567890.1234567890,7) ", new String[]{"1234567890.1234568"});
+    testSimpleEval("select round(1234567890.1234567,3) ", new String[]{"1.234567890123E9"});
+    testSimpleEval("select round(1234567890.1234567,5) ", new String[]{"1.23456789012346E9"});
 
     Schema schema = new Schema();
     schema.addColumn("col1", FLOAT8);

http://git-wip-us.apache.org/repos/asf/tajo/blob/650157c5/tajo-core/src/test/java/org/apache/tajo/engine/query/TestSelectQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestSelectQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestSelectQuery.java
index 8898067..2fd7b14 100644
--- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestSelectQuery.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestSelectQuery.java
@@ -470,4 +470,25 @@ public class TestSelectQuery extends QueryTestCaseBase {
       executeString("DROP TABLE table11 PURGE");
     }
   }
+
+  @Test
+  public void testCaseWhenRound() throws Exception {
+    /*
+    select *
+        from (select n_nationkey as key,
+    case
+      when n_nationkey > 6 then round((n_nationkey * 100 / 2.123) / (n_regionkey * 50 / 2.123), 2) else 100.0 end as val
+    from
+      nation
+    where
+      n_regionkey > 0 and n_nationkey > 0
+    ) a
+    order by
+      a.key
+    */
+
+    ResultSet res = executeQuery();
+    assertResultSet(res);
+    cleanupQuery(res);
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/650157c5/tajo-core/src/test/resources/queries/TestSelectQuery/testCaseWhenRound.sql
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/queries/TestSelectQuery/testCaseWhenRound.sql b/tajo-core/src/test/resources/queries/TestSelectQuery/testCaseWhenRound.sql
new file mode 100644
index 0000000..cee905a
--- /dev/null
+++ b/tajo-core/src/test/resources/queries/TestSelectQuery/testCaseWhenRound.sql
@@ -0,0 +1,8 @@
+select *
+  from (select n_nationkey as key,
+               case when n_nationkey > 6 then round((n_nationkey * 100 / 2.123) / (n_regionkey * 50 / 2.123), 2) else 100.0 end as val
+          from nation
+         where n_regionkey > 0
+           and n_nationkey > 0
+  ) a
+order by a.key
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/650157c5/tajo-core/src/test/resources/results/TestSelectQuery/testCaseWhenRound.result
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/results/TestSelectQuery/testCaseWhenRound.result b/tajo-core/src/test/resources/results/TestSelectQuery/testCaseWhenRound.result
new file mode 100644
index 0000000..2a50cd0
--- /dev/null
+++ b/tajo-core/src/test/resources/results/TestSelectQuery/testCaseWhenRound.result
@@ -0,0 +1,22 @@
+key,val
+-------------------------------
+1,100.0
+2,100.0
+3,100.0
+4,100.0
+6,100.0
+7,4.67
+8,8.0
+9,9.0
+10,5.0
+11,5.5
+12,12.0
+13,6.5
+17,34.0
+18,18.0
+19,12.67
+20,10.0
+21,21.0
+22,14.67
+23,15.33
+24,48.0