You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by sa...@apache.org on 2015/04/17 21:24:36 UTC

[2/2] phoenix git commit: PHOENIX-1759 PhoenixArray to have decent toString() implementation (Alex Warshavsky)

PHOENIX-1759 PhoenixArray to have decent toString() implementation (Alex Warshavsky)


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

Branch: refs/heads/master
Commit: 45b1d4b86d217c9b420791b9a4350608b390c1c5
Parents: 8b1d7d9
Author: Samarth <sa...@salesforce.com>
Authored: Fri Apr 17 12:24:25 2015 -0700
Committer: Samarth <sa...@salesforce.com>
Committed: Fri Apr 17 12:24:25 2015 -0700

----------------------------------------------------------------------
 .../org/apache/phoenix/end2end/ArrayIT.java     |  125 +-
 .../apache/phoenix/schema/types/PDataType.java  |   15 +-
 .../org/apache/phoenix/schema/types/PDate.java  |   15 +-
 .../apache/phoenix/schema/types/PVarchar.java   |    2 +-
 .../phoenix/schema/types/PhoenixArray.java      |   55 +-
 .../phoenix/schema/PDataTypeForArraysTest.java  | 1141 ------------------
 .../types/BasePhoenixArrayToStringTest.java     |   81 ++
 ...PrimitiveDoublePhoenixArrayToStringTest.java |   39 +
 ...asePrimitiveIntPhoenixArrayToStringTest.java |   50 +
 .../schema/types/PDataTypeForArraysTest.java    | 1141 ++++++++++++++++++
 .../schema/types/PDateArrayToStringTest.java    |   73 ++
 .../schema/types/PVarcharArrayToStringTest.java |   71 ++
 ...rimitiveBooleanPhoenixArrayToStringTest.java |   50 +
 .../PrimitiveBytePhoenixArrayToStringTest.java  |   34 +
 ...PrimitiveDoublePhoenixArrayToStringTest.java |   36 +
 .../PrimitiveFloatPhoenixArrayToStringTest.java |   36 +
 .../PrimitiveIntPhoenixArrayToStringTest.java   |   20 +
 .../PrimitiveLongPhoenixArrayToStringTest.java  |   35 +
 .../PrimitiveShortPhoenixArrayToStringTest.java |   36 +
 19 files changed, 1885 insertions(+), 1170 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/45b1d4b8/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
index d7dce54..4b79142 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java
@@ -51,6 +51,7 @@ import com.google.common.primitives.Floats;
 public class ArrayIT extends BaseClientManagedTimeIT {
 
 	private static final String SIMPLE_TABLE_WITH_ARRAY = "SIMPLE_TABLE_WITH_ARRAY";
+    private static final String TABLE_WITH_ALL_ARRAY_TYPES = "TABLE_WITH_ALL_ARRAY_TYPES";
 
     private static void initTablesWithArrays(String tenantId, Date date, Long ts, boolean useNull, String url) throws Exception {
         Properties props = new Properties();
@@ -159,6 +160,7 @@ public class ArrayIT extends BaseClientManagedTimeIT {
 					doubleArr);
 			PhoenixArray resultArray = (PhoenixArray) rs.getArray(1);
 			assertEquals(resultArray, array);
+            assertEquals("[25.343, 36.763, 37.56, 386.63]", rs.getString(1));
 			assertEquals(rs.getString("B_string"), B_VALUE);
 			assertTrue(Floats.compare(rs.getFloat(3), 0.01f) == 0);
 			assertFalse(rs.next());
@@ -206,6 +208,7 @@ public class ArrayIT extends BaseClientManagedTimeIT {
 			array = conn.createArrayOf("DOUBLE", doubleArr);
 			Array resultArray = rs.getArray(1);
 			assertEquals(resultArray, array);
+            assertEquals("[25.343, 36.763, 37.56, 386.63]", rs.getString(1));
 			assertEquals(rs.getString("B_string"), B_VALUE);
 			assertTrue(Floats.compare(rs.getFloat(3), 0.01f) == 0);
 			assertFalse(rs.next());
@@ -248,6 +251,7 @@ public class ArrayIT extends BaseClientManagedTimeIT {
 			array = conn.createArrayOf("DOUBLE", doubleArr);
 			Array resultArray = rs.getArray(1);
 			assertEquals(resultArray, array);
+            assertEquals("[25.343, 36.763, 37.56, 386.63]", rs.getString(1));
 			assertEquals(rs.getString("B_string"), B_VALUE);
 			assertTrue(Floats.compare(rs.getFloat(3), 0.01f) == 0);
 			assertFalse(rs.next());
@@ -280,6 +284,7 @@ public class ArrayIT extends BaseClientManagedTimeIT {
 			Array array = conn.createArrayOf("VARCHAR", strArr);
 			PhoenixArray resultArray = (PhoenixArray) rs.getArray(1);
 			assertEquals(resultArray, array);
+            assertEquals("['ABC', 'CEDF', 'XYZWER', 'AB']", rs.getString(1));
 			assertFalse(rs.next());
 		} finally {
 			conn.close();
@@ -654,6 +659,7 @@ public class ArrayIT extends BaseClientManagedTimeIT {
             intArr[2] = 1;
             Array resultArr = conn.createArrayOf("INTEGER", intArr);
             assertEquals(resultArr, array);
+            assertEquals("[1, 2, 1]", rs.getString(2));
             assertFalse(rs.next());
         } finally {
             conn.close();
@@ -685,6 +691,10 @@ public class ArrayIT extends BaseClientManagedTimeIT {
             strArr[2] = "b";
             Array resultArr = conn.createArrayOf("VARCHAR", strArr);
             assertEquals(resultArr, array);
+            // since array is var length, last string element is messed up
+            String expectedPrefix = "['abc', 'defgh', 'b";
+            assertTrue("Expected to start with " + expectedPrefix,
+                rs.getString(2).startsWith(expectedPrefix));
             assertFalse(rs.next());
         } finally {
             conn.close();
@@ -719,6 +729,9 @@ public class ArrayIT extends BaseClientManagedTimeIT {
             strArr[5] = "b";
             Array resultArr = conn.createArrayOf("VARCHAR", strArr);
             assertEquals(resultArr, array);
+            String expectedPrefix = "['abc', null, 'bcd', null, null, 'b";
+            assertTrue("Expected to start with " + expectedPrefix,
+                rs.getString(2).startsWith(expectedPrefix));
             assertFalse(rs.next());
         } finally {
             conn.close();
@@ -824,6 +837,7 @@ public class ArrayIT extends BaseClientManagedTimeIT {
         assertTrue(rs.next());
         PhoenixArray strArr = (PhoenixArray)rs.getArray(1);
         assertEquals(array, strArr);
+        assertEquals("['abc', 'def', 'ghi', 'jkll', null, null, null, 'xxx']", rs.getString(1));
         conn.close();
     }
 
@@ -888,6 +902,93 @@ public class ArrayIT extends BaseClientManagedTimeIT {
     }
 
     @Test
+    public void testArraySelectGetString() throws Exception {
+        Connection conn;
+        PreparedStatement stmt;
+        long ts = nextTimestamp();
+        String tenantId = getOrganizationId();
+
+        // create the table
+        createTableWithAllArrayTypes(getUrl(), getDefaultSplits(tenantId), null, ts - 2);
+
+        // populate the table with data
+        Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts));
+        conn = DriverManager.getConnection(getUrl(), props);
+        stmt =
+                conn.prepareStatement("UPSERT INTO "
+                        + TABLE_WITH_ALL_ARRAY_TYPES
+                        + "(ORGANIZATION_ID, ENTITY_ID, BOOLEAN_ARRAY, BYTE_ARRAY, DOUBLE_ARRAY, FLOAT_ARRAY, INT_ARRAY, LONG_ARRAY, SHORT_ARRAY, STRING_ARRAY)\n"
+                        + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
+        stmt.setString(1, tenantId);
+        stmt.setString(2, ROW1);
+        // boolean array
+        Array boolArray = conn.createArrayOf("BOOLEAN", new Boolean[] { true, false });
+        int boolIndex = 3;
+        stmt.setArray(boolIndex, boolArray);
+        // byte array
+        Array byteArray = conn.createArrayOf("TINYINT", new Byte[] { 11, 22 });
+        int byteIndex = 4;
+        stmt.setArray(byteIndex, byteArray);
+        // double array
+        Array doubleArray = conn.createArrayOf("DOUBLE", new Double[] { 67.78, 78.89 });
+        int doubleIndex = 5;
+        stmt.setArray(doubleIndex, doubleArray);
+        // float array
+        Array floatArray = conn.createArrayOf("FLOAT", new Float[] { 12.23f, 45.56f });
+        int floatIndex = 6;
+        stmt.setArray(floatIndex, floatArray);
+        // int array
+        Array intArray = conn.createArrayOf("INTEGER", new Integer[] { 5555, 6666 });
+        int intIndex = 7;
+        stmt.setArray(intIndex, intArray);
+        // long array
+        Array longArray = conn.createArrayOf("BIGINT", new Long[] { 7777777L, 8888888L });
+        int longIndex = 8;
+        stmt.setArray(longIndex, longArray);
+        // short array
+        Array shortArray = conn.createArrayOf("SMALLINT", new Short[] { 333, 444 });
+        int shortIndex = 9;
+        stmt.setArray(shortIndex, shortArray);
+        // create character array
+        Array stringArray = conn.createArrayOf("VARCHAR", new String[] { "a", "b" });
+        int stringIndex = 10;
+        stmt.setArray(stringIndex, stringArray);
+        stmt.execute();
+        conn.commit();
+        conn.close();
+
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 30));
+        conn = DriverManager.getConnection(getUrl(), props);
+        stmt =
+                conn.prepareStatement("SELECT organization_id, entity_id, boolean_array, byte_array, double_array, float_array, int_array, long_array, short_array, string_array FROM "
+                        + TABLE_WITH_ALL_ARRAY_TYPES);
+        analyzeTable(conn, TABLE_WITH_ALL_ARRAY_TYPES);
+
+        ResultSet rs = stmt.executeQuery();
+        assertTrue(rs.next());
+
+        assertEquals(tenantId, rs.getString(1));
+        assertEquals(ROW1, rs.getString(2));
+        
+        assertArrayGetString(rs, boolIndex, boolArray, "true, false");
+        assertArrayGetString(rs, byteIndex, byteArray, "11, 22");
+        assertArrayGetString(rs, doubleIndex, doubleArray, "67.78, 78.89");
+        assertArrayGetString(rs, floatIndex, floatArray, "12.23, 45.56");
+        assertArrayGetString(rs, intIndex, intArray, "5555, 6666");
+        assertArrayGetString(rs, longIndex, longArray, "7777777, 8888888");
+        assertArrayGetString(rs, shortIndex, shortArray, "333, 444");
+        assertArrayGetString(rs, stringIndex, stringArray, "'a', 'b'");
+        conn.close();
+    }
+
+    private void assertArrayGetString(ResultSet rs, int arrayIndex, Array expectedArray, String expectedString)
+            throws SQLException {
+        assertEquals(expectedArray, rs.getArray(arrayIndex));
+        assertEquals("[" + expectedString + "]", rs.getString(arrayIndex));
+    }
+    
+    @Test
     public void testArrayWithCast() throws Exception {
         Connection conn;
         PreparedStatement stmt;
@@ -917,6 +1018,7 @@ public class ArrayIT extends BaseClientManagedTimeIT {
         array = conn.createArrayOf("DOUBLE", d);
         PhoenixArray arr = (PhoenixArray)rs.getArray(1);
         assertEquals(array, arr);
+        assertEquals("[1.0, 2.0]", rs.getString(1));
         conn.close();
     }
 
@@ -951,6 +1053,7 @@ public class ArrayIT extends BaseClientManagedTimeIT {
         String[] array3 = (String[])arr.getArray();
         assertEquals(array2[0], array3[0]);
         assertEquals(array2[1], array3[1]);
+        assertEquals("['1', '2']", rs.getString(1));
         conn.close();
     }
 
@@ -1018,6 +1121,7 @@ public class ArrayIT extends BaseClientManagedTimeIT {
 			Array array = conn.createArrayOf("DOUBLE", doubleArr);
 			PhoenixArray resultArray = (PhoenixArray) rs.getArray(1);
 			assertEquals(resultArray, array);
+            assertEquals("[25.343, 36.763, 37.56, 386.63]", rs.getString(1));
 			assertFalse(rs.next());
 		} finally {
 			conn.close();
@@ -1657,7 +1761,26 @@ public class ArrayIT extends BaseClientManagedTimeIT {
         }
 
     }
-
+    
+    private static void createTableWithAllArrayTypes(String url, byte[][] bs, Object object,
+            long ts) throws SQLException {
+        String ddlStmt = "create table "
+                + TABLE_WITH_ALL_ARRAY_TYPES
+                + "   (organization_id char(15) not null, \n"
+                + "    entity_id char(15) not null,\n"
+                + "    boolean_array boolean array,\n"
+                + "    byte_array tinyint array,\n"
+                + "    double_array double array[],\n"
+                + "    float_array float array,\n"
+                + "    int_array integer array,\n"
+                + "    long_array bigint[5],\n"
+                + "    short_array smallint array,\n"
+                + "    string_array varchar(100) array[3],\n"
+                + "    CONSTRAINT pk PRIMARY KEY (organization_id, entity_id)\n"
+                + ")";
+        BaseTest.createTestTable(url, ddlStmt, bs, ts);
+    }
+    
     static void createTableWithArray(String url, byte[][] bs, Object object,
 			long ts) throws SQLException {
 		String ddlStmt = "create table "

http://git-wip-us.apache.org/repos/asf/phoenix/blob/45b1d4b8/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PDataType.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PDataType.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PDataType.java
index e8654ff..60d2020 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PDataType.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PDataType.java
@@ -1095,12 +1095,19 @@ public abstract class PDataType<T> implements DataType<T>, Comparable<PDataType<
     return toStringLiteral(o, formatter);
   }
   
-  public String toStringLiteral(Object o, Format formatter) {
-      if (formatter != null) {
-          return formatter.format(o);
+    public String toStringLiteral(Object o, Format formatter) {
+        if (formatter != null) {
+            return formatter.format(o);
+        } else if (null == o) {
+            return String.valueOf(o);
         }
         return o.toString();
-  }
+    }
+
+    public String toStringLiteral(Object o) {
+        // use default formatter when one is unspecified
+        return toStringLiteral(o, null);
+    }
 
   private static final PhoenixArrayFactory DEFAULT_ARRAY_FACTORY = new PhoenixArrayFactory() {
     @Override public PhoenixArray newArray(PDataType type, Object[] elements) {

http://git-wip-us.apache.org/repos/asf/phoenix/blob/45b1d4b8/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PDate.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PDate.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PDate.java
index b926afb..947c30e 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PDate.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PDate.java
@@ -148,14 +148,15 @@ public class PDate extends PDataType<Date> {
   }
 
   @Override
-  public String toStringLiteral(Object o, Format formatter) {
-      if (formatter == null) {
-          // If default formatter has not been overridden,
-          // use default one.
-          formatter = DateUtil.DEFAULT_DATE_FORMATTER;
+    public String toStringLiteral(Object o, Format formatter) {
+        if (formatter == null) {
+            // If default formatter has not been overridden,
+            // use default one.
+            formatter = DateUtil.DEFAULT_DATE_FORMATTER;
         }
-        return "'" + StringUtil.escapeStringConstant(super.toStringLiteral(o, formatter)) + "'";
-  }
+        return null == o ? String.valueOf(o) : "'"
+                + StringUtil.escapeStringConstant(super.toStringLiteral(o, formatter)) + "'";
+    }
 
   @Override
   public void coerceBytes(ImmutableBytesWritable ptr, Object object, PDataType actualType,

http://git-wip-us.apache.org/repos/asf/phoenix/blob/45b1d4b8/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PVarchar.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PVarchar.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PVarchar.java
index 9883e12..fa3dbad 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PVarchar.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PVarchar.java
@@ -143,7 +143,7 @@ public class PVarchar extends PDataType<String> {
     if (formatter != null) {
       return "'" + formatter.format(o) + "'";
     }
-    return "'" + StringUtil.escapeStringConstant(o.toString()) + "'";
+    return null == o ? String.valueOf(o) : "'" + StringUtil.escapeStringConstant(o.toString()) + "'";
   }
 
   private char[] sampleChars = new char[1];

http://git-wip-us.apache.org/repos/asf/phoenix/blob/45b1d4b8/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PhoenixArray.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PhoenixArray.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PhoenixArray.java
index dcfb2c3..982834d 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PhoenixArray.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PhoenixArray.java
@@ -29,11 +29,16 @@ import org.apache.phoenix.util.SQLCloseable;
  * java.sql.Array implementation for Phoenix
  */
 public class PhoenixArray implements Array,SQLCloseable {
+	private static final String TO_STRING_SEPARATOR = ", ";
+	private static final String TO_STRING_END = "]";
+	private static final String TO_STRING_BEGIN = "[";
+	
 	PDataType baseType;
 	Object array;
 	int numElements;
 	Integer maxLength;
-  protected int hashCode = Integer.MIN_VALUE;
+	protected int hashCode = Integer.MIN_VALUE;
+
 	public PhoenixArray() {
 		// empty constructor
 	}
@@ -227,6 +232,23 @@ public class PhoenixArray implements Array,SQLCloseable {
 		return this.baseType.toBytes(((Object[])array)[pos]);
 	}
 	
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder(TO_STRING_BEGIN);
+        boolean isFirst = true;
+        for (int i = 0; i < getDimensions(); i++) {
+            Object o = getElement(i);
+            if (isFirst) {
+                isFirst = false;
+            } else {
+                sb.append(TO_STRING_SEPARATOR);
+            }
+            sb.append(this.baseType.toStringLiteral(o));
+        }
+        sb.append(TO_STRING_END);
+        return sb.toString();
+    }
+	
 	public boolean isNull(int pos) {
 	    if(this.baseType.toBytes(((Object[])array)[pos]).length == 0) {
 	        return true;
@@ -263,18 +285,19 @@ public class PhoenixArray implements Array,SQLCloseable {
 		public PrimitiveIntPhoenixArray(PDataType dataType, Object[] elements) {
 			super(dataType, elements);
 		}
+
 		@Override
-		public Object convertObjectArrayToPrimitiveArray(Object[] elements) {
-			intArr = new int[elements.length];
-			int i = 0;
-			for(Object o : elements) {
-			    if (o != null) {
-			        intArr[i] = (Integer)o;
-			    }
-			    i++;
-			}
-      return intArr;
-		}
+        public Object convertObjectArrayToPrimitiveArray(Object[] elements) {
+            intArr = new int[elements.length];
+            int i = 0;
+            for (Object o : elements) {
+                if (o != null) {
+                    intArr[i] = (Integer) o;
+                }
+                i++;
+            }
+            return intArr;
+        }
 		
 		@Override
         public int estimateByteSize(int pos) {
@@ -340,7 +363,7 @@ public class PhoenixArray implements Array,SQLCloseable {
         public byte[] toBytes(int pos) {
 			return this.baseType.toBytes(shortArr[pos]);
 		}
-		
+
 		@Override
 		public boolean equals(Object obj) {
       if (obj == null) return false;
@@ -394,7 +417,7 @@ public class PhoenixArray implements Array,SQLCloseable {
         public byte[] toBytes(int pos) {
 			return this.baseType.toBytes(longArr[pos]);
 		}
-		
+
 		@Override
 		public boolean equals(Object obj) {
       if (obj == null) return false;
@@ -449,7 +472,7 @@ public class PhoenixArray implements Array,SQLCloseable {
         public byte[] toBytes(int pos) {
 			return this.baseType.toBytes(doubleArr[pos]);
 		}
-		
+
 		@Override
 		public boolean equals(Object obj) {
       if (obj == null) return false;
@@ -504,7 +527,7 @@ public class PhoenixArray implements Array,SQLCloseable {
         public byte[] toBytes(int pos) {
 			return this.baseType.toBytes(floatArr[pos]);
 		}
-		
+
 		@Override
 		public boolean equals(Object obj) {
       if (obj == null) return false;

http://git-wip-us.apache.org/repos/asf/phoenix/blob/45b1d4b8/phoenix-core/src/test/java/org/apache/phoenix/schema/PDataTypeForArraysTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/schema/PDataTypeForArraysTest.java b/phoenix-core/src/test/java/org/apache/phoenix/schema/PDataTypeForArraysTest.java
deleted file mode 100644
index d5e5b5b..0000000
--- a/phoenix-core/src/test/java/org/apache/phoenix/schema/PDataTypeForArraysTest.java
+++ /dev/null
@@ -1,1141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.phoenix.schema;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.math.BigDecimal;
-import java.sql.Date;
-import java.sql.Time;
-import java.sql.Timestamp;
-
-import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
-import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.phoenix.schema.types.PArrayDataType;
-import org.apache.phoenix.schema.types.PBoolean;
-import org.apache.phoenix.schema.types.PBooleanArray;
-import org.apache.phoenix.schema.types.PChar;
-import org.apache.phoenix.schema.types.PCharArray;
-import org.apache.phoenix.schema.types.PDate;
-import org.apache.phoenix.schema.types.PDateArray;
-import org.apache.phoenix.schema.types.PDecimal;
-import org.apache.phoenix.schema.types.PDecimalArray;
-import org.apache.phoenix.schema.types.PDouble;
-import org.apache.phoenix.schema.types.PDoubleArray;
-import org.apache.phoenix.schema.types.PFloat;
-import org.apache.phoenix.schema.types.PFloatArray;
-import org.apache.phoenix.schema.types.PInteger;
-import org.apache.phoenix.schema.types.PIntegerArray;
-import org.apache.phoenix.schema.types.PLong;
-import org.apache.phoenix.schema.types.PLongArray;
-import org.apache.phoenix.schema.types.PSmallint;
-import org.apache.phoenix.schema.types.PSmallintArray;
-import org.apache.phoenix.schema.types.PTime;
-import org.apache.phoenix.schema.types.PTimeArray;
-import org.apache.phoenix.schema.types.PTimestamp;
-import org.apache.phoenix.schema.types.PTimestampArray;
-import org.apache.phoenix.schema.types.PTinyint;
-import org.apache.phoenix.schema.types.PTinyintArray;
-import org.apache.phoenix.schema.types.PUnsignedDate;
-import org.apache.phoenix.schema.types.PUnsignedDateArray;
-import org.apache.phoenix.schema.types.PUnsignedDouble;
-import org.apache.phoenix.schema.types.PUnsignedDoubleArray;
-import org.apache.phoenix.schema.types.PUnsignedFloat;
-import org.apache.phoenix.schema.types.PUnsignedFloatArray;
-import org.apache.phoenix.schema.types.PUnsignedInt;
-import org.apache.phoenix.schema.types.PUnsignedIntArray;
-import org.apache.phoenix.schema.types.PUnsignedLong;
-import org.apache.phoenix.schema.types.PUnsignedLongArray;
-import org.apache.phoenix.schema.types.PUnsignedSmallint;
-import org.apache.phoenix.schema.types.PUnsignedSmallintArray;
-import org.apache.phoenix.schema.types.PUnsignedTime;
-import org.apache.phoenix.schema.types.PUnsignedTimeArray;
-import org.apache.phoenix.schema.types.PUnsignedTimestamp;
-import org.apache.phoenix.schema.types.PUnsignedTimestampArray;
-import org.apache.phoenix.schema.types.PUnsignedTinyint;
-import org.apache.phoenix.schema.types.PUnsignedTinyintArray;
-import org.apache.phoenix.schema.types.PVarchar;
-import org.apache.phoenix.schema.types.PVarcharArray;
-import org.apache.phoenix.schema.types.PhoenixArray;
-import org.junit.Ignore;
-import org.junit.Test;
-
-public class PDataTypeForArraysTest {
-	@Test
-	public void testForIntegerArray() {
-		Integer[] intArr = new Integer[2];
-		intArr[0] = 1;
-		intArr[1] = 2;
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-        PInteger.INSTANCE, intArr);
-		PIntegerArray.INSTANCE.toObject(arr, PIntegerArray.INSTANCE);
-		byte[] bytes = PIntegerArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PIntegerArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForBooleanArray() {
-		Boolean[] boolArr = new Boolean[2];
-		boolArr[0] = true;
-		boolArr[1] = false;
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PBoolean.INSTANCE, boolArr);
-		PBooleanArray.INSTANCE.toObject(arr, PBooleanArray.INSTANCE);
-		byte[] bytes = PBooleanArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PBooleanArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForVarCharArray() {
-		String[] strArr = new String[2];
-		strArr[0] = "abc";
-		strArr[1] = "klmnop";
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PVarchar.INSTANCE, strArr);
-		byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PVarcharArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-	
-	@Test
-	public void testVarCharArrayWithNullValues1() {
-	    String[] strArr = new String[6];
-        strArr[0] = "abc";
-        strArr[1] = null;
-        strArr[2] = "bcd";
-        strArr[3] = null;
-        strArr[4] = null;
-        strArr[5] = "b";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        PhoenixArray resultArr = (PhoenixArray) PVarcharArray.INSTANCE
-                .toObject(bytes, 0, bytes.length);
-        assertEquals(arr, resultArr);
-	}
-	
-    @Test
-    public void testVarCharArrayWithNullValues2() {
-        String[] strArr = new String[6];
-        strArr[0] = "abc";
-        strArr[1] = null;
-        strArr[2] = "bcd";
-        strArr[3] = null;
-        strArr[4] = "cde";
-        strArr[5] = null;
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        PhoenixArray resultArr = (PhoenixArray) PVarcharArray.INSTANCE.toObject(bytes, 0, bytes.length);
-        assertEquals(arr, resultArr);
-    }
-    
-    @Test
-    public void testVarCharArrayWithNullValues3() {
-        String[] strArr = new String[6];
-        strArr[0] = "abc";
-        strArr[1] = null;
-        strArr[2] = null;
-        strArr[3] = null;
-        strArr[4] = null;
-        strArr[5] = null;
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        PhoenixArray resultArr = (PhoenixArray) PVarcharArray.INSTANCE.toObject(bytes, 0, bytes.length);
-        assertEquals(arr, resultArr);
-    }
-    
-    @Test
-    public void testVarCharArrayWithNullValues4() {
-        String[] strArr = new String[7];
-        strArr[0] = "abc";
-        strArr[1] = null;
-        strArr[2] = null;
-        strArr[3] = null;
-        strArr[4] = null;
-        strArr[5] = null;
-        strArr[6] = "xys";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        PhoenixArray resultArr = (PhoenixArray) PVarcharArray.INSTANCE.toObject(bytes, 0, bytes.length);
-        assertEquals(arr, resultArr);
-    }
-    
-    
-    @Test
-    public void testVarCharArrayWithNullValues5() {
-        String[] strArr = new String[6];
-        strArr[0] = "abc";
-        strArr[1] = "bcd";
-        strArr[2] = "cde";
-        strArr[3] = null;
-        strArr[4] = null;
-        strArr[5] = null;
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        PhoenixArray resultArr = (PhoenixArray) PVarcharArray.INSTANCE.toObject(bytes, 0, bytes.length);
-        assertEquals(arr, resultArr);
-    }
-    
-    @Test
-    public void testVarCharArrayWithNullValues6() {
-        String[] strArr = new String[6];
-        strArr[0] = "abc";
-        strArr[1] = null;
-        strArr[2] = "cde";
-        strArr[3] = "bcd";
-        strArr[4] = null;
-        strArr[5] = null;
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        PhoenixArray resultArr = (PhoenixArray) PVarcharArray.INSTANCE.toObject(bytes, 0, bytes.length);
-        assertEquals(arr, resultArr);
-    }
-    
-    @Test
-    public void testVarCharArrayWithNullValues7() {
-        String[] strArr = new String[6];
-        strArr[0] = null;
-        strArr[1] = "abc";
-        strArr[2] = null;
-        strArr[3] = "bcd";
-        strArr[4] = null;
-        strArr[5] = "cde";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        PhoenixArray resultArr = (PhoenixArray) PVarcharArray.INSTANCE.toObject(bytes, 0, bytes.length);
-        assertEquals(arr, resultArr);
-    }
-
-	@Test
-	public void testForCharArray() {
-		String[] strArr = new String[2];
-		strArr[0] = "a";
-		strArr[1] = "d";
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PChar.INSTANCE, strArr);
-		byte[] bytes = PCharArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PCharArray.INSTANCE.toObject(
-				bytes, 0, bytes.length, PCharArray.INSTANCE, null, 1, null);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForLongArray() {
-		Long[] longArr = new Long[2];
-		longArr[0] = 1l;
-		longArr[1] = 2l;
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PLong.INSTANCE, longArr);
-		PLongArray.INSTANCE.toObject(arr, PLongArray.INSTANCE);
-		byte[] bytes = PLongArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PLongArray.INSTANCE.toObject(
-				bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForSmallIntArray() {
-		Short[] shortArr = new Short[2];
-		shortArr[0] = 1;
-		shortArr[1] = 2;
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PSmallint.INSTANCE, shortArr);
-		PSmallintArray.INSTANCE.toObject(arr, PSmallintArray.INSTANCE);
-		byte[] bytes = PSmallintArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PSmallintArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForVarCharArrayForOddNumber() {
-		String[] strArr = new String[3];
-		strArr[0] = "abx";
-		strArr[1] = "ereref";
-		strArr[2] = "random";
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PVarchar.INSTANCE, strArr);
-		byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PVarcharArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-    @Test
-    public void testForVarCharArrayOneElement() {
-        String[] strArr = new String[1];
-        strArr[0] = "ereref";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        PhoenixArray resultArr = (PhoenixArray) PVarcharArray.INSTANCE
-                .toObject(bytes, 0, bytes.length);
-        assertEquals(arr, resultArr);
-    }
-
-    @Test
-    public void testForVarcharArrayWith1ElementInLargerBuffer() {
-        String[] strArr = new String[1];
-        strArr[0] = "abx";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        byte[] moreBytes = new byte[bytes.length + 20];
-        // Generate some garbage
-        for (int i = 0; i < moreBytes.length; i++) {
-            moreBytes[i] = (byte)-i;
-        }
-        System.arraycopy(bytes, 0, moreBytes, 10, bytes.length);
-        PhoenixArray resultArr = (PhoenixArray) PVarcharArray.INSTANCE.toObject(moreBytes, 10, bytes.length);
-        assertEquals(arr, resultArr);
-    }
-    
-    
-	@Test
-	public void testForVarCharArrayForEvenNumberWithIndex() {
-		String[] strArr = new String[5];
-		strArr[0] = "abx";
-		strArr[1] = "ereref";
-		strArr[2] = "random";
-		strArr[3] = "random12";
-		strArr[4] = "ranzzz";
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PVarchar.INSTANCE, strArr);
-		byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-		ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-        PArrayDataType.positionAtArrayElement(ptr, 4, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-		int offset = ptr.getOffset();
-		int length = ptr.getLength();
-		byte[] bs = ptr.get();
-		byte[] res = new byte[length];
-		System.arraycopy(bs, offset, res, 0, length);
-		assertEquals("ranzzz", Bytes.toString(res));
-	}
-	
-    
-    @Test
-    public void testForVarCharArrayWithOneElementIndex() {
-        String[] strArr = new String[1];
-        strArr[0] = "abx";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-        PArrayDataType.positionAtArrayElement(ptr, 0, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-        int offset = ptr.getOffset();
-        int length = ptr.getLength();
-        byte[] bs = ptr.get();
-        byte[] res = new byte[length];
-        System.arraycopy(bs, offset, res, 0, length);
-        assertEquals("abx", Bytes.toString(res));
-    }
-	
-	@Ignore
-	public void testVariableLengthArrayWithElementsMoreThanShortMax() {
-	    String[] strArr = new String[(2 * Short.MAX_VALUE) + 100]; 
-	    for(int i = 0 ; i < (2 * Short.MAX_VALUE) + 100; i++ ) {
-	        String str = "abc";
-	        for(int j = 0 ; j <= i ;j++) {
-	            str += "-";
-	        }
-	        strArr[i] = str;
-	    }
-	    PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-        PArrayDataType.positionAtArrayElement(ptr, 3, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-        int offset = ptr.getOffset();
-        int length = ptr.getLength();
-        byte[] bs = ptr.get();
-        byte[] res = new byte[length];
-        System.arraycopy(bs, offset, res, 0, length);
-        assertEquals("abc---", Bytes.toString(res));
-	}
-	
-	@Test
-	public void testGetArrayLengthForVariableLengthArray() {
-		String[] strArr = new String[5];
-		strArr[0] = "abx";
-		strArr[1] = "ereref";
-		strArr[2] = "random";
-		strArr[3] = "random12";
-		strArr[4] = "ranzzz";
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PVarchar.INSTANCE, strArr);
-		byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-		ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-		int result = PArrayDataType.getArrayLength(ptr, PVarchar.INSTANCE, null);
-		assertEquals(5, result);
-	}
-
-	@Test
-	public void testForVarCharArrayForOddNumberWithIndex() {
-		String[] strArr = new String[5];
-		strArr[0] = "abx";
-		strArr[1] = "ereref";
-		strArr[2] = "random";
-		strArr[3] = "random12";
-		strArr[4] = "ran";
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PVarchar.INSTANCE, strArr);
-		byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-		ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-		PArrayDataType.positionAtArrayElement(ptr, 3, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-		int offset = ptr.getOffset();
-		int length = ptr.getLength();
-		byte[] bs = ptr.get();
-		byte[] res = new byte[length];
-		System.arraycopy(bs, offset, res, 0, length);
-		assertEquals("random12", Bytes.toString(res));
-	}
-
-    @Test
-    public void testPositionSearchWithVarLengthArrayWithNullValue1() {
-        String[] strArr = new String[5];
-        strArr[0] = "abx";
-        strArr[1] = "ereref";
-        strArr[2] = "random";
-        strArr[3] = null;
-        strArr[4] = "ran";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-        PArrayDataType.positionAtArrayElement(ptr, 2, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-        int offset = ptr.getOffset();
-        int length = ptr.getLength();
-        byte[] bs = ptr.get();
-        byte[] res = new byte[length];
-        System.arraycopy(bs, offset, res, 0, length);
-        assertEquals("random", Bytes.toString(res));
-    }
-    
-    @Test
-    public void testPositionSearchWithVarLengthArrayWithNullValue2() {
-        String[] strArr = new String[5];
-        strArr[0] = "abx";
-        strArr[1] = "ereref";
-        strArr[2] = "random";
-        strArr[3] = "random12";
-        strArr[4] = null;
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-        PArrayDataType.positionAtArrayElement(ptr, 2, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-        int offset = ptr.getOffset();
-        int length = ptr.getLength();
-        byte[] bs = ptr.get();
-        byte[] res = new byte[length];
-        System.arraycopy(bs, offset, res, 0, length);
-        assertEquals("random", Bytes.toString(res));
-    }
-    @Test
-    public void testForVarCharArrayForOddNumberWithIndex3() {
-        String[] strArr = new String[5];
-        strArr[0] = "abx";
-        strArr[1] = "ereref";
-        strArr[2] = "random";
-        strArr[3] = "random12";
-        strArr[4] = null;
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-        PArrayDataType.positionAtArrayElement(ptr, 4, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-        int offset = ptr.getOffset();
-        int length = ptr.getLength();
-        byte[] bs = ptr.get();
-        byte[] res = new byte[length];
-        System.arraycopy(bs, offset, res, 0, length);
-        assertEquals("", Bytes.toString(res));
-    }
-    
-    @Test
-    public void testForVarCharArrayForOddNumberWithIndex4() {
-        String[] strArr = new String[5];
-        strArr[0] = "abx";
-        strArr[1] = "ereref";
-        strArr[2] = "random";
-        strArr[3] = null;
-        strArr[4] = null;
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-        PArrayDataType.positionAtArrayElement(ptr, 3, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-        int offset = ptr.getOffset();
-        int length = ptr.getLength();
-        byte[] bs = ptr.get();
-        byte[] res = new byte[length];
-        System.arraycopy(bs, offset, res, 0, length);
-        assertEquals("", Bytes.toString(res));
-    }
-    
-    @Test
-    public void testForVarCharArrayForOddNumberWithIndex5() {
-        String[] strArr = new String[5];
-        strArr[0] = "abx";
-        strArr[1] = "ereref";
-        strArr[2] = "random";
-        strArr[3] = null;
-        strArr[4] = "random12";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-        PArrayDataType.positionAtArrayElement(ptr, 4, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-        int offset = ptr.getOffset();
-        int length = ptr.getLength();
-        byte[] bs = ptr.get();
-        byte[] res = new byte[length];
-        System.arraycopy(bs, offset, res, 0, length);
-        assertEquals("random12", Bytes.toString(res));
-    }
-    
-    @Test
-    public void testForVarCharArrayForOddNumberWithIndex6() {
-        String[] strArr = new String[6];
-        strArr[0] = "abx";
-        strArr[1] = "ereref";
-        strArr[2] = "random";
-        strArr[3] = null;
-        strArr[4] = "random12";
-        strArr[5] = "random17";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-        PArrayDataType.positionAtArrayElement(ptr, 4, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-        int offset = ptr.getOffset();
-        int length = ptr.getLength();
-        byte[] bs = ptr.get();
-        byte[] res = new byte[length];
-        System.arraycopy(bs, offset, res, 0, length);
-        assertEquals("random12", Bytes.toString(res));
-    }
-    @Test
-    public void testPositionSearchWithVarLengthArrayWithNullValue5() {
-        String[] strArr = new String[5];
-        strArr[0] = "abx";
-        strArr[1] = "ereref";
-        strArr[2] = "random";
-        strArr[3] = null;
-        strArr[4] = "ran";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-        PArrayDataType.positionAtArrayElement(ptr, 3, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-        int offset = ptr.getOffset();
-        int length = ptr.getLength();
-        byte[] bs = ptr.get();
-        byte[] res = new byte[length];
-        System.arraycopy(bs, offset, res, 0, length);
-        assertEquals("", Bytes.toString(res));
-    }
-    
-    @Test
-    public void testPositionSearchWithVarLengthArrayWithNullValueAtTheStart1() {
-        String[] strArr = new String[5];
-        strArr[0] = null;
-        strArr[1] = "ereref";
-        strArr[2] = "random";
-        strArr[3] = null;
-        strArr[4] = "ran";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-        PArrayDataType.positionAtArrayElement(ptr, 3, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-        int offset = ptr.getOffset();
-        int length = ptr.getLength();
-        byte[] bs = ptr.get();
-        byte[] res = new byte[length];
-        System.arraycopy(bs, offset, res, 0, length);
-        assertEquals("", Bytes.toString(res));
-    }
-    
-    @Test
-    public void testPositionSearchWithVarLengthArrayWithNullValueAtTheStart2() {
-        String[] strArr = new String[5];
-        strArr[0] = null;
-        strArr[1] = "ereref";
-        strArr[2] = "random";
-        strArr[3] = null;
-        strArr[4] = "ran";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-        PArrayDataType.positionAtArrayElement(ptr, 0, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-        int offset = ptr.getOffset();
-        int length = ptr.getLength();
-        byte[] bs = ptr.get();
-        byte[] res = new byte[length];
-        System.arraycopy(bs, offset, res, 0, length);
-        assertEquals("", Bytes.toString(res));
-    }
-    
-    @Test
-    public void testPositionSearchWithVarLengthArrayWithNullValueAtTheStart3() {
-        String[] strArr = new String[5];
-        strArr[0] = null;
-        strArr[1] = "ereref";
-        strArr[2] = "random";
-        strArr[3] = null;
-        strArr[4] = "ran";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-        PArrayDataType.positionAtArrayElement(ptr, 4, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-        int offset = ptr.getOffset();
-        int length = ptr.getLength();
-        byte[] bs = ptr.get();
-        byte[] res = new byte[length];
-        System.arraycopy(bs, offset, res, 0, length);
-        assertEquals("ran", Bytes.toString(res));
-    }
-    
-    @Test
-    public void testPositionSearchWithVarLengthArrayWithAllNulls() {
-        String[] strArr = new String[5];
-        strArr[0] = null;
-        strArr[1] = null;
-        strArr[2] = null;
-        strArr[3] = null;
-        strArr[4] = null;
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-        PArrayDataType.positionAtArrayElement(ptr, 4, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-        int offset = ptr.getOffset();
-        int length = ptr.getLength();
-        byte[] bs = ptr.get();
-        byte[] res = new byte[length];
-        System.arraycopy(bs, offset, res, 0, length);
-        assertEquals("", Bytes.toString(res));
-    }
-
-	@Test
-	public void testForVarCharArrayForOneElementArrayWithIndex() {
-		String[] strArr = new String[1];
-		strArr[0] = "abx";
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PVarchar.INSTANCE, strArr);
-		byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-		ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-		PArrayDataType.positionAtArrayElement(ptr, 0, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-		int offset = ptr.getOffset();
-		int length = ptr.getLength();
-		byte[] bs = ptr.get();
-		byte[] res = new byte[length];
-		System.arraycopy(bs, offset, res, 0, length);
-		assertEquals("abx", Bytes.toString(res));
-	}
-
-	@Test
-	public void testForVarCharArrayForWithTwoelementsElementArrayWithIndex() {
-		String[] strArr = new String[2];
-		strArr[0] = "abx";
-		strArr[1] = "ereref";
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PVarchar.INSTANCE, strArr);
-		byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-		ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-		PArrayDataType.positionAtArrayElement(ptr, 1, PVarchar.INSTANCE, PVarchar.INSTANCE.getByteSize());
-		int offset = ptr.getOffset();
-		int length = ptr.getLength();
-		byte[] bs = ptr.get();
-		byte[] res = new byte[length];
-		System.arraycopy(bs, offset, res, 0, length);
-		assertEquals("ereref", Bytes.toString(res));
-	}
-
-	@Test
-	public void testLongArrayWithIndex() {
-		Long[] longArr = new Long[4];
-		longArr[0] = 1l;
-		longArr[1] = 2l;
-		longArr[2] = 4l;
-		longArr[3] = 5l;
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PLong.INSTANCE, longArr);
-		PLongArray.INSTANCE.toObject(arr, PLongArray.INSTANCE);
-		byte[] bytes = PLongArray.INSTANCE.toBytes(arr);
-		ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-		PArrayDataType.positionAtArrayElement(ptr, 2, PLong.INSTANCE, PLong.INSTANCE.getByteSize());
-		int offset = ptr.getOffset();
-		int length = ptr.getLength();
-		byte[] bs = ptr.get();
-		byte[] res = new byte[length];
-		System.arraycopy(bs, offset, res, 0, length);
-		long result = (Long) PLong.INSTANCE.toObject(res);
-		assertEquals(4l, result);
-	}
-	
-	@Test
-	public void testGetArrayLengthForFixedLengthArray() {
-		Long[] longArr = new Long[4];
-		longArr[0] = 1l;
-		longArr[1] = 2l;
-		longArr[2] = 4l;
-		longArr[3] = 5l;
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PLong.INSTANCE, longArr);
-		PLongArray.INSTANCE.toObject(arr, PLongArray.INSTANCE);
-		byte[] bytes = PLongArray.INSTANCE.toBytes(arr);
-		ImmutableBytesWritable ptr = new ImmutableBytesWritable(bytes);
-		int length = PArrayDataType.getArrayLength(ptr, PLong.INSTANCE, null);
-		assertEquals(4, length);
-	}
-
-	@Test
-	public void testForVarcharArrayBiggerArraysNumber() {
-		String[] strArr = new String[101];
-		for (int i = 0; i <= 100; i++) {
-			strArr[i] = "abc" + i;
-		}
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PVarchar.INSTANCE, strArr);
-		byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PVarcharArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForTinyIntArray() {
-		Byte[] byteArr = new Byte[2];
-		byteArr[0] = 1;
-		byteArr[1] = 2;
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PTinyint.INSTANCE, byteArr);
-		PTinyintArray.INSTANCE.toObject(arr, PTinyintArray.INSTANCE);
-		byte[] bytes = PTinyintArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PTinyintArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForFloatArray() {
-		Float[] floatArr = new Float[2];
-		floatArr[0] = 1.06f;
-		floatArr[1] = 2.89f;
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PFloat.INSTANCE, floatArr);
-		PFloatArray.INSTANCE.toObject(arr, PFloatArray.INSTANCE);
-		byte[] bytes = PFloatArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PFloatArray.INSTANCE.toObject(
-				bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForDoubleArray() {
-		Double[] doubleArr = new Double[2];
-		doubleArr[0] = 1.06;
-		doubleArr[1] = 2.89;
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PDouble.INSTANCE, doubleArr);
-		PDoubleArray.INSTANCE.toObject(arr, PDoubleArray.INSTANCE);
-		byte[] bytes = PDoubleArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PDoubleArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForDecimalArray() {
-		BigDecimal[] bigDecimalArr = new BigDecimal[2];
-		bigDecimalArr[0] = new BigDecimal(89997);
-		bigDecimalArr[1] = new BigDecimal(8999.995f);
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PDecimal.INSTANCE, bigDecimalArr);
-		PDecimalArray.INSTANCE.toObject(arr, PDecimalArray.INSTANCE);
-		byte[] bytes = PDecimalArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PDecimalArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForTimeStampArray() {
-		Timestamp[] timeStampArr = new Timestamp[2];
-		timeStampArr[0] = new Timestamp(System.currentTimeMillis());
-		timeStampArr[1] = new Timestamp(900000l);
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PTimestamp.INSTANCE, timeStampArr);
-		PTimestampArray.INSTANCE.toObject(arr, PTimestampArray.INSTANCE);
-		byte[] bytes = PTimestampArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PTimestampArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForUnSignedTimeStampArray() {
-		Timestamp[] timeStampArr = new Timestamp[2];
-		timeStampArr[0] = new Timestamp(System.currentTimeMillis());
-		timeStampArr[1] = new Timestamp(900000l);
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PUnsignedTimestamp.INSTANCE, timeStampArr);
-		PUnsignedTimestampArray.INSTANCE.toObject(arr,
-				PUnsignedTimestampArray.INSTANCE);
-		byte[] bytes = PUnsignedTimestampArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PUnsignedTimestampArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForTimeArray() {
-		Time[] timeArr = new Time[2];
-		timeArr[0] = new Time(System.currentTimeMillis());
-		timeArr[1] = new Time(900000l);
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-        PTime.INSTANCE, timeArr);
-		PTimeArray.INSTANCE.toObject(arr, PTimeArray.INSTANCE);
-		byte[] bytes = PTimeArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PTimeArray.INSTANCE.toObject(
-				bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForUnsignedTimeArray() {
-		Time[] timeArr = new Time[2];
-		timeArr[0] = new Time(System.currentTimeMillis());
-		timeArr[1] = new Time(900000l);
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PUnsignedTime.INSTANCE, timeArr);
-		PUnsignedTimeArray.INSTANCE.toObject(arr,
-				PUnsignedTimeArray.INSTANCE);
-		byte[] bytes = PUnsignedTimeArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PUnsignedTimeArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForDateArray() {
-		Date[] dateArr = new Date[2];
-		dateArr[0] = new Date(System.currentTimeMillis());
-		dateArr[1] = new Date(System.currentTimeMillis()
-				+ System.currentTimeMillis());
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-        PDate.INSTANCE, dateArr);
-		PDateArray.INSTANCE.toObject(arr, PDateArray.INSTANCE);
-		byte[] bytes = PDateArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PDateArray.INSTANCE.toObject(
-				bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForUnSignedDateArray() {
-		Date[] dateArr = new Date[2];
-		dateArr[0] = new Date(System.currentTimeMillis());
-		dateArr[1] = new Date(System.currentTimeMillis()
-				+ System.currentTimeMillis());
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PUnsignedDate.INSTANCE, dateArr);
-		PUnsignedDateArray.INSTANCE.toObject(arr,
-				PUnsignedDateArray.INSTANCE);
-		byte[] bytes = PUnsignedDateArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PUnsignedDateArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForUnSignedLongArray() {
-		Long[] longArr = new Long[2];
-		longArr[0] = 1l;
-		longArr[1] = 2l;
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PUnsignedLong.INSTANCE, longArr);
-		PUnsignedLongArray.INSTANCE.toObject(arr,
-				PUnsignedLongArray.INSTANCE);
-		byte[] bytes = PUnsignedLongArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PUnsignedLongArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForUnSignedIntArray() {
-		Integer[] intArr = new Integer[2];
-		intArr[0] = 1;
-		intArr[1] = 2;
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PUnsignedInt.INSTANCE, intArr);
-		PUnsignedIntArray.INSTANCE
-				.toObject(arr, PUnsignedIntArray.INSTANCE);
-		byte[] bytes = PUnsignedIntArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PUnsignedIntArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForUnSignedSmallIntArray() {
-		Short[] shortArr = new Short[2];
-		shortArr[0] = 1;
-		shortArr[1] = 2;
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PUnsignedSmallint.INSTANCE, shortArr);
-		PUnsignedSmallintArray.INSTANCE.toObject(arr,
-				PUnsignedSmallintArray.INSTANCE);
-		byte[] bytes = PUnsignedSmallintArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PUnsignedSmallintArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForUnSignedTinyIntArray() {
-		Byte[] byteArr = new Byte[2];
-		byteArr[0] = 1;
-		byteArr[1] = 2;
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PUnsignedTinyint.INSTANCE, byteArr);
-		PUnsignedTinyintArray.INSTANCE.toObject(arr,
-				PUnsignedTinyintArray.INSTANCE);
-		byte[] bytes = PUnsignedTinyintArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PUnsignedTinyintArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForUnSignedFloatArray() {
-		Float[] floatArr = new Float[2];
-		floatArr[0] = 1.9993f;
-		floatArr[1] = 2.786f;
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PUnsignedFloat.INSTANCE, floatArr);
-		PUnsignedFloatArray.INSTANCE.toObject(arr,
-				PUnsignedFloatArray.INSTANCE);
-		byte[] bytes = PUnsignedFloatArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PUnsignedFloatArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-	@Test
-	public void testForUnSignedDoubleArray() {
-		Double[] doubleArr = new Double[2];
-		doubleArr[0] = 1.9993;
-		doubleArr[1] = 2.786;
-		PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-				PUnsignedDouble.INSTANCE, doubleArr);
-		PUnsignedDoubleArray.INSTANCE.toObject(arr,
-				PUnsignedDoubleArray.INSTANCE);
-		byte[] bytes = PUnsignedDoubleArray.INSTANCE.toBytes(arr);
-		PhoenixArray resultArr = (PhoenixArray) PUnsignedDoubleArray.INSTANCE
-				.toObject(bytes, 0, bytes.length);
-		assertEquals(arr, resultArr);
-	}
-
-    @Test
-    public void testForArrayComparisionsForFixedWidth() {
-        Double[] doubleArr = new Double[2];
-        doubleArr[0] = 1.9993;
-        doubleArr[1] = 2.786;
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(PUnsignedDouble.INSTANCE, doubleArr);
-        PUnsignedDoubleArray.INSTANCE.toObject(arr, PUnsignedDoubleArray.INSTANCE);
-        byte[] bytes1 = PUnsignedDoubleArray.INSTANCE.toBytes(arr);
-
-        doubleArr = new Double[2];
-        doubleArr[0] = 1.9993;
-        doubleArr[1] = 2.786;
-        arr = PArrayDataType.instantiatePhoenixArray(PUnsignedDouble.INSTANCE, doubleArr);
-        PUnsignedDoubleArray.INSTANCE.toObject(arr, PUnsignedDoubleArray.INSTANCE);
-        byte[] bytes2 = PUnsignedDoubleArray.INSTANCE.toBytes(arr);
-        assertTrue(Bytes.equals(bytes1, bytes2));
-    }
-
-    @Test
-    public void testForArrayComparisionsWithInEqualityForFixedWidth() {
-        Double[] doubleArr = new Double[2];
-        doubleArr[0] = 1.9993;
-        doubleArr[1] = 2.786;
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(PUnsignedDouble.INSTANCE, doubleArr);
-        PUnsignedDoubleArray.INSTANCE.toObject(arr, PUnsignedDoubleArray.INSTANCE);
-        byte[] bytes1 = PUnsignedDoubleArray.INSTANCE.toBytes(arr);
-
-        doubleArr = new Double[3];
-        doubleArr[0] = 1.9993;
-        doubleArr[1] = 2.786;
-        doubleArr[2] = 6.3;
-        arr = PArrayDataType.instantiatePhoenixArray(PUnsignedDouble.INSTANCE, doubleArr);
-        PUnsignedDoubleArray.INSTANCE.toObject(arr, PUnsignedDoubleArray.INSTANCE);
-        byte[] bytes2 = PUnsignedDoubleArray.INSTANCE.toBytes(arr);
-        assertTrue(Bytes.compareTo(bytes1, bytes2) < 0);
-    }
-
-    @Test
-    public void testForArrayComparisonsForVarWidthArrays() {
-        String[] strArr = new String[5];
-        strArr[0] = "abc";
-        strArr[1] = "ereref";
-        strArr[2] = "random";
-        strArr[3] = "random1";
-        strArr[4] = "ran";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(PVarchar.INSTANCE, strArr);
-        byte[] bytes1 = PVarcharArray.INSTANCE.toBytes(arr);
-
-        strArr = new String[5];
-        strArr[0] = "abc";
-        strArr[1] = "ereref";
-        strArr[2] = "random";
-        strArr[3] = "random1";
-        strArr[4] = "ran";
-        arr = PArrayDataType.instantiatePhoenixArray(PVarchar.INSTANCE, strArr);
-        byte[] bytes2 = PVarcharArray.INSTANCE.toBytes(arr);
-        assertTrue(Bytes.equals(bytes1, bytes2));
-    }
-
-    @Test
-    public void testForArrayComparisonsInEqualityForVarWidthArrays() {
-        String[] strArr = new String[5];
-        strArr[0] = "abc";
-        strArr[1] = "ereref";
-        strArr[2] = "random";
-        strArr[3] = "random1";
-        strArr[4] = "ran";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(PVarchar.INSTANCE, strArr);
-        byte[] bytes1 = PVarcharArray.INSTANCE.toBytes(arr);
-
-        strArr = new String[5];
-        strArr[0] = "abc";
-        strArr[1] = "ereref";
-        strArr[2] = "random";
-        strArr[3] = "random1";
-        arr = PArrayDataType.instantiatePhoenixArray(PVarchar.INSTANCE, strArr);
-        byte[] bytes2 = PVarcharArray.INSTANCE.toBytes(arr);
-        assertTrue(Bytes.compareTo(bytes1, bytes2) > 0);
-    }
-
-    @Test
-    public void testForArrayComparsionInEqualityWithNullsRepeatingInTheMiddle() {
-        String[] strArr = new String[6];
-        strArr[0] = null;
-        strArr[1] = "ereref";
-        strArr[2] = "random";
-        strArr[3] = null;
-        strArr[4] = "ran";
-        strArr[5] = "ran";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(PVarchar.INSTANCE, strArr);
-        byte[] bytes1 = PVarcharArray.INSTANCE.toBytes(arr);
-
-        strArr = new String[6];
-        strArr[0] = null;
-        strArr[1] = "ereref";
-        strArr[2] = "random";
-        strArr[3] = null;
-        strArr[4] = null;
-        strArr[5] = "ran";
-        arr = PArrayDataType.instantiatePhoenixArray(PVarchar.INSTANCE, strArr);
-        byte[] bytes2 = PVarcharArray.INSTANCE.toBytes(arr);
-        assertTrue(Bytes.compareTo(bytes1, bytes2) > 0);
-    }
-    
-    @Test
-    public void testVarCharArrayWithGreatherThan255NullsInMiddle() {
-        String strArr[] = new String[300];
-        strArr[0] = "abc";
-        strArr[1] = "bcd";
-        strArr[2] = null;
-        strArr[3] = null;
-        strArr[4] = "bcd";
-        for(int i = 5; i < strArr.length - 2; i++) {
-            strArr[i] = null;
-        }
-        strArr[strArr.length - 1] = "abc";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes = PVarcharArray.INSTANCE.toBytes(arr);
-        PhoenixArray resultArr = (PhoenixArray) PVarcharArray.INSTANCE
-                .toObject(bytes, 0, bytes.length);
-        assertEquals(arr, resultArr);
-    }
-    
-    @Test
-    public void testVarCharArrayComparisonWithGreaterThan255NullsinMiddle() {
-        String strArr[] = new String[240];
-        strArr[0] = "abc";
-        strArr[1] = "bcd";
-        strArr[2] = null;
-        strArr[3] = null;
-        strArr[4] = "bcd";
-        strArr[strArr.length - 1] = "abc";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes1 = PVarcharArray.INSTANCE.toBytes(arr);
-        
-        strArr = new String[16];
-        strArr[0] = "abc";
-        strArr[1] = "bcd";
-        strArr[2] = null;
-        strArr[3] = null;
-        strArr[4] = "bcd";
-        strArr[strArr.length - 1] = "abc";
-        arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes2 = PVarcharArray.INSTANCE.toBytes(arr);
-        assertTrue(Bytes.compareTo(bytes1, bytes2) < 0);
-    }
-    
-    @Test
-    public void testVarCharArrayComparisonWithGreaterThan255NullsinMiddle1() {
-        String strArr[] = new String[500];
-        strArr[0] = "abc";
-        strArr[1] = "bcd";
-        strArr[2] = null;
-        strArr[3] = null;
-        strArr[4] = "bcd";
-        strArr[strArr.length - 1] = "abc";
-        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes1 = PVarcharArray.INSTANCE.toBytes(arr);
-        
-        strArr = new String[500];
-        strArr[0] = "abc";
-        strArr[1] = "bcd";
-        strArr[2] = null;
-        strArr[3] = null;
-        strArr[4] = "bcd";
-        strArr[strArr.length - 1] = "abc";
-        arr = PArrayDataType.instantiatePhoenixArray(
-                PVarchar.INSTANCE, strArr);
-        byte[] bytes2 = PVarcharArray.INSTANCE.toBytes(arr);
-        assertTrue(Bytes.compareTo(bytes1, bytes2) == 0);
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/phoenix/blob/45b1d4b8/phoenix-core/src/test/java/org/apache/phoenix/schema/types/BasePhoenixArrayToStringTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/schema/types/BasePhoenixArrayToStringTest.java b/phoenix-core/src/test/java/org/apache/phoenix/schema/types/BasePhoenixArrayToStringTest.java
new file mode 100644
index 0000000..d67c599
--- /dev/null
+++ b/phoenix-core/src/test/java/org/apache/phoenix/schema/types/BasePhoenixArrayToStringTest.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable
+ * law or agreed to in writing, software distributed under the License is distributed on an "AS IS"
+ * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
+ * for the specific language governing permissions and limitations under the License.
+ */
+package org.apache.phoenix.schema.types;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public abstract class BasePhoenixArrayToStringTest {
+
+    @Test
+    public void testEmptyArray() {
+        helpTestToString(getBaseType(), new Object[] {}, "[]");
+    }
+
+    @Test
+    public void testSingleObjectArray() {
+        helpTestToString(getBaseType(), new Object[] { getElement1() }, "[" + getString1() + "]");
+    }
+
+    @Test
+    public void testMultipleObjectArray() {
+        // Object[] arr = createArray(getBaseJavaType(), 3);
+        // arr[0] = getElement1();
+        // arr[1] = getElement2();
+        // arr[2] = getElement3();
+        helpTestToString(getBaseType(),
+            new Object[] { getElement1(), getElement2(), getElement3() }, "[" + getString1() + ", "
+                    + getString2() + ", " + getString3() + "]");
+    }
+
+    @Test
+    public void testSingleNullObjectArray() {
+        helpTestToString(getBaseType(), new Object[] { null }, "[" + getNullString() + "]");
+    }
+
+    @Test
+    public void testMultipleNullObjectArray() {
+        helpTestToString(getBaseType(), new Object[] { null, null }, "[" + getNullString() + ", "
+                + getNullString() + "]");
+    }
+
+    @Test
+    public void testNormalAndNullObjectArray() {
+        helpTestToString(getBaseType(), new Object[] { null, getElement1(), null, getElement2() },
+            "[" + getNullString() + ", " + getString1() + ", " + getNullString() + ", "
+                    + getString2() + "]");
+    }
+
+    protected abstract PDataType getBaseType();
+
+    protected abstract Object getElement1();
+
+    protected abstract String getString1();
+
+    protected abstract Object getElement2();
+
+    protected abstract String getString2();
+
+    protected abstract Object getElement3();
+
+    protected abstract String getString3();
+
+    protected String getNullString() {
+        return "null";
+    }
+
+    protected void helpTestToString(PDataType type, Object[] array, String expected) {
+        PhoenixArray arr = PArrayDataType.instantiatePhoenixArray(type, array);
+        assertEquals(expected, arr.toString());
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/45b1d4b8/phoenix-core/src/test/java/org/apache/phoenix/schema/types/BasePrimitiveDoublePhoenixArrayToStringTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/schema/types/BasePrimitiveDoublePhoenixArrayToStringTest.java b/phoenix-core/src/test/java/org/apache/phoenix/schema/types/BasePrimitiveDoublePhoenixArrayToStringTest.java
new file mode 100644
index 0000000..7ee7428
--- /dev/null
+++ b/phoenix-core/src/test/java/org/apache/phoenix/schema/types/BasePrimitiveDoublePhoenixArrayToStringTest.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable
+ * law or agreed to in writing, software distributed under the License is distributed on an "AS IS"
+ * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
+ * for the specific language governing permissions and limitations under the License.
+ */
+package org.apache.phoenix.schema.types;
+
+public abstract class BasePrimitiveDoublePhoenixArrayToStringTest extends
+        BasePhoenixArrayToStringTest {
+
+    public BasePrimitiveDoublePhoenixArrayToStringTest() {
+        super();
+    }
+
+    @Override
+    protected String getString1() {
+        return "1.1";
+    }
+
+    @Override
+    protected String getString2() {
+        return "2.2";
+    }
+
+    @Override
+    protected String getString3() {
+        return "3.3";
+    }
+
+    @Override
+    protected String getNullString() {
+        return "0.0";
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/45b1d4b8/phoenix-core/src/test/java/org/apache/phoenix/schema/types/BasePrimitiveIntPhoenixArrayToStringTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/schema/types/BasePrimitiveIntPhoenixArrayToStringTest.java b/phoenix-core/src/test/java/org/apache/phoenix/schema/types/BasePrimitiveIntPhoenixArrayToStringTest.java
new file mode 100644
index 0000000..0f105bc
--- /dev/null
+++ b/phoenix-core/src/test/java/org/apache/phoenix/schema/types/BasePrimitiveIntPhoenixArrayToStringTest.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable
+ * law or agreed to in writing, software distributed under the License is distributed on an "AS IS"
+ * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
+ * for the specific language governing permissions and limitations under the License.
+ */
+package org.apache.phoenix.schema.types;
+
+public abstract class BasePrimitiveIntPhoenixArrayToStringTest extends BasePhoenixArrayToStringTest {
+
+    @Override
+    protected Number getElement1() {
+        return 1;
+    }
+
+    @Override
+    protected String getString1() {
+        return "1";
+    }
+
+    @Override
+    protected Number getElement2() {
+        return 2;
+    }
+
+    @Override
+    protected String getString2() {
+        return "2";
+    }
+
+    @Override
+    protected Number getElement3() {
+        return 3;
+    }
+
+    @Override
+    protected String getString3() {
+        return "3";
+    }
+
+    @Override
+    protected String getNullString() {
+        return "0";
+    }
+
+}
\ No newline at end of file