src/main/java/org/embulk/output/jdbc/setter/ColumnSetterFactory.java in embulk-output-jdbc-0.2.4 vs src/main/java/org/embulk/output/jdbc/setter/ColumnSetterFactory.java in embulk-output-jdbc-0.3.0

- old
+ new

@@ -1,137 +1,189 @@ -package org.embulk.output.jdbc.setter; - -import java.sql.Types; -import org.embulk.spi.time.TimestampFormatter; -import org.embulk.spi.PageReader; -import org.embulk.output.jdbc.BatchInsert; -import org.embulk.output.jdbc.JdbcColumn; - -public class ColumnSetterFactory -{ - protected final BatchInsert batch; - protected final PageReader pageReader; - protected final TimestampFormatter timestampFormatter; - - public ColumnSetterFactory(BatchInsert batch, PageReader pageReader, - TimestampFormatter timestampFormatter) - { - this.batch = batch; - this.pageReader = pageReader; - this.timestampFormatter = timestampFormatter; - } - - public SkipColumnSetter newSkipColumnSetter() - { - return new SkipColumnSetter(batch, pageReader); - } - - public ColumnSetter newColumnSetter(JdbcColumn column) - { - switch(column.getSqlType()) { - //// TODO - // setByte - //case Types.TINYINT: - // return new ByteColumnSetter(batch, pageReader, column); - - //// TODO - //// setShort - //case Types.SMALLINT: - // return new ShortColumnSetter(batch, pageReader, column); - - //// TODO - //// setInt - //case Types.INTEGER: - // return new IntColumnSetter(batch, pageReader, column); - - // setLong - case Types.BIGINT: - return new LongColumnSetter(batch, pageReader, column); - - // setDouble - case Types.DOUBLE: - case Types.FLOAT: - return new DoubleColumnSetter(batch, pageReader, column); - - // TODO - //// setFloat - //case Types.REAL: - // return new FloatColumnSetter(batch, pageReader, column); - - // setBool - case Types.BOOLEAN: - case Types.BIT: // JDBC BIT is boolean, unlike SQL-92 - return new BooleanColumnSetter(batch, pageReader, column); - - // setString, Clob - case Types.CHAR: - case Types.VARCHAR: - case Types.LONGVARCHAR: - case Types.CLOB: - return new StringColumnSetter(batch, pageReader, column, timestampFormatter); - - // TODO - //// setNString, NClob - //case Types.NCHAR: - //case Types.NVARCHAR: - //case Types.LONGNVARCHAR: - // return new NStringColumnSetter(batch, pageReader, column); - - // TODO - //// setBytes Blob - //case Types.BINARY: - //case Types.VARBINARY: - //case Types.LONGVARBINARY: - //case Types.BLOB: - // return new BytesColumnSetter(batch, pageReader, column); - - // Time - //case Types.DATE: - // return new SqlDateColumnSetter(batch, pageReader, column); // TODO - //case Types.TIME: - // return new SqlTimeColumnSetter(batch, pageReader, column); // TODO - case Types.TIMESTAMP: - return new SqlTimestampColumnSetter(batch, pageReader, column); - - // Null - case Types.NULL: - return new NullColumnSetter(batch, pageReader, column); - - // TODO - //// BigDecimal - //case Types.NUMERIC: - //case Types.DECIMAL: - // return new BigDecimalColumnSetter(batch, pageReader, column); - - // others - case Types.ARRAY: // array - case Types.STRUCT: // map - case Types.REF: - case Types.DATALINK: - case Types.SQLXML: // XML - case Types.ROWID: - case Types.DISTINCT: - case Types.JAVA_OBJECT: - case Types.OTHER: - default: - throw unsupportedOperationException(column); - } - } - - //private static String[] UNSUPPORTED = new String[] { - // "ARRAY", - // "STRUCT", - // "REF", - // "DATALINK", - // "SQLXML", - // "ROWID", - // "DISTINCT", - // "OTHER", - //}; - - private static UnsupportedOperationException unsupportedOperationException(JdbcColumn column) - { - throw new UnsupportedOperationException( - String.format("Unsupported type %s (sqlType=%d, size=%d, scale=%d)", - column.getTypeName(), column.getSqlType(), column.getSizeTypeParameter(), column.getScaleTypeParameter())); - } -} +package org.embulk.output.jdbc.setter; + +import java.sql.Types; +import org.joda.time.DateTimeZone; +import org.embulk.spi.time.TimestampFormatter; +import org.embulk.output.jdbc.BatchInsert; +import org.embulk.output.jdbc.JdbcColumn; +import org.embulk.output.jdbc.JdbcColumnOption; +import org.embulk.config.ConfigException; + +public class ColumnSetterFactory +{ + protected final BatchInsert batch; + protected final DateTimeZone defaultTimeZone; + + public ColumnSetterFactory(BatchInsert batch, DateTimeZone defaultTimeZone) + { + this.batch = batch; + this.defaultTimeZone = defaultTimeZone; + } + + public SkipColumnSetter newSkipColumnSetter() + { + return new SkipColumnSetter(batch); + } + + public DefaultValueSetter newDefaultValueSetter(JdbcColumn column, JdbcColumnOption option) + { + return new NullDefaultValueSetter(batch, column); + } + + public ColumnSetter newColumnSetter(JdbcColumn column, JdbcColumnOption option) + { + switch (option.getValueType()) { + case "coalesce": + return newCoalesceColumnSetter(column, option); + case "byte": + return new ByteColumnSetter(batch, column, newDefaultValueSetter(column, option)); + case "short": + return new ShortColumnSetter(batch, column, newDefaultValueSetter(column, option)); + case "int": + return new IntColumnSetter(batch, column, newDefaultValueSetter(column, option)); + case "long": + return new LongColumnSetter(batch, column, newDefaultValueSetter(column, option)); + case "double": + return new DoubleColumnSetter(batch, column, newDefaultValueSetter(column, option)); + case "float": + return new FloatColumnSetter(batch, column, newDefaultValueSetter(column, option)); + case "boolean": + return new BooleanColumnSetter(batch, column, newDefaultValueSetter(column, option)); + case "string": + return new StringColumnSetter(batch, column, newDefaultValueSetter(column, option), newTimestampFormatter(option)); + case "nstring": + return new NStringColumnSetter(batch, column, newDefaultValueSetter(column, option), newTimestampFormatter(option)); + case "date": + return new SqlDateColumnSetter(batch, column, newDefaultValueSetter(column, option), getTimeZone(option)); + case "time": + return new SqlTimeColumnSetter(batch, column, newDefaultValueSetter(column, option)); + case "timestamp": + return new SqlTimestampColumnSetter(batch, column, newDefaultValueSetter(column, option)); + case "decimal": + return new BigDecimalColumnSetter(batch, column, newDefaultValueSetter(column, option)); + case "null": + return new NullColumnSetter(batch, column, newDefaultValueSetter(column, option)); + case "pass": + return new PassThroughColumnSetter(batch, column, newDefaultValueSetter(column, option)); + default: + throw new ConfigException(String.format("Unknown value_type '%s' for column '%s'", option.getValueType(), column.getName())); + } + } + + protected TimestampFormatter newTimestampFormatter(JdbcColumnOption option) + { + return new TimestampFormatter( + option.getJRuby(), + option.getTimestampFormat().getFormat(), + option.getTimeZone().or(defaultTimeZone)); + } + + protected DateTimeZone getTimeZone(JdbcColumnOption option) + { + return option.getTimeZone().or(defaultTimeZone); + } + + public ColumnSetter newCoalesceColumnSetter(JdbcColumn column, JdbcColumnOption option) + { + switch(column.getSqlType()) { + // setByte + case Types.TINYINT: + return new ByteColumnSetter(batch, column, newDefaultValueSetter(column, option)); + + // setShort + case Types.SMALLINT: + return new ShortColumnSetter(batch, column, newDefaultValueSetter(column, option)); + + // setInt + case Types.INTEGER: + return new IntColumnSetter(batch, column, newDefaultValueSetter(column, option)); + + // setLong + case Types.BIGINT: + return new LongColumnSetter(batch, column, newDefaultValueSetter(column, option)); + + // setDouble + case Types.DOUBLE: + case Types.FLOAT: + return new DoubleColumnSetter(batch, column, newDefaultValueSetter(column, option)); + + // setFloat + case Types.REAL: + return new FloatColumnSetter(batch, column, newDefaultValueSetter(column, option)); + + // setBool + case Types.BOOLEAN: + case Types.BIT: // JDBC BIT is boolean, unlike SQL-92 + return new BooleanColumnSetter(batch, column, newDefaultValueSetter(column, option)); + + // setString, Clob + case Types.CHAR: + case Types.VARCHAR: + case Types.LONGVARCHAR: + case Types.CLOB: + return new StringColumnSetter(batch, column, newDefaultValueSetter(column, option), newTimestampFormatter(option)); + + // setNString, NClob + case Types.NCHAR: + case Types.NVARCHAR: + case Types.LONGNVARCHAR: + return new NStringColumnSetter(batch, column, newDefaultValueSetter(column, option), newTimestampFormatter(option)); + + // TODO + //// setBytes Blob + //case Types.BINARY: + //case Types.VARBINARY: + //case Types.LONGVARBINARY: + //case Types.BLOB: + // return new BytesColumnSetter(batch, column, newDefaultValueSetter(column, option)); + + // Time + case Types.DATE: + return new SqlDateColumnSetter(batch, column, newDefaultValueSetter(column, option), getTimeZone(option)); + case Types.TIME: + return new SqlTimeColumnSetter(batch, column, newDefaultValueSetter(column, option)); + case Types.TIMESTAMP: + return new SqlTimestampColumnSetter(batch, column, newDefaultValueSetter(column, option)); + + // Null + case Types.NULL: + return new NullColumnSetter(batch, column, newDefaultValueSetter(column, option)); + + // BigDecimal + case Types.NUMERIC: + case Types.DECIMAL: + return new BigDecimalColumnSetter(batch, column, newDefaultValueSetter(column, option)); + + // others + case Types.ARRAY: // array + case Types.STRUCT: // map + case Types.REF: + case Types.DATALINK: + case Types.SQLXML: // XML + case Types.ROWID: + case Types.DISTINCT: + case Types.JAVA_OBJECT: + case Types.OTHER: + default: + throw unsupportedOperationException(column); + } + } + + //private static String[] UNSUPPORTED = new String[] { + // "ARRAY", + // "STRUCT", + // "REF", + // "DATALINK", + // "SQLXML", + // "ROWID", + // "DISTINCT", + // "OTHER", + //}; + + private static UnsupportedOperationException unsupportedOperationException(JdbcColumn column) + { + throw new UnsupportedOperationException( + String.format("Unsupported type %s (sqlType=%d, size=%d, scale=%d)", + column.getDeclaredType().or(column.getSimpleTypeName()), + column.getSqlType(), column.getSizeTypeParameter(), column.getScaleTypeParameter())); + } +}