You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ma...@apache.org on 2016/03/29 21:51:01 UTC

[28/30] phoenix git commit: PHOENIX-2803 Initializing ToCharFunction with the List constructor fails

PHOENIX-2803 Initializing ToCharFunction with the List<Expression> constructor fails


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

Branch: refs/heads/calcite
Commit: b98805039516bfa706f1fa78ed0850d802df5dc8
Parents: d07fed5
Author: Thomas D'Silva <td...@salesforce.com>
Authored: Mon Mar 28 12:01:12 2016 -0700
Committer: Thomas D'Silva <td...@salesforce.com>
Committed: Mon Mar 28 14:23:51 2016 -0700

----------------------------------------------------------------------
 .../apache/phoenix/end2end/ToCharFunctionIT.java   | 15 +++++++++++++++
 .../apache/phoenix/end2end/ToDateFunctionIT.java   | 15 +++++++++++++++
 .../expression/function/ToCharFunction.java        | 13 +++++++++----
 .../expression/function/ToDateFunction.java        | 17 +++++++++++------
 .../expression/function/ToNumberFunction.java      | 14 ++++++++++----
 .../expression/function/ToTimeFunction.java        | 13 +++++++++----
 .../expression/function/ToTimestampFunction.java   | 13 +++++++++----
 .../function/BuiltinFunctionConstructorTest.java   | 11 ++++++++---
 8 files changed, 86 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/b9880503/phoenix-core/src/it/java/org/apache/phoenix/end2end/ToCharFunctionIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ToCharFunctionIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ToCharFunctionIT.java
index 52b5207..1cccf07 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ToCharFunctionIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ToCharFunctionIT.java
@@ -28,6 +28,7 @@ import java.sql.Date;
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.sql.Time;
 import java.sql.Timestamp;
 import java.text.DateFormat;
@@ -240,4 +241,18 @@ public class ToCharFunctionIT extends BaseClientManagedTimeIT {
         result.setTimeZone(TimeZone.getTimeZone("GMT"));
         return result;
     }
+    
+    @Test
+    public void testToCharWithCloneMethod() throws SQLException {
+        Connection conn = DriverManager.getConnection(getUrl());
+    	String ddl = "create table t (k varchar primary key, v integer[])";
+        conn.createStatement().execute(ddl);
+        conn.createStatement().execute("UPSERT INTO T VALUES('x',ARRAY[1234])");
+        conn.commit();
+        
+        ResultSet rs = conn.createStatement().executeQuery("select to_char(v[1],'000') from t");
+        assertTrue(rs.next());
+        assertEquals("Unexpected value for date ", String.valueOf(1234), rs.getString(1));
+        assertFalse(rs.next());
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/b9880503/phoenix-core/src/it/java/org/apache/phoenix/end2end/ToDateFunctionIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ToDateFunctionIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ToDateFunctionIT.java
index dbe47ca..acb29df 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ToDateFunctionIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ToDateFunctionIT.java
@@ -251,4 +251,19 @@ public class ToDateFunctionIT extends BaseHBaseManagedTimeIT {
         assertEquals("Did not get value that was inserted!!", dateString2, obtainedString);
         assertFalse("No more rows expected!!", rs.next());
     }
+    
+    @Test
+    public void testToDateWithCloneMethod() throws SQLException {
+        Connection conn = DriverManager.getConnection(getUrl());
+    	String ddl = "create table t (k varchar primary key, v varchar[])";
+        conn.createStatement().execute(ddl);
+        String dateStr = "2100-01-01";
+        conn.createStatement().execute("UPSERT INTO T VALUES('x',ARRAY['"+dateStr+"'])");
+        conn.commit();
+        ResultSet rs = conn.createStatement().executeQuery("select to_date(v[1], 'yyyy-MM-dd', 'local') from t");
+        
+        assertTrue(rs.next());
+        assertEquals("Unexpected value for date ", Date.valueOf(dateStr), rs.getDate(1));
+        assertFalse(rs.next());
+    }
 }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/b9880503/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToCharFunction.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToCharFunction.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToCharFunction.java
index a14a0cb..d284e25 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToCharFunction.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToCharFunction.java
@@ -57,10 +57,6 @@ public class ToCharFunction extends ScalarFunction {
     public ToCharFunction() {
     }
 
-    public ToCharFunction(List<Expression> children) throws  SQLException {
-        this(children, null, null, null);
-    }
-
     public ToCharFunction(List<Expression> children, FunctionArgumentType type, String formatString, Format formatter) throws SQLException {
         super(children.subList(0, 1));
         Preconditions.checkNotNull(formatString);
@@ -72,6 +68,15 @@ public class ToCharFunction extends ScalarFunction {
     }
     
     @Override
+    public ToCharFunction clone(List<Expression> children) {
+    	try {
+            return new ToCharFunction(children, type, formatString, formatter);
+        } catch (Exception e) {
+            throw new RuntimeException(e); // Impossible, since it was originally constructed this way
+        }
+    }
+    
+    @Override
     public int hashCode() {
         final int prime = 31;
         int result = 1;

http://git-wip-us.apache.org/repos/asf/phoenix/blob/b9880503/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToDateFunction.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToDateFunction.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToDateFunction.java
index f41d959..17f6847 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToDateFunction.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToDateFunction.java
@@ -53,21 +53,26 @@ import org.apache.phoenix.util.DateUtil;
 public class ToDateFunction extends ScalarFunction {
     public static final String NAME = "TO_DATE";
     private DateUtil.DateTimeParser dateParser;
-    private String dateFormat;
-    private String timeZoneId;
+    protected String dateFormat;
+    protected String timeZoneId;
 
     public ToDateFunction() {
     }
 
-    public ToDateFunction(List<Expression> children) throws SQLException {
-        this(children, null, null);
-    }
-    
     public ToDateFunction(List<Expression> children, String dateFormat, String timeZoneId) throws SQLException {
         super(children);
         init(dateFormat, timeZoneId);
     }
     
+    @Override
+    public ToDateFunction clone(List<Expression> children) {
+    	try {
+            return new ToDateFunction(children, dateFormat, timeZoneId);
+        } catch (Exception e) {
+            throw new RuntimeException(e); // Impossible, since it was originally constructed this way
+        }
+    }
+    
     private void init(String dateFormat, String timeZoneId) {
         this.dateFormat = dateFormat;
         this.dateParser = DateUtil.getDateTimeParser(dateFormat, getDataType(), timeZoneId);

http://git-wip-us.apache.org/repos/asf/phoenix/blob/b9880503/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToNumberFunction.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToNumberFunction.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToNumberFunction.java
index e7659a1..c43062f 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToNumberFunction.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToNumberFunction.java
@@ -30,6 +30,7 @@ import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.io.WritableUtils;
 
 import com.google.common.base.Preconditions;
+
 import org.apache.phoenix.expression.Expression;
 import org.apache.phoenix.parse.FunctionParseNode.Argument;
 import org.apache.phoenix.parse.FunctionParseNode.BuiltInFunction;
@@ -60,10 +61,6 @@ public class ToNumberFunction extends ScalarFunction {
     
     public ToNumberFunction() {}
 
-    public ToNumberFunction(List<Expression> children) throws SQLException {
-        this(children, null, null, null);
-    }
-
     public ToNumberFunction(List<Expression> children, FunctionArgumentType type, String formatString, Format formatter) throws SQLException {
         super(children.subList(0, 1));
         Preconditions.checkNotNull(type);
@@ -71,6 +68,15 @@ public class ToNumberFunction extends ScalarFunction {
         this.formatString = formatString;
         this.format = formatter;
     }
+    
+    @Override
+    public ToNumberFunction clone(List<Expression> children) {
+    	try {
+            return new ToNumberFunction(children, type, formatString, format);
+        } catch (Exception e) {
+            throw new RuntimeException(e); // Impossible, since it was originally constructed this way
+        }
+    }
 
     @Override
     public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) {

http://git-wip-us.apache.org/repos/asf/phoenix/blob/b9880503/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToTimeFunction.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToTimeFunction.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToTimeFunction.java
index 2fa0553..588cb92 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToTimeFunction.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToTimeFunction.java
@@ -47,13 +47,18 @@ public class ToTimeFunction extends ToDateFunction {
     public ToTimeFunction() {
     }
 
-    public ToTimeFunction(List<Expression> children) throws SQLException {
-        this(children, null, null);
-    }
-
     public ToTimeFunction(List<Expression> children, String dateFormat, String timeZoneId) throws SQLException {
         super(children, dateFormat, timeZoneId);
     }
+    
+    @Override
+    public ToTimeFunction clone(List<Expression> children) {
+    	try {
+            return new ToTimeFunction(children, dateFormat, timeZoneId);
+        } catch (Exception e) {
+            throw new RuntimeException(e); // Impossible, since it was originally constructed this way
+        }
+    }
 
     @Override
     public PDataType getDataType() {

http://git-wip-us.apache.org/repos/asf/phoenix/blob/b9880503/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToTimestampFunction.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToTimestampFunction.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToTimestampFunction.java
index 5a4828f..6c14595 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToTimestampFunction.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ToTimestampFunction.java
@@ -47,13 +47,18 @@ public class ToTimestampFunction extends ToDateFunction {
     public ToTimestampFunction() {
     }
 
-    public ToTimestampFunction(List<Expression> children) throws SQLException {
-        this(children, null, null);
-    }
-
     public ToTimestampFunction(List<Expression> children, String dateFormat, String timeZoneId) throws SQLException {
         super(children, dateFormat, timeZoneId);
     }
+    
+    @Override
+    public ToTimestampFunction clone(List<Expression> children) {
+    	try {
+            return new ToTimestampFunction(children, dateFormat, timeZoneId);
+        } catch (Exception e) {
+            throw new RuntimeException(e); // Impossible, since it was originally constructed this way
+        }
+    }
 
     @Override
     public PDataType getDataType() {

http://git-wip-us.apache.org/repos/asf/phoenix/blob/b9880503/phoenix-core/src/test/java/org/apache/phoenix/expression/function/BuiltinFunctionConstructorTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/expression/function/BuiltinFunctionConstructorTest.java b/phoenix-core/src/test/java/org/apache/phoenix/expression/function/BuiltinFunctionConstructorTest.java
index 5258283..69f39fb 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/expression/function/BuiltinFunctionConstructorTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/expression/function/BuiltinFunctionConstructorTest.java
@@ -18,6 +18,7 @@
 package org.apache.phoenix.expression.function;
 
 import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -35,9 +36,13 @@ public class BuiltinFunctionConstructorTest {
         for(int i = 0; i < types.length; i++) {
             try {
                 if((ScalarFunction.class.isAssignableFrom(types[i].getExpressionClass())) && (types[i].getExpressionClass() != UDFExpression.class)) {
-                    Constructor cons = types[i].getExpressionClass().getDeclaredConstructor(List.class);
-                    cons.setAccessible(true);
-                    cons.newInstance(children);
+                	Method cloneMethod = types[i].getExpressionClass().getMethod("clone", List.class);
+                	// ScalarFunctions that implement clone(List<Expression>) don't need to implement a constructor that takes a List<Expression>  
+                	if (cloneMethod==null) {
+	                    Constructor cons = types[i].getExpressionClass().getDeclaredConstructor(List.class);
+	                    cons.setAccessible(true);
+	                    cons.newInstance(children);
+                	}
                 }
             } catch (NoSuchMethodException e) {
                 throw new RuntimeException(e);