package org.embulk.spi.util; import org.joda.time.DateTimeZone; import org.embulk.config.ConfigSource; import org.embulk.spi.type.Type; import org.embulk.spi.type.BooleanType; import org.embulk.spi.type.LongType; import org.embulk.spi.type.DoubleType; import org.embulk.spi.type.StringType; import org.embulk.spi.type.TimestampType; import org.embulk.spi.type.JsonType; import org.embulk.spi.util.dynamic.BooleanColumnSetter; import org.embulk.spi.util.dynamic.LongColumnSetter; import org.embulk.spi.util.dynamic.DoubleColumnSetter; import org.embulk.spi.util.dynamic.StringColumnSetter; import org.embulk.spi.util.dynamic.TimestampColumnSetter; import org.embulk.spi.util.dynamic.JsonColumnSetter; import org.embulk.spi.util.dynamic.DefaultValueSetter; import org.embulk.spi.util.dynamic.NullDefaultValueSetter; import org.embulk.spi.time.TimestampFormatter; import org.embulk.spi.time.TimestampParser; import org.embulk.spi.time.TimestampFormat; import org.embulk.spi.Column; import org.embulk.spi.PageBuilder; import org.embulk.config.ConfigException; public class DynamicColumnSetterFactory { private final DefaultValueSetter defaultValue; private final DynamicPageBuilder.BuilderTask task; DynamicColumnSetterFactory( DynamicPageBuilder.BuilderTask task, DefaultValueSetter defaultValue) { this.defaultValue = defaultValue; this.task = task; } public static DefaultValueSetter nullDefaultValue() { return new NullDefaultValueSetter(); } public DynamicColumnSetter newColumnSetter(PageBuilder pageBuilder, Column column) { Type type = column.getType(); if (type instanceof BooleanType) { return new BooleanColumnSetter(pageBuilder, column, defaultValue); } else if (type instanceof LongType) { return new LongColumnSetter(pageBuilder, column, defaultValue); } else if (type instanceof DoubleType) { return new DoubleColumnSetter(pageBuilder, column, defaultValue); } else if (type instanceof StringType) { TimestampFormatter formatter = new TimestampFormatter(task.getJRuby(), getTimestampFormat(column).getFormat(), getTimeZone(column)); return new StringColumnSetter(pageBuilder, column, defaultValue, formatter); } else if (type instanceof TimestampType) { // TODO use flexible time format like Ruby's Time.parse TimestampParser parser = new TimestampParser(task.getJRuby(), getTimestampFormat(column).getFormat(), getTimeZone(column)); return new TimestampColumnSetter(pageBuilder, column, defaultValue, parser); } else if (type instanceof JsonType) { TimestampFormatter formatter = new TimestampFormatter(task.getJRuby(), getTimestampFormat(column).getFormat(), getTimeZone(column)); return new JsonColumnSetter(pageBuilder, column, defaultValue, formatter); } throw new ConfigException("Unknown column type: "+type); } private TimestampFormat getTimestampFormat(Column column) { DynamicPageBuilder.ColumnOption option = getColumnOption(column); if (option != null) { return option.getTimestampFormat(); } else { return new TimestampFormat("%Y-%m-%d %H:%M:%S.%6N"); } } private DateTimeZone getTimeZone(Column column) { DynamicPageBuilder.ColumnOption option = getColumnOption(column); if (option != null) { return option.getTimeZone().or(task.getDefaultTimeZone()); } else { return task.getDefaultTimeZone(); } } private DynamicPageBuilder.ColumnOption getColumnOption(Column column) { ConfigSource option = task.getColumnOptions().get(column.getName()); if (option != null) { return option.loadConfig(DynamicPageBuilder.ColumnOption.class); } else { return null; } } }