diff --git a/java/adapter/jdbc/pom.xml b/java/adapter/jdbc/pom.xml index d8dd422ec68..17d2381213a 100644 --- a/java/adapter/jdbc/pom.xml +++ b/java/adapter/jdbc/pom.xml @@ -1,17 +1,18 @@ + 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. --> 4.0.0 + org.apache.arrow arrow-java-root @@ -21,6 +22,7 @@ arrow-jdbc Arrow JDBC Adapter http://maven.apache.org + @@ -36,6 +38,7 @@ arrow-vector ${project.version} + com.google.guava guava @@ -57,82 +60,47 @@ 1.4.196 test + com.fasterxml.jackson.dataformat jackson-dataformat-yaml ${dep.jackson.version} test + com.fasterxml.jackson.core jackson-databind ${dep.jackson.version} test + com.fasterxml.jackson.core jackson-core ${dep.jackson.version} test + com.fasterxml.jackson.core jackson-annotations ${dep.jackson.version} test - - - - - org.jacoco - jacoco-maven-plugin - 0.8.1 - - - - default-prepare-agent - - prepare-agent - - - - ${project.build.directory}/coverage-reports/jacoco-ut.exec - - surefireArgLine - - - - - post-unit-test - test - - report - - - - ${project.build.directory}/coverage-reports/jacoco-ut.exec - - true - ${project.build.directory}/jacoco-ut - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - UTC - - - ${surefireArgLine} - - - - - - + + + + org.apache.maven.plugins + maven-surefire-plugin + + + UTC + + + + + + \ No newline at end of file diff --git a/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrow.java b/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrow.java index 617cbd15339..5a7e1c77b11 100644 --- a/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrow.java +++ b/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrow.java @@ -30,6 +30,8 @@ import java.sql.Statement; import java.sql.ResultSet; import java.util.Calendar; +import java.util.Locale; +import java.util.TimeZone; /** * Utility class to convert JDBC objects to columnar Arrow format objects. @@ -85,7 +87,7 @@ public static VectorSchemaRoot sqlToArrow(Connection connection, String query, B Preconditions.checkArgument(query != null && query.length() > 0, "SQL query can not be null or empty"); Preconditions.checkNotNull(allocator, "Memory allocator object can not be null"); - return sqlToArrow(connection, query, allocator, Calendar.getInstance()); + return sqlToArrow(connection, query, allocator, Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.ROOT)); } /** @@ -121,7 +123,7 @@ public static VectorSchemaRoot sqlToArrow(Connection connection, String query, B public static VectorSchemaRoot sqlToArrow(ResultSet resultSet) throws SQLException, IOException { Preconditions.checkNotNull(resultSet, "JDBC ResultSet object can not be null"); - return sqlToArrow(resultSet, Calendar.getInstance()); + return sqlToArrow(resultSet, Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.ROOT)); } /** @@ -136,7 +138,7 @@ public static VectorSchemaRoot sqlToArrow(ResultSet resultSet, BaseAllocator all Preconditions.checkNotNull(resultSet, "JDBC ResultSet object can not be null"); Preconditions.checkNotNull(allocator, "Memory Allocator object can not be null"); - return sqlToArrow(resultSet, allocator, Calendar.getInstance()); + return sqlToArrow(resultSet, allocator, Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.ROOT)); } /** diff --git a/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrowUtils.java b/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrowUtils.java index a96e45e6bd0..e48255e313a 100644 --- a/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrowUtils.java +++ b/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrowUtils.java @@ -304,7 +304,6 @@ public static void jdbcToArrowVectors(ResultSet rs, VectorSchemaRoot root, Calen case Types.VARBINARY: case Types.LONGVARBINARY: updateVector((VarBinaryVector)root.getVector(columnName), -// rs.getBytes(i), !rs.wasNull(), rowCount); rs.getBinaryStream(i), !rs.wasNull(), rowCount); break; case Types.ARRAY: @@ -474,7 +473,7 @@ private static void updateVector(VarBinaryVector varBinaryVector, InputStream is if (read == -1) { break; } - arrowBuf.setBytes(total, new ByteArrayInputStream(bytes, 0, read), read); + arrowBuf.setBytes(total, bytes, total, read); total += read; } holder.end = total; diff --git a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/AbstractJdbcToArrowTest.java b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/AbstractJdbcToArrowTest.java index 2c76c178ea0..19438c270dd 100644 --- a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/AbstractJdbcToArrowTest.java +++ b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/AbstractJdbcToArrowTest.java @@ -36,7 +36,7 @@ public abstract class AbstractJdbcToArrowTest { protected Connection conn = null; protected Table table; - + /** * This method creates Table object after reading YAML file * @param ymlFilePath @@ -45,7 +45,7 @@ public abstract class AbstractJdbcToArrowTest { */ protected static Table getTable(String ymlFilePath, Class clss) throws IOException { return new ObjectMapper(new YAMLFactory()).readValue( - clss.getClassLoader().getResourceAsStream(ymlFilePath), Table.class); + clss.getClassLoader().getResourceAsStream(ymlFilePath), Table.class); } @@ -67,7 +67,7 @@ public void setUp() throws SQLException, ClassNotFoundException { } } } - + /** * Clean up method to close connection after test completes * @throws SQLException @@ -79,7 +79,7 @@ public void destroy() throws SQLException { conn = null; } } - + /** * This method returns collection of Table object for each test iteration * @return @@ -88,14 +88,14 @@ public void destroy() throws SQLException { * @throws IOException */ public static Object[][] prepareTestData(String[] testFiles, Class clss) throws SQLException, ClassNotFoundException, IOException { - Object[][] tableArr = new Object[testFiles.length][]; + Object[][] tableArr = new Object[testFiles.length][]; int i = 0; for (String testFile: testFiles) { tableArr[i++] = new Object[]{getTable(testFile, clss)}; } return tableArr; } - + /** * Abstract method to implement test Functionality to test JdbcToArrow methods * @throws SQLException diff --git a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/JdbcToArrowTestHelper.java b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/JdbcToArrowTestHelper.java index 37580f0f2ea..8fabc4dcdae 100644 --- a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/JdbcToArrowTestHelper.java +++ b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/JdbcToArrowTestHelper.java @@ -20,8 +20,6 @@ import java.math.BigDecimal; import java.nio.charset.Charset; -import java.util.Arrays; - import org.apache.arrow.vector.BaseValueVector; import org.apache.arrow.vector.BigIntVector; import org.apache.arrow.vector.BitVector; @@ -36,10 +34,11 @@ import org.apache.arrow.vector.TinyIntVector; import org.apache.arrow.vector.VarBinaryVector; import org.apache.arrow.vector.VarCharVector; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertArrayEquals; + /** * This is a Helper class which has functionalities to read and assert the values from the given FieldVector object * @@ -50,13 +49,13 @@ public static void assertIntVectorValues(IntVector intVector, int rowCount, Inte assertEquals(rowCount, intVector.getValueCount()); for(int j = 0; j < intVector.getValueCount(); j++) { - assertEquals(values[j].intValue(), intVector.get(j)); + assertEquals(values[j].intValue(), intVector.get(j)); } } public static void assertBooleanVectorValues(BitVector bitVector, int rowCount, Boolean[] values){ assertEquals(rowCount, bitVector.getValueCount()); - + for(int j = 0; j < bitVector.getValueCount(); j++){ assertEquals(values[j].booleanValue(), bitVector.get(j) == 1); } @@ -98,7 +97,7 @@ public static void assertDecimalVectorValues(DecimalVector decimalVector, int ro assertEquals(rowCount, decimalVector.getValueCount()); for(int j = 0; j < decimalVector.getValueCount(); j++){ - assertNotNull(decimalVector.getObject(j)); + assertNotNull(decimalVector.getObject(j)); assertEquals(values[j].doubleValue(), decimalVector.getObject(j).doubleValue(), 0); } } @@ -123,7 +122,7 @@ public static void assertTimeVectorValues(TimeMilliVector timeMilliVector, int r assertEquals(rowCount, timeMilliVector.getValueCount()); for(int j = 0; j < timeMilliVector.getValueCount(); j++){ - assertEquals(values[j].longValue(), timeMilliVector.get(j)); + assertEquals(values[j].longValue(), timeMilliVector.get(j)); } } @@ -147,7 +146,7 @@ public static void assertVarBinaryVectorValues (VarBinaryVector varBinaryVector, assertEquals(rowCount, varBinaryVector.getValueCount()); for(int j = 0; j < varBinaryVector.getValueCount(); j++){ - assertEquals(Arrays.hashCode(values[j]), Arrays.hashCode(varBinaryVector.get(j))); + assertArrayEquals(values[j], varBinaryVector.get(j)); } } @@ -155,15 +154,15 @@ public static void assertVarcharVectorValues(VarCharVector varCharVector, int ro assertEquals(rowCount, varCharVector.getValueCount()); for(int j = 0; j < varCharVector.getValueCount(); j++){ - assertEquals(Arrays.hashCode(values[j]), Arrays.hashCode(varCharVector.get(j))); + assertArrayEquals(values[j], varCharVector.get(j)); } } - + public static void assertNullValues(BaseValueVector vector, int rowCount) { assertEquals(rowCount, vector.getValueCount()); for(int j = 0; j < vector.getValueCount(); j++) { - assertTrue(vector.isNull(j)); + assertTrue(vector.isNull(j)); } } @@ -172,109 +171,109 @@ public static byte[] hexStringToByteArray(String s) { byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) - + Character.digit(s.charAt(i+1), 16)); + + Character.digit(s.charAt(i+1), 16)); } return data; } - + public static Integer [] getIntValues(String[] values, String dataType) { - String[] dataArr= getValues(values, dataType); - Integer [] valueArr = new Integer [dataArr.length]; - int i =0; - for(String data : dataArr) { - valueArr [i++] = Integer.parseInt(data); - } - return valueArr; + String[] dataArr= getValues(values, dataType); + Integer [] valueArr = new Integer [dataArr.length]; + int i =0; + for(String data : dataArr) { + valueArr [i++] = Integer.parseInt(data); + } + return valueArr; } - + public static Boolean [] getBooleanValues(String[] values, String dataType) { - String[] dataArr= getValues(values, dataType); - Boolean [] valueArr = new Boolean [dataArr.length]; - int i =0; - for(String data : dataArr) { - valueArr [i++] = data.trim().equals("1"); - } - return valueArr; + String[] dataArr= getValues(values, dataType); + Boolean [] valueArr = new Boolean [dataArr.length]; + int i =0; + for(String data : dataArr) { + valueArr [i++] = data.trim().equals("1"); + } + return valueArr; } public static BigDecimal [] getDecimalValues(String[] values, String dataType) { - String[] dataArr= getValues(values, dataType); - BigDecimal [] valueArr = new BigDecimal [dataArr.length]; - int i =0; - for(String data : dataArr) { - valueArr[i++] = new BigDecimal(data); - } - return valueArr; + String[] dataArr= getValues(values, dataType); + BigDecimal [] valueArr = new BigDecimal [dataArr.length]; + int i =0; + for(String data : dataArr) { + valueArr[i++] = new BigDecimal(data); + } + return valueArr; } public static Double [] getDoubleValues(String[] values, String dataType) { - String[] dataArr= getValues(values, dataType); - Double [] valueArr = new Double [dataArr.length]; - int i =0; - for(String data : dataArr) { - valueArr [i++] = Double.parseDouble(data); - } - return valueArr; + String[] dataArr= getValues(values, dataType); + Double [] valueArr = new Double [dataArr.length]; + int i =0; + for(String data : dataArr) { + valueArr [i++] = Double.parseDouble(data); + } + return valueArr; } - + public static Float [] getFloatValues(String[] values, String dataType) { - String[] dataArr= getValues(values, dataType); - Float [] valueArr = new Float [dataArr.length]; - int i =0; - for(String data : dataArr) { - valueArr [i++] = Float.parseFloat(data); - } - return valueArr; + String[] dataArr= getValues(values, dataType); + Float [] valueArr = new Float [dataArr.length]; + int i =0; + for(String data : dataArr) { + valueArr [i++] = Float.parseFloat(data); + } + return valueArr; } - + public static Long [] getLongValues(String[] values, String dataType) { - String[] dataArr= getValues(values, dataType); - Long [] valueArr = new Long [dataArr.length]; - int i =0; - for(String data : dataArr) { - valueArr [i++] = Long.parseLong(data); - } - return valueArr; + String[] dataArr= getValues(values, dataType); + Long [] valueArr = new Long [dataArr.length]; + int i =0; + for(String data : dataArr) { + valueArr [i++] = Long.parseLong(data); + } + return valueArr; } - + public static byte [][] getCharArray(String[] values, String dataType) { - String[] dataArr= getValues(values, dataType); - byte [][] valueArr = new byte [dataArr.length][]; - int i =0; - for(String data : dataArr) { - valueArr [i++] = data.trim().getBytes(); - } - return valueArr; + String[] dataArr= getValues(values, dataType); + byte [][] valueArr = new byte [dataArr.length][]; + int i =0; + for(String data : dataArr) { + valueArr [i++] = data.trim().getBytes(); + } + return valueArr; } - + public static byte [][] getCharArrayWithCharSet(String[] values, String dataType, Charset charSet) { - String[] dataArr= getValues(values, dataType); - byte [][] valueArr = new byte [dataArr.length][]; - int i =0; - for(String data : dataArr) { - valueArr [i++] = data.trim().getBytes(charSet); - } - return valueArr; + String[] dataArr= getValues(values, dataType); + byte [][] valueArr = new byte [dataArr.length][]; + int i =0; + for(String data : dataArr) { + valueArr [i++] = data.trim().getBytes(charSet); + } + return valueArr; } - + public static byte [][] getBinaryValues(String[] values, String dataType) { - String[] dataArr= getValues(values, dataType); - byte [][] valueArr = new byte [dataArr.length][]; - int i =0; - for(String data : dataArr) { - valueArr [i++] = hexStringToByteArray(data.trim()); - } - return valueArr; + String[] dataArr= getValues(values, dataType); + byte [][] valueArr = new byte [dataArr.length][]; + int i =0; + for(String data : dataArr) { + valueArr [i++] = hexStringToByteArray(data.trim()); + } + return valueArr; } - + public static String [] getValues(String[] values, String dataType) { - String value = ""; - for(String val : values) { - if(val.startsWith(dataType)) { - value = val.split("=")[1]; - break; - } - } - return value.split(","); + String value = ""; + for(String val : values) { + if(val.startsWith(dataType)) { + value = val.split("=")[1]; + break; + } + } + return value.split(","); } } diff --git a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/Table.java b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/Table.java index 3c99ceb1578..b4305eb38b9 100644 --- a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/Table.java +++ b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/Table.java @@ -28,7 +28,6 @@ */ @JsonIgnoreProperties(ignoreUnknown = true) public class Table { - private String name; private String type; private String vector; @@ -93,6 +92,7 @@ public Integer[] getIntValues() { } return arr; } + public Boolean[] getBoolValues() { Boolean[] arr = new Boolean[values.length]; int i = 0; @@ -101,6 +101,7 @@ public Boolean[] getBoolValues() { } return arr; } + public BigDecimal[] getBigDecimalValues() { BigDecimal[] arr = new BigDecimal[values.length]; int i = 0; @@ -109,6 +110,7 @@ public BigDecimal[] getBigDecimalValues() { } return arr; } + public Double[] getDoubleValues() { Double[] arr = new Double[values.length]; int i = 0; @@ -180,30 +182,30 @@ public void setDrop(String drop) { } public String getTimezone() { - return timezone; - } - - public void setTimezone(String timezone) { - this.timezone = timezone; - } - - public String[] getVectors() { - return vectors; - } - - public void setVectors(String[] vectors) { - this.vectors = vectors; - } - - public int getRowCount() { - return rowCount; - } - - public void setRowCount(int rowCount) { - this.rowCount = rowCount; - } - - private byte[][] getByteArray(String[] data) { + return timezone; + } + + public void setTimezone(String timezone) { + this.timezone = timezone; + } + + public String[] getVectors() { + return vectors; + } + + public void setVectors(String[] vectors) { + this.vectors = vectors; + } + + public int getRowCount() { + return rowCount; + } + + public void setRowCount(int rowCount) { + this.rowCount = rowCount; + } + + private byte[][] getByteArray(String[] data) { byte[][] byteArr = new byte[data.length][]; for (int i = 0; i < data.length; i++) { @@ -226,8 +228,8 @@ private static byte[] hexStringToByteArray(String s) { byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) - + Character.digit(s.charAt(i + 1), 16)); + + Character.digit(s.charAt(i + 1), 16)); } return data; } -} +} \ No newline at end of file