From d6c64a775a272c0e334c765d3b4f7413f97674fc Mon Sep 17 00:00:00 2001 From: Mike Pigott Date: Wed, 30 Jan 2019 00:00:39 -0500 Subject: [PATCH] ARROW-3965: JdbcToArrowConfigBuilder --- .../arrow/adapter/jdbc/JdbcToArrow.java | 2 - .../arrow/adapter/jdbc/JdbcToArrowConfig.java | 40 +---------- .../jdbc/JdbcToArrowConfigBuilder.java | 71 +++++++++++++++++++ .../arrow/adapter/jdbc/JdbcToArrowUtils.java | 2 - .../adapter/jdbc/JdbcToArrowConfigTest.java | 38 +++++++--- .../jdbc/h2/JdbcToArrowCharSetTest.java | 6 +- .../jdbc/h2/JdbcToArrowDataTypesTest.java | 6 +- .../adapter/jdbc/h2/JdbcToArrowNullTest.java | 6 +- .../adapter/jdbc/h2/JdbcToArrowTest.java | 6 +- .../jdbc/h2/JdbcToArrowTimeZoneTest.java | 10 +-- 10 files changed, 116 insertions(+), 71 deletions(-) create mode 100644 java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrowConfigBuilder.java 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 fa4e62b512f0e..fd320367f77b6 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 @@ -137,7 +137,6 @@ public static VectorSchemaRoot sqlToArrow(Connection connection, String query, J Preconditions.checkNotNull(connection, "JDBC connection object can not be null"); Preconditions.checkArgument(query != null && query.length() > 0, "SQL query can not be null or empty"); Preconditions.checkNotNull(config, "The configuration cannot be null"); - Preconditions.checkArgument(config.isValid(), "The configuration must be valid"); try (Statement stmt = connection.createStatement()) { return sqlToArrow(stmt.executeQuery(query), config); @@ -221,7 +220,6 @@ public static VectorSchemaRoot sqlToArrow(ResultSet resultSet, JdbcToArrowConfig throws SQLException, IOException { Preconditions.checkNotNull(resultSet, "JDBC ResultSet object can not be null"); Preconditions.checkNotNull(config, "The configuration cannot be null"); - Preconditions.checkArgument(config.isValid(), "The configuration must be valid"); VectorSchemaRoot root = VectorSchemaRoot.create( JdbcToArrowUtils.jdbcToArrowSchema(resultSet.getMetaData(), config), config.getAllocator()); diff --git a/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrowConfig.java b/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrowConfig.java index 8029f6d96bd18..59813a830cbed 100644 --- a/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrowConfig.java +++ b/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrowConfig.java @@ -46,7 +46,7 @@ public final class JdbcToArrowConfig { * @param allocator The memory allocator to construct the Arrow vectors with. * @param calendar The calendar to use when constructing Timestamp fields and reading time-based results. */ - public JdbcToArrowConfig(BaseAllocator allocator, Calendar calendar) { + JdbcToArrowConfig(BaseAllocator allocator, Calendar calendar) { Preconditions.checkNotNull(allocator, "Memory allocator cannot be null"); Preconditions.checkNotNull(calendar, "Calendar object can not be null"); @@ -63,19 +63,6 @@ public Calendar getCalendar() { return calendar; } - /** - * Sets the {@link Calendar} to use when constructing timestamp fields in the - * Arrow schema, and reading time-based fields from the JDBC ResultSet. - * - * @param calendar the calendar to set. - * @exception NullPointerExeption if calendar is null. - */ - public JdbcToArrowConfig setCalendar(Calendar calendar) { - Preconditions.checkNotNull(calendar, "Calendar object can not be null"); - this.calendar = calendar; - return this; - } - /** * The Arrow memory allocator. * @return the allocator. @@ -83,29 +70,4 @@ public JdbcToArrowConfig setCalendar(Calendar calendar) { public BaseAllocator getAllocator() { return allocator; } - - /** - * Sets the memory allocator to use when construting the Arrow vectors from the ResultSet. - * - * @param allocator the allocator to set. - * @exception NullPointerException if allocator is null. - */ - public JdbcToArrowConfig setAllocator(BaseAllocator allocator) { - Preconditions.checkNotNull(allocator, "Memory allocator cannot be null"); - this.allocator = allocator; - return this; - } - - /** - * Whether this configuration is valid. The configuration is valid when: - * - * - * @return Whether this configuration is valid. - */ - public boolean isValid() { - return (calendar != null) && (allocator != null); - } } diff --git a/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrowConfigBuilder.java b/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrowConfigBuilder.java new file mode 100644 index 0000000000000..54b6a7a649846 --- /dev/null +++ b/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrowConfigBuilder.java @@ -0,0 +1,71 @@ +/* + * 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.arrow.adapter.jdbc; + +import java.util.Calendar; + +import org.apache.arrow.memory.BaseAllocator; + +import com.google.common.base.Preconditions; + +public class JdbcToArrowConfigBuilder { + private Calendar calendar; + private BaseAllocator allocator; + + public JdbcToArrowConfigBuilder() { + } + + public JdbcToArrowConfigBuilder(BaseAllocator allocator, Calendar calendar) { + this(); + + Preconditions.checkNotNull(allocator, "Memory allocator cannot be null"); + Preconditions.checkNotNull(calendar, "Calendar object can not be null"); + + this.allocator = allocator; + this.calendar = calendar; + } + + /** + * Sets the memory allocator to use when constructing the Arrow vectors from the ResultSet. + * + * @param allocator the allocator to set. + * @exception NullPointerException if allocator is null. + */ + public JdbcToArrowConfigBuilder setAllocator(BaseAllocator allocator) { + Preconditions.checkNotNull(allocator, "Memory allocator cannot be null"); + this.allocator = allocator; + return this; + } + + /** + * Sets the {@link Calendar} to use when constructing timestamp fields in the + * Arrow schema, and reading time-based fields from the JDBC ResultSet. + * + * @param calendar the calendar to set. + * @exception NullPointerExeption if calendar is null. + */ + public JdbcToArrowConfigBuilder setCalendar(Calendar calendar) { + Preconditions.checkNotNull(calendar, "Calendar object can not be null"); + this.calendar = calendar; + return this; + } + + public JdbcToArrowConfig build() { + return new JdbcToArrowConfig(allocator, calendar); + } +} 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 2f4ea3ab41ab8..d48cfe2197b0c 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 @@ -144,7 +144,6 @@ public static Schema jdbcToArrowSchema(ResultSetMetaData rsmd, Calendar calendar public static Schema jdbcToArrowSchema(ResultSetMetaData rsmd, JdbcToArrowConfig config) throws SQLException { Preconditions.checkNotNull(rsmd, "JDBC ResultSetMetaData object can't be null"); Preconditions.checkNotNull(config, "The configuration object must not be null"); - Preconditions.checkArgument(config.isValid(), "The configuration object must be valid"); List fields = new ArrayList<>(); int columnCount = rsmd.getColumnCount(); @@ -269,7 +268,6 @@ public static void jdbcToArrowVectors(ResultSet rs, VectorSchemaRoot root, JdbcT Preconditions.checkNotNull(rs, "JDBC ResultSet object can't be null"); Preconditions.checkNotNull(root, "JDBC ResultSet object can't be null"); Preconditions.checkNotNull(config, "JDBC-to-Arrow configuration cannot be null"); - Preconditions.checkArgument(config.isValid(), "JDBC-to-Arrow configuration must be valid"); ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); diff --git a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/JdbcToArrowConfigTest.java b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/JdbcToArrowConfigTest.java index 116fa46fd548d..b4f92fa417026 100644 --- a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/JdbcToArrowConfigTest.java +++ b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/JdbcToArrowConfigTest.java @@ -33,45 +33,61 @@ public class JdbcToArrowConfigTest { private static final Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.ROOT); @Test(expected = NullPointerException.class) - public void testNullArguments() { + public void testConfigNullArguments() { new JdbcToArrowConfig(null, null); } @Test(expected = NullPointerException.class) - public void testNullCalendar() { + public void testBuilderNullArguments() { + new JdbcToArrowConfigBuilder(null, null); + } + + @Test(expected = NullPointerException.class) + public void testConfigNullCalendar() { new JdbcToArrowConfig(allocator, null); } @Test(expected = NullPointerException.class) - public void testNullAllocator() { + public void testBuilderNullCalendar() { + new JdbcToArrowConfigBuilder(allocator, null); + } + + @Test(expected = NullPointerException.class) + public void testConfigNullAllocator() { new JdbcToArrowConfig(null, calendar); } + @Test(expected = NullPointerException.class) + public void testBuilderNullAllocator() { + new JdbcToArrowConfigBuilder(null, calendar); + } + @Test(expected = NullPointerException.class) public void testSetNullAllocator() { - JdbcToArrowConfig config = new JdbcToArrowConfig(allocator, calendar); - config.setAllocator(null); + JdbcToArrowConfigBuilder builder = new JdbcToArrowConfigBuilder(allocator, calendar); + builder.setAllocator(null); } @Test(expected = NullPointerException.class) public void testSetNullCalendar() { - JdbcToArrowConfig config = new JdbcToArrowConfig(allocator, calendar); - config.setCalendar(null); + JdbcToArrowConfigBuilder builder = new JdbcToArrowConfigBuilder(allocator, calendar); + builder.setCalendar(null); } @Test public void testConfig() { - JdbcToArrowConfig config = new JdbcToArrowConfig(allocator, calendar); - assertTrue(config.isValid()); + JdbcToArrowConfigBuilder builder = new JdbcToArrowConfigBuilder(allocator, calendar); + JdbcToArrowConfig config = builder.build(); + assertTrue(allocator == config.getAllocator()); assertTrue(calendar == config.getCalendar()); Calendar newCalendar = Calendar.getInstance(); BaseAllocator newAllocator = new RootAllocator(Integer.SIZE); - config.setAllocator(newAllocator).setCalendar(newCalendar); + builder.setAllocator(newAllocator).setCalendar(newCalendar); + config = builder.build(); - assertTrue(config.isValid()); assertTrue(newAllocator == config.getAllocator()); assertTrue(newCalendar == config.getCalendar()); } diff --git a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowCharSetTest.java b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowCharSetTest.java index f77ead43d6919..d33c07a075e81 100644 --- a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowCharSetTest.java +++ b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowCharSetTest.java @@ -31,7 +31,7 @@ import org.apache.arrow.adapter.jdbc.AbstractJdbcToArrowTest; import org.apache.arrow.adapter.jdbc.JdbcToArrow; -import org.apache.arrow.adapter.jdbc.JdbcToArrowConfig; +import org.apache.arrow.adapter.jdbc.JdbcToArrowConfigBuilder; import org.apache.arrow.adapter.jdbc.Table; import org.apache.arrow.memory.RootAllocator; import org.apache.arrow.vector.VarCharVector; @@ -119,11 +119,11 @@ public void testJdbcToArroValues() throws SQLException, IOException { Calendar.getInstance())); testDataSets(JdbcToArrow.sqlToArrow( conn.createStatement().executeQuery(table.getQuery()), - new JdbcToArrowConfig(new RootAllocator(Integer.MAX_VALUE), Calendar.getInstance()))); + new JdbcToArrowConfigBuilder(new RootAllocator(Integer.MAX_VALUE), Calendar.getInstance()).build())); testDataSets(JdbcToArrow.sqlToArrow( conn, table.getQuery(), - new JdbcToArrowConfig(new RootAllocator(Integer.MAX_VALUE), Calendar.getInstance()))); + new JdbcToArrowConfigBuilder(new RootAllocator(Integer.MAX_VALUE), Calendar.getInstance()).build())); } /** diff --git a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowDataTypesTest.java b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowDataTypesTest.java index ef08133de9395..5bdb38ff8be9f 100644 --- a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowDataTypesTest.java +++ b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowDataTypesTest.java @@ -40,7 +40,7 @@ import org.apache.arrow.adapter.jdbc.AbstractJdbcToArrowTest; import org.apache.arrow.adapter.jdbc.JdbcToArrow; -import org.apache.arrow.adapter.jdbc.JdbcToArrowConfig; +import org.apache.arrow.adapter.jdbc.JdbcToArrowConfigBuilder; import org.apache.arrow.adapter.jdbc.Table; import org.apache.arrow.memory.RootAllocator; import org.apache.arrow.vector.BigIntVector; @@ -145,11 +145,11 @@ public void testJdbcToArroValues() throws SQLException, IOException { testDataSets(JdbcToArrow.sqlToArrow(conn.createStatement().executeQuery(table.getQuery()), Calendar.getInstance())); testDataSets(JdbcToArrow.sqlToArrow( conn.createStatement().executeQuery(table.getQuery()), - new JdbcToArrowConfig(new RootAllocator(Integer.MAX_VALUE), Calendar.getInstance()))); + new JdbcToArrowConfigBuilder(new RootAllocator(Integer.MAX_VALUE), Calendar.getInstance()).build())); testDataSets(JdbcToArrow.sqlToArrow( conn, table.getQuery(), - new JdbcToArrowConfig(new RootAllocator(Integer.MAX_VALUE), Calendar.getInstance()))); + new JdbcToArrowConfigBuilder(new RootAllocator(Integer.MAX_VALUE), Calendar.getInstance()).build())); } /** diff --git a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowNullTest.java b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowNullTest.java index 0ebfd50868480..629bcfeaed304 100644 --- a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowNullTest.java +++ b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowNullTest.java @@ -27,7 +27,7 @@ import org.apache.arrow.adapter.jdbc.AbstractJdbcToArrowTest; import org.apache.arrow.adapter.jdbc.JdbcToArrow; -import org.apache.arrow.adapter.jdbc.JdbcToArrowConfig; +import org.apache.arrow.adapter.jdbc.JdbcToArrowConfigBuilder; import org.apache.arrow.adapter.jdbc.Table; import org.apache.arrow.memory.RootAllocator; import org.apache.arrow.vector.BigIntVector; @@ -102,11 +102,11 @@ public void testJdbcToArroValues() throws SQLException, IOException { testDataSets(JdbcToArrow.sqlToArrow(conn.createStatement().executeQuery(table.getQuery()), Calendar.getInstance())); testDataSets(JdbcToArrow.sqlToArrow( conn.createStatement().executeQuery(table.getQuery()), - new JdbcToArrowConfig(new RootAllocator(Integer.MAX_VALUE), Calendar.getInstance()))); + new JdbcToArrowConfigBuilder(new RootAllocator(Integer.MAX_VALUE), Calendar.getInstance()).build())); testDataSets(JdbcToArrow.sqlToArrow( conn, table.getQuery(), - new JdbcToArrowConfig(new RootAllocator(Integer.MAX_VALUE), Calendar.getInstance()))); + new JdbcToArrowConfigBuilder(new RootAllocator(Integer.MAX_VALUE), Calendar.getInstance()).build())); } diff --git a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowTest.java b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowTest.java index c1b1f78ac2510..f74e683d7d753 100644 --- a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowTest.java +++ b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowTest.java @@ -48,7 +48,7 @@ import org.apache.arrow.adapter.jdbc.AbstractJdbcToArrowTest; import org.apache.arrow.adapter.jdbc.JdbcToArrow; -import org.apache.arrow.adapter.jdbc.JdbcToArrowConfig; +import org.apache.arrow.adapter.jdbc.JdbcToArrowConfigBuilder; import org.apache.arrow.adapter.jdbc.Table; import org.apache.arrow.memory.RootAllocator; import org.apache.arrow.vector.BigIntVector; @@ -136,11 +136,11 @@ public void testJdbcToArroValues() throws SQLException, IOException { Calendar.getInstance())); testDataSets(JdbcToArrow.sqlToArrow( conn.createStatement().executeQuery(table.getQuery()), - new JdbcToArrowConfig(new RootAllocator(Integer.MAX_VALUE), Calendar.getInstance()))); + new JdbcToArrowConfigBuilder(new RootAllocator(Integer.MAX_VALUE), Calendar.getInstance()).build())); testDataSets(JdbcToArrow.sqlToArrow( conn, table.getQuery(), - new JdbcToArrowConfig(new RootAllocator(Integer.MAX_VALUE), Calendar.getInstance()))); + new JdbcToArrowConfigBuilder(new RootAllocator(Integer.MAX_VALUE), Calendar.getInstance()).build())); } /** diff --git a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowTimeZoneTest.java b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowTimeZoneTest.java index 09ec25bc78145..fee56c7c07e91 100644 --- a/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowTimeZoneTest.java +++ b/java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowTimeZoneTest.java @@ -30,7 +30,7 @@ import org.apache.arrow.adapter.jdbc.AbstractJdbcToArrowTest; import org.apache.arrow.adapter.jdbc.JdbcToArrow; -import org.apache.arrow.adapter.jdbc.JdbcToArrowConfig; +import org.apache.arrow.adapter.jdbc.JdbcToArrowConfigBuilder; import org.apache.arrow.adapter.jdbc.Table; import org.apache.arrow.memory.RootAllocator; import org.apache.arrow.vector.DateMilliVector; @@ -108,15 +108,15 @@ public void testJdbcToArroValues() throws SQLException, IOException { Calendar.getInstance(TimeZone.getTimeZone(table.getTimezone())))); testDataSets(JdbcToArrow.sqlToArrow( conn.createStatement().executeQuery(table.getQuery()), - new JdbcToArrowConfig( + new JdbcToArrowConfigBuilder( new RootAllocator(Integer.MAX_VALUE), - Calendar.getInstance(TimeZone.getTimeZone(table.getTimezone()))))); + Calendar.getInstance(TimeZone.getTimeZone(table.getTimezone()))).build())); testDataSets(JdbcToArrow.sqlToArrow( conn, table.getQuery(), - new JdbcToArrowConfig( + new JdbcToArrowConfigBuilder( new RootAllocator(Integer.MAX_VALUE), - Calendar.getInstance(TimeZone.getTimeZone(table.getTimezone()))))); + Calendar.getInstance(TimeZone.getTimeZone(table.getTimezone()))).build())); } /**