embulk-input-athena 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/Dockerfile +8 -0
  4. data/LICENSE +21 -0
  5. data/README.md +46 -0
  6. data/build.gradle +101 -0
  7. data/config/checkstyle/checkstyle.xml +128 -0
  8. data/config/checkstyle/default.xml +108 -0
  9. data/docker-compose.yml +10 -0
  10. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  11. data/gradle/wrapper/gradle-wrapper.properties +5 -0
  12. data/gradlew +172 -0
  13. data/gradlew.bat +84 -0
  14. data/lib/embulk/input/athena.rb +3 -0
  15. data/src/main/java/org/embulk/input/athena/AthenaInputConnection.java +49 -0
  16. data/src/main/java/org/embulk/input/athena/AthenaInputPlugin.java +202 -0
  17. data/src/main/java/org/embulk/input/athena/AthenaInputPlugin.java.tmp1 +192 -0
  18. data/src/main/java/org/embulk/input/jdbc/AbstractJdbcInputPlugin.java +674 -0
  19. data/src/main/java/org/embulk/input/jdbc/JdbcColumn.java +58 -0
  20. data/src/main/java/org/embulk/input/jdbc/JdbcColumnOption.java +31 -0
  21. data/src/main/java/org/embulk/input/jdbc/JdbcInputConnection.java +397 -0
  22. data/src/main/java/org/embulk/input/jdbc/JdbcLiteral.java +38 -0
  23. data/src/main/java/org/embulk/input/jdbc/JdbcSchema.java +55 -0
  24. data/src/main/java/org/embulk/input/jdbc/Ssl.java +37 -0
  25. data/src/main/java/org/embulk/input/jdbc/ToString.java +54 -0
  26. data/src/main/java/org/embulk/input/jdbc/ToStringMap.java +35 -0
  27. data/src/main/java/org/embulk/input/jdbc/getter/AbstractColumnGetter.java +105 -0
  28. data/src/main/java/org/embulk/input/jdbc/getter/AbstractIncrementalHandler.java +45 -0
  29. data/src/main/java/org/embulk/input/jdbc/getter/AbstractTimestampColumnGetter.java +38 -0
  30. data/src/main/java/org/embulk/input/jdbc/getter/BigDecimalColumnGetter.java +59 -0
  31. data/src/main/java/org/embulk/input/jdbc/getter/BooleanColumnGetter.java +56 -0
  32. data/src/main/java/org/embulk/input/jdbc/getter/ColumnGetter.java +21 -0
  33. data/src/main/java/org/embulk/input/jdbc/getter/ColumnGetterFactory.java +207 -0
  34. data/src/main/java/org/embulk/input/jdbc/getter/DateColumnGetter.java +37 -0
  35. data/src/main/java/org/embulk/input/jdbc/getter/DoubleColumnGetter.java +66 -0
  36. data/src/main/java/org/embulk/input/jdbc/getter/FloatColumnGetter.java +66 -0
  37. data/src/main/java/org/embulk/input/jdbc/getter/JsonColumnGetter.java +57 -0
  38. data/src/main/java/org/embulk/input/jdbc/getter/LongColumnGetter.java +70 -0
  39. data/src/main/java/org/embulk/input/jdbc/getter/StringColumnGetter.java +96 -0
  40. data/src/main/java/org/embulk/input/jdbc/getter/TimeColumnGetter.java +37 -0
  41. data/src/main/java/org/embulk/input/jdbc/getter/TimestampColumnGetter.java +36 -0
  42. data/src/main/java/org/embulk/input/jdbc/getter/TimestampWithTimeZoneIncrementalHandler.java +83 -0
  43. data/src/main/java/org/embulk/input/jdbc/getter/TimestampWithoutTimeZoneIncrementalHandler.java +75 -0
  44. data/src/test/java/org/embulk/input/athena/TestAthenaInputPlugin.java +5 -0
  45. metadata +258 -0
@@ -0,0 +1,56 @@
1
+ package org.embulk.input.jdbc.getter;
2
+
3
+ import java.sql.ResultSet;
4
+ import java.sql.SQLException;
5
+ import org.embulk.spi.Column;
6
+ import org.embulk.spi.PageBuilder;
7
+ import org.embulk.spi.type.Type;
8
+ import org.embulk.spi.type.Types;
9
+
10
+ public class BooleanColumnGetter
11
+ extends AbstractColumnGetter
12
+ {
13
+ protected boolean value;
14
+
15
+ public BooleanColumnGetter(PageBuilder to, Type toType)
16
+ {
17
+ super(to, toType);
18
+ }
19
+
20
+ @Override
21
+ protected void fetch(ResultSet from, int fromIndex) throws SQLException
22
+ {
23
+ value = from.getBoolean(fromIndex);
24
+ }
25
+
26
+ @Override
27
+ protected Type getDefaultToType()
28
+ {
29
+ return Types.BOOLEAN;
30
+ }
31
+
32
+ @Override
33
+ public void booleanColumn(Column column)
34
+ {
35
+ to.setBoolean(column, value);
36
+ }
37
+
38
+ @Override
39
+ public void longColumn(Column column)
40
+ {
41
+ to.setLong(column, value ? 1L : 0L);
42
+ }
43
+
44
+ @Override
45
+ public void doubleColumn(Column column)
46
+ {
47
+ to.setDouble(column, value ? 1.0 : 0.0);
48
+ }
49
+
50
+ @Override
51
+ public void stringColumn(Column column)
52
+ {
53
+ to.setString(column, Boolean.toString(value));
54
+ }
55
+
56
+ }
@@ -0,0 +1,21 @@
1
+ package org.embulk.input.jdbc.getter;
2
+
3
+ import java.sql.ResultSet;
4
+ import java.sql.SQLException;
5
+ import java.sql.PreparedStatement;
6
+ import com.fasterxml.jackson.databind.JsonNode;
7
+ import org.embulk.spi.Column;
8
+ import org.embulk.spi.type.Type;
9
+
10
+ public interface ColumnGetter
11
+ {
12
+ public void getAndSet(ResultSet from, int fromIndex,
13
+ Column toColumn) throws SQLException;
14
+
15
+ public Type getToType();
16
+
17
+ public JsonNode encodeToJson();
18
+
19
+ public void decodeFromJsonTo(PreparedStatement toStatement, int toIndex, JsonNode fromValue)
20
+ throws SQLException;
21
+ }
@@ -0,0 +1,207 @@
1
+ package org.embulk.input.jdbc.getter;
2
+
3
+ import java.lang.reflect.Field;
4
+ import java.sql.Types;
5
+ import java.util.HashMap;
6
+ import java.util.Map;
7
+
8
+ import com.google.common.base.Optional;
9
+ import org.embulk.config.ConfigException;
10
+ import org.embulk.config.ConfigSource;
11
+ import org.embulk.config.Task;
12
+ import org.embulk.input.jdbc.AbstractJdbcInputPlugin.PluginTask;
13
+ import org.embulk.input.jdbc.JdbcColumn;
14
+ import org.embulk.input.jdbc.JdbcColumnOption;
15
+ import org.embulk.input.jdbc.JdbcInputConnection;
16
+ import org.embulk.spi.Exec;
17
+ import org.embulk.spi.PageBuilder;
18
+ import org.embulk.spi.time.TimestampFormatter;
19
+ import org.embulk.spi.type.TimestampType;
20
+ import org.embulk.spi.type.Type;
21
+ import org.joda.time.DateTimeZone;
22
+
23
+ import static java.util.Locale.ENGLISH;
24
+
25
+ public class ColumnGetterFactory
26
+ {
27
+ protected final PageBuilder to;
28
+ private final DateTimeZone defaultTimeZone;
29
+ private final Map<Integer, String> jdbcTypes = getAllJDBCTypes();
30
+
31
+ public ColumnGetterFactory(PageBuilder to, DateTimeZone defaultTimeZone)
32
+ {
33
+ this.to = to;
34
+ this.defaultTimeZone = defaultTimeZone;
35
+ }
36
+
37
+ public ColumnGetter newColumnGetter(JdbcInputConnection con, PluginTask task, JdbcColumn column, JdbcColumnOption option)
38
+ {
39
+ return newColumnGetter(con, task, column, option, option.getValueType());
40
+ }
41
+
42
+ private ColumnGetter newColumnGetter(JdbcInputConnection con, PluginTask task, JdbcColumn column, JdbcColumnOption option, String valueType)
43
+ {
44
+ Type toType = getToType(option);
45
+ switch(valueType) {
46
+ case "coalesce":
47
+ // resolve actual valueType using sqlTypeToValueType() method and retry.
48
+ return newColumnGetter(con, task, column, option, sqlTypeToValueType(column, column.getSqlType()));
49
+ case "long":
50
+ return new LongColumnGetter(to, toType);
51
+ case "float":
52
+ return new FloatColumnGetter(to, toType);
53
+ case "double":
54
+ return new DoubleColumnGetter(to, toType);
55
+ case "boolean":
56
+ return new BooleanColumnGetter(to, toType);
57
+ case "string":
58
+ return new StringColumnGetter(to, toType);
59
+ case "json":
60
+ return new JsonColumnGetter(to, toType);
61
+ case "date":
62
+ return new DateColumnGetter(to, toType, newTimestampFormatter(option, DateColumnGetter.DEFAULT_FORMAT));
63
+ case "time":
64
+ return new TimeColumnGetter(to, toType, newTimestampFormatter(option, DateColumnGetter.DEFAULT_FORMAT));
65
+ case "timestamp":
66
+ return new TimestampColumnGetter(to, toType, newTimestampFormatter(option, DateColumnGetter.DEFAULT_FORMAT));
67
+ case "decimal":
68
+ return new BigDecimalColumnGetter(to, toType);
69
+ default:
70
+ throw new ConfigException(String.format(ENGLISH,
71
+ "Unknown value_type '%s' for column '%s'", option.getValueType(), column.getName()));
72
+ }
73
+ }
74
+
75
+ protected Map<Integer,String> getAllJDBCTypes() {
76
+ Map<Integer,String> map = new HashMap<Integer, String>();
77
+ for(Field f: Types.class.getFields()){
78
+ try {
79
+ map.put((Integer) f.get(null), f.getName());
80
+ } catch(IllegalAccessException iea){
81
+ }
82
+ }
83
+ return map;
84
+ }
85
+
86
+ public String getJdbcType(int sqlType)
87
+ {
88
+ return jdbcTypes.get(sqlType);
89
+ }
90
+
91
+
92
+ protected String sqlTypeToValueType(JdbcColumn column, int sqlType)
93
+ {
94
+ switch(sqlType) {
95
+ // getLong
96
+ case Types.TINYINT:
97
+ case Types.SMALLINT:
98
+ case Types.INTEGER:
99
+ case Types.BIGINT:
100
+ return "long";
101
+
102
+ // getFloat
103
+ case Types.FLOAT:
104
+ case Types.REAL:
105
+ return "float";
106
+
107
+ // getDouble
108
+ case Types.DOUBLE:
109
+ return "double";
110
+
111
+ // getBool
112
+ case Types.BOOLEAN:
113
+ case Types.BIT: // JDBC BIT is boolean, unlike SQL-92
114
+ return "boolean";
115
+
116
+ // getString, Clob
117
+ case Types.CHAR:
118
+ case Types.VARCHAR:
119
+ case Types.LONGVARCHAR:
120
+ case Types.CLOB:
121
+ case Types.NCHAR:
122
+ case Types.NVARCHAR:
123
+ case Types.LONGNVARCHAR:
124
+ return "string";
125
+
126
+ // TODO
127
+ //// getBytes Blob
128
+ //case Types.BINARY:
129
+ //case Types.VARBINARY:
130
+ //case Types.LONGVARBINARY:
131
+ //case Types.BLOB:
132
+ // return new BytesColumnGetter();
133
+
134
+ // getDate
135
+ case Types.DATE:
136
+ return "date";
137
+
138
+ // getTime
139
+ case Types.TIME:
140
+ return "time";
141
+
142
+ // getTimestamp
143
+ case Types.TIMESTAMP:
144
+ return "timestamp";
145
+
146
+ // TODO
147
+ //// Null
148
+ //case Types.NULL:
149
+ // return new NullColumnGetter();
150
+
151
+ // getBigDecimal
152
+ case Types.NUMERIC:
153
+ case Types.DECIMAL:
154
+ return "decimal";
155
+
156
+ // others
157
+ case Types.ARRAY: // array
158
+ case Types.STRUCT: // map
159
+ case Types.REF:
160
+ case Types.DATALINK:
161
+ case Types.SQLXML: // XML
162
+ case Types.ROWID:
163
+ case Types.DISTINCT:
164
+ case Types.JAVA_OBJECT:
165
+ case Types.OTHER:
166
+ default:
167
+ throw unsupportedOperationException(column);
168
+ }
169
+ }
170
+
171
+ protected Type getToType(JdbcColumnOption option)
172
+ {
173
+ if (!option.getType().isPresent()) {
174
+ return null;
175
+ }
176
+ Type toType = option.getType().get();
177
+ if (toType instanceof TimestampType && option.getTimestampFormat().isPresent()) {
178
+ toType = ((TimestampType)toType).withFormat(option.getTimestampFormat().get().getFormat());
179
+ }
180
+ return toType;
181
+ }
182
+
183
+ private static interface FormatterIntlTask extends Task, TimestampFormatter.Task {}
184
+ private static interface FormatterIntlColumnOption extends Task, TimestampFormatter.TimestampColumnOption {}
185
+
186
+ private TimestampFormatter newTimestampFormatter(JdbcColumnOption option, String defaultTimestampFormat)
187
+ {
188
+ // TODO: Switch to a newer TimestampFormatter constructor after a reasonable interval.
189
+ // Traditional constructor is used here for compatibility.
190
+ final ConfigSource configSource = Exec.newConfigSource();
191
+ configSource.set("format", option.getTimestampFormat().isPresent()
192
+ ? option.getTimestampFormat().get().getFormat()
193
+ : defaultTimestampFormat);
194
+ configSource.set("timezone", option.getTimeZone().or(this.defaultTimeZone));
195
+ return new TimestampFormatter(
196
+ Exec.newConfigSource().loadConfig(FormatterIntlTask.class),
197
+ Optional.fromNullable(configSource.loadConfig(FormatterIntlColumnOption.class)));
198
+ }
199
+
200
+ private static UnsupportedOperationException unsupportedOperationException(JdbcColumn column)
201
+ {
202
+ throw new UnsupportedOperationException(
203
+ String.format(ENGLISH,
204
+ "Unsupported type %s (sqlType=%d) of '%s' column. Please add '%s: {value_type: string}' to 'column_options: {...}' option to convert the values to strings, or exclude the column from 'select:' option",
205
+ column.getTypeName(), column.getSqlType(), column.getName(), column.getName()));
206
+ }
207
+ }
@@ -0,0 +1,37 @@
1
+ package org.embulk.input.jdbc.getter;
2
+
3
+ import java.sql.Date;
4
+ import java.sql.ResultSet;
5
+ import java.sql.SQLException;
6
+ import org.embulk.spi.PageBuilder;
7
+ import org.embulk.spi.time.Timestamp;
8
+ import org.embulk.spi.time.TimestampFormatter;
9
+ import org.embulk.spi.type.Type;
10
+ import org.embulk.spi.type.Types;
11
+
12
+ public class DateColumnGetter
13
+ extends AbstractTimestampColumnGetter
14
+ {
15
+ static final String DEFAULT_FORMAT = "%Y-%m-%d";
16
+
17
+ public DateColumnGetter(PageBuilder to, Type toType, TimestampFormatter timestampFormatter)
18
+ {
19
+ super(to, toType, timestampFormatter);
20
+ }
21
+
22
+ @Override
23
+ protected void fetch(ResultSet from, int fromIndex) throws SQLException
24
+ {
25
+ Date date = from.getDate(fromIndex);
26
+ if (date != null) {
27
+ value = Timestamp.ofEpochMilli(date.getTime());
28
+ }
29
+ }
30
+
31
+ @Override
32
+ protected Type getDefaultToType()
33
+ {
34
+ return Types.TIMESTAMP.withFormat(DEFAULT_FORMAT);
35
+ }
36
+
37
+ }
@@ -0,0 +1,66 @@
1
+ package org.embulk.input.jdbc.getter;
2
+
3
+ import java.math.RoundingMode;
4
+ import java.sql.ResultSet;
5
+ import java.sql.SQLException;
6
+ import org.embulk.spi.Column;
7
+ import org.embulk.spi.PageBuilder;
8
+ import org.embulk.spi.type.Type;
9
+ import org.embulk.spi.type.Types;
10
+ import com.google.common.math.DoubleMath;
11
+
12
+ public class DoubleColumnGetter
13
+ extends AbstractColumnGetter
14
+ {
15
+ protected double value;
16
+
17
+ public DoubleColumnGetter(PageBuilder to, Type toType)
18
+ {
19
+ super(to, toType);
20
+ }
21
+
22
+ @Override
23
+ protected void fetch(ResultSet from, int fromIndex) throws SQLException
24
+ {
25
+ value = from.getDouble(fromIndex);
26
+ }
27
+
28
+ @Override
29
+ protected Type getDefaultToType()
30
+ {
31
+ return Types.DOUBLE;
32
+ }
33
+
34
+ @Override
35
+ public void booleanColumn(Column column)
36
+ {
37
+ to.setBoolean(column, value > 0.0);
38
+ }
39
+
40
+ @Override
41
+ public void longColumn(Column column)
42
+ {
43
+ long l;
44
+ try {
45
+ // TODO configurable rounding mode
46
+ l = DoubleMath.roundToLong(value, RoundingMode.HALF_UP);
47
+ } catch (ArithmeticException e) {
48
+ // NaN / Infinite / -Infinite
49
+ super.longColumn(column);
50
+ return;
51
+ }
52
+ to.setLong(column, l);
53
+ }
54
+
55
+ @Override
56
+ public void doubleColumn(Column column)
57
+ {
58
+ to.setDouble(column, value);
59
+ }
60
+
61
+ @Override
62
+ public void stringColumn(Column column)
63
+ {
64
+ to.setString(column, Double.toString(value));
65
+ }
66
+ }
@@ -0,0 +1,66 @@
1
+ package org.embulk.input.jdbc.getter;
2
+
3
+ import java.math.RoundingMode;
4
+ import java.sql.ResultSet;
5
+ import java.sql.SQLException;
6
+ import org.embulk.spi.Column;
7
+ import org.embulk.spi.PageBuilder;
8
+ import org.embulk.spi.type.Type;
9
+ import org.embulk.spi.type.Types;
10
+ import com.google.common.math.DoubleMath;
11
+
12
+ public class FloatColumnGetter
13
+ extends AbstractColumnGetter
14
+ {
15
+ protected float value;
16
+
17
+ public FloatColumnGetter(PageBuilder to, Type toType)
18
+ {
19
+ super(to, toType);
20
+ }
21
+
22
+ @Override
23
+ protected void fetch(ResultSet from, int fromIndex) throws SQLException
24
+ {
25
+ value = from.getFloat(fromIndex);
26
+ }
27
+
28
+ @Override
29
+ protected Type getDefaultToType()
30
+ {
31
+ return Types.DOUBLE;
32
+ }
33
+
34
+ @Override
35
+ public void booleanColumn(Column column)
36
+ {
37
+ to.setBoolean(column, value > 0.0);
38
+ }
39
+
40
+ @Override
41
+ public void longColumn(Column column)
42
+ {
43
+ long l;
44
+ try {
45
+ // TODO configurable rounding mode
46
+ l = DoubleMath.roundToLong(value, RoundingMode.HALF_UP);
47
+ } catch (ArithmeticException e) {
48
+ // NaN / Infinite / -Infinite
49
+ super.longColumn(column);
50
+ return;
51
+ }
52
+ to.setLong(column, l);
53
+ }
54
+
55
+ @Override
56
+ public void doubleColumn(Column column)
57
+ {
58
+ to.setDouble(column, value);
59
+ }
60
+
61
+ @Override
62
+ public void stringColumn(Column column)
63
+ {
64
+ to.setString(column, Float.toString(value));
65
+ }
66
+ }