embulk-filter-typecast 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +0 -2
- data/CHANGELOG.md +6 -0
- data/build.gradle +14 -12
- data/example/example.yml +1 -0
- data/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/gradle/wrapper/gradle-wrapper.properties +1 -2
- data/gradlew +43 -35
- data/src/main/java/org/embulk/filter/typecast/ColumnCaster.java +182 -150
- metadata +25 -25
- data/example/example.yml +0 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 660f8d578af9db2a6c6e2b0c12a64d4cc5774e0d
|
4
|
+
data.tar.gz: 790fd3279220f52395a135fb13d713e8223950b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24b4d13343b8ceaf5f56d3998f2abc98f3c23da8f1011870191021e1c2f61a2c08b92e4c14bbb0a4d6dcd4bd3b6324c8aef70bf480d7a96a83b3ec6c4e4934c6
|
7
|
+
data.tar.gz: 628eb7e4b885356a53becf47fc6aa9b2176856c0e1ee7b5ed80a40a4eb25e12b072af9e616ff6af524c892ac48e48a53c0e3ba66cad3ade930b42d9fd9722153
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/build.gradle
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
plugins {
|
2
2
|
id "com.jfrog.bintray" version "1.1"
|
3
|
-
id "com.github.jruby-gradle.base" version "
|
3
|
+
id "com.github.jruby-gradle.base" version "1.5.0"
|
4
4
|
id "java"
|
5
5
|
id "checkstyle"
|
6
6
|
}
|
@@ -13,18 +13,18 @@ configurations {
|
|
13
13
|
provided
|
14
14
|
}
|
15
15
|
|
16
|
-
version = "0.2.
|
17
|
-
sourceCompatibility = 1.
|
18
|
-
targetCompatibility = 1.
|
16
|
+
version = "0.2.2"
|
17
|
+
sourceCompatibility = 1.8
|
18
|
+
targetCompatibility = 1.8
|
19
19
|
|
20
20
|
dependencies {
|
21
|
-
compile "org.embulk:embulk-core:0.
|
22
|
-
provided "org.embulk:embulk-core:0.
|
21
|
+
compile "org.embulk:embulk-core:0.9.12"
|
22
|
+
provided "org.embulk:embulk-core:0.9.12"
|
23
23
|
compile "io.github.medjed:JsonPathCompiler:0.1.1"
|
24
24
|
|
25
25
|
testCompile "junit:junit:4.+"
|
26
|
-
testCompile "org.embulk:embulk-core:0.
|
27
|
-
testCompile "org.embulk:embulk-standards:0.
|
26
|
+
testCompile "org.embulk:embulk-core:0.9.12:tests"
|
27
|
+
testCompile "org.embulk:embulk-standards:0.9.12"
|
28
28
|
}
|
29
29
|
|
30
30
|
checkstyle {
|
@@ -39,14 +39,16 @@ task classpath(type: Copy, dependsOn: ["jar"]) {
|
|
39
39
|
clean { delete "classpath" }
|
40
40
|
|
41
41
|
task gem(type: JRubyExec, dependsOn: ["gemspec", "classpath"]) {
|
42
|
-
jrubyArgs "-
|
43
|
-
script "
|
42
|
+
jrubyArgs "-S"
|
43
|
+
script "gem"
|
44
|
+
scriptArgs "build", "${project.name}.gemspec"
|
44
45
|
doLast { ant.move(file: "${project.name}-${project.version}.gem", todir: "pkg") }
|
45
46
|
}
|
46
47
|
|
47
48
|
task gemPush(type: JRubyExec, dependsOn: ["gem"]) {
|
48
|
-
jrubyArgs "-
|
49
|
-
script "
|
49
|
+
jrubyArgs "-S"
|
50
|
+
script "gem"
|
51
|
+
scriptArgs "push", "pkg/${project.name}-${project.version}.gem"
|
50
52
|
}
|
51
53
|
|
52
54
|
task "package"(dependsOn: ["gemspec", "classpath"]) << {
|
data/example/example.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
example/from_string.yml
|
Binary file
|
@@ -1,6 +1,5 @@
|
|
1
|
-
#Wed Aug 09 13:08:20 JST 2017
|
2
1
|
distributionBase=GRADLE_USER_HOME
|
3
2
|
distributionPath=wrapper/dists
|
4
3
|
zipStoreBase=GRADLE_USER_HOME
|
5
4
|
zipStorePath=wrapper/dists
|
6
|
-
distributionUrl=https\://services.gradle.org/distributions/gradle-
|
5
|
+
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-bin.zip
|
data/gradlew
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#!/usr/bin/env
|
1
|
+
#!/usr/bin/env sh
|
2
2
|
|
3
3
|
##############################################################################
|
4
4
|
##
|
@@ -6,20 +6,38 @@
|
|
6
6
|
##
|
7
7
|
##############################################################################
|
8
8
|
|
9
|
-
#
|
10
|
-
|
9
|
+
# Attempt to set APP_HOME
|
10
|
+
# Resolve links: $0 may be a link
|
11
|
+
PRG="$0"
|
12
|
+
# Need this for relative symlinks.
|
13
|
+
while [ -h "$PRG" ] ; do
|
14
|
+
ls=`ls -ld "$PRG"`
|
15
|
+
link=`expr "$ls" : '.*-> \(.*\)$'`
|
16
|
+
if expr "$link" : '/.*' > /dev/null; then
|
17
|
+
PRG="$link"
|
18
|
+
else
|
19
|
+
PRG=`dirname "$PRG"`"/$link"
|
20
|
+
fi
|
21
|
+
done
|
22
|
+
SAVED="`pwd`"
|
23
|
+
cd "`dirname \"$PRG\"`/" >/dev/null
|
24
|
+
APP_HOME="`pwd -P`"
|
25
|
+
cd "$SAVED" >/dev/null
|
11
26
|
|
12
27
|
APP_NAME="Gradle"
|
13
28
|
APP_BASE_NAME=`basename "$0"`
|
14
29
|
|
30
|
+
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
31
|
+
DEFAULT_JVM_OPTS=""
|
32
|
+
|
15
33
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
16
34
|
MAX_FD="maximum"
|
17
35
|
|
18
|
-
warn (
|
36
|
+
warn () {
|
19
37
|
echo "$*"
|
20
38
|
}
|
21
39
|
|
22
|
-
die (
|
40
|
+
die () {
|
23
41
|
echo
|
24
42
|
echo "$*"
|
25
43
|
echo
|
@@ -30,6 +48,7 @@ die ( ) {
|
|
30
48
|
cygwin=false
|
31
49
|
msys=false
|
32
50
|
darwin=false
|
51
|
+
nonstop=false
|
33
52
|
case "`uname`" in
|
34
53
|
CYGWIN* )
|
35
54
|
cygwin=true
|
@@ -40,31 +59,11 @@ case "`uname`" in
|
|
40
59
|
MINGW* )
|
41
60
|
msys=true
|
42
61
|
;;
|
62
|
+
NONSTOP* )
|
63
|
+
nonstop=true
|
64
|
+
;;
|
43
65
|
esac
|
44
66
|
|
45
|
-
# For Cygwin, ensure paths are in UNIX format before anything is touched.
|
46
|
-
if $cygwin ; then
|
47
|
-
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
|
48
|
-
fi
|
49
|
-
|
50
|
-
# Attempt to set APP_HOME
|
51
|
-
# Resolve links: $0 may be a link
|
52
|
-
PRG="$0"
|
53
|
-
# Need this for relative symlinks.
|
54
|
-
while [ -h "$PRG" ] ; do
|
55
|
-
ls=`ls -ld "$PRG"`
|
56
|
-
link=`expr "$ls" : '.*-> \(.*\)$'`
|
57
|
-
if expr "$link" : '/.*' > /dev/null; then
|
58
|
-
PRG="$link"
|
59
|
-
else
|
60
|
-
PRG=`dirname "$PRG"`"/$link"
|
61
|
-
fi
|
62
|
-
done
|
63
|
-
SAVED="`pwd`"
|
64
|
-
cd "`dirname \"$PRG\"`/" >&-
|
65
|
-
APP_HOME="`pwd -P`"
|
66
|
-
cd "$SAVED" >&-
|
67
|
-
|
68
67
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
69
68
|
|
70
69
|
# Determine the Java command to use to start the JVM.
|
@@ -90,7 +89,7 @@ location of your Java installation."
|
|
90
89
|
fi
|
91
90
|
|
92
91
|
# Increase the maximum file descriptors if we can.
|
93
|
-
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
|
92
|
+
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
94
93
|
MAX_FD_LIMIT=`ulimit -H -n`
|
95
94
|
if [ $? -eq 0 ] ; then
|
96
95
|
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
@@ -114,6 +113,7 @@ fi
|
|
114
113
|
if $cygwin ; then
|
115
114
|
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
116
115
|
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
116
|
+
JAVACMD=`cygpath --unix "$JAVACMD"`
|
117
117
|
|
118
118
|
# We build the pattern for arguments to be converted via cygpath
|
119
119
|
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
@@ -154,11 +154,19 @@ if $cygwin ; then
|
|
154
154
|
esac
|
155
155
|
fi
|
156
156
|
|
157
|
-
#
|
158
|
-
|
159
|
-
|
157
|
+
# Escape application args
|
158
|
+
save () {
|
159
|
+
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
160
|
+
echo " "
|
160
161
|
}
|
161
|
-
|
162
|
-
|
162
|
+
APP_ARGS=$(save "$@")
|
163
|
+
|
164
|
+
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
165
|
+
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
166
|
+
|
167
|
+
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
168
|
+
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
169
|
+
cd "$(dirname "$0")"
|
170
|
+
fi
|
163
171
|
|
164
|
-
exec "$JAVACMD" "
|
172
|
+
exec "$JAVACMD" "$@"
|
@@ -29,7 +29,6 @@ import org.embulk.spi.type.StringType;
|
|
29
29
|
import org.embulk.spi.type.TimestampType;
|
30
30
|
import org.embulk.spi.type.Type;
|
31
31
|
import org.joda.time.DateTimeZone;
|
32
|
-
import org.jruby.embed.ScriptingContainer;
|
33
32
|
import org.msgpack.value.Value;
|
34
33
|
|
35
34
|
import org.slf4j.Logger;
|
@@ -71,7 +70,7 @@ class ColumnCaster
|
|
71
70
|
}
|
72
71
|
Column inputColumn = inputSchema.lookupColumn(columnConfig.getName());
|
73
72
|
if (inputColumn.getType() instanceof StringType && columnConfig.getType() instanceof TimestampType) {
|
74
|
-
TimestampParser parser =
|
73
|
+
TimestampParser parser = createTimestampParser(task, columnConfig);
|
75
74
|
this.timestampParserMap.put(columnConfig.getName(), parser);
|
76
75
|
}
|
77
76
|
}
|
@@ -86,159 +85,12 @@ class ColumnCaster
|
|
86
85
|
}
|
87
86
|
Column inputColumn = inputSchema.lookupColumn(columnConfig.getName());
|
88
87
|
if (inputColumn.getType() instanceof TimestampType && columnConfig.getType() instanceof StringType) {
|
89
|
-
TimestampFormatter parser =
|
88
|
+
TimestampFormatter parser = createTimestampFormatter(task, columnConfig);
|
90
89
|
this.timestampFormatterMap.put(columnConfig.getName(), parser);
|
91
90
|
}
|
92
91
|
}
|
93
92
|
}
|
94
93
|
|
95
|
-
private class TimestampParserTaskImpl implements TimestampParser.Task
|
96
|
-
{
|
97
|
-
private final DateTimeZone defaultTimeZone;
|
98
|
-
private final String defaultTimestampFormat;
|
99
|
-
private final String defaultDate;
|
100
|
-
public TimestampParserTaskImpl(
|
101
|
-
DateTimeZone defaultTimeZone,
|
102
|
-
String defaultTimestampFormat,
|
103
|
-
String defaultDate)
|
104
|
-
{
|
105
|
-
this.defaultTimeZone = defaultTimeZone;
|
106
|
-
this.defaultTimestampFormat = defaultTimestampFormat;
|
107
|
-
this.defaultDate = defaultDate;
|
108
|
-
}
|
109
|
-
@Override
|
110
|
-
public DateTimeZone getDefaultTimeZone()
|
111
|
-
{
|
112
|
-
return this.defaultTimeZone;
|
113
|
-
}
|
114
|
-
@Override
|
115
|
-
public String getDefaultTimestampFormat()
|
116
|
-
{
|
117
|
-
return this.defaultTimestampFormat;
|
118
|
-
}
|
119
|
-
@Override
|
120
|
-
public String getDefaultDate()
|
121
|
-
{
|
122
|
-
return this.defaultDate;
|
123
|
-
}
|
124
|
-
@Override
|
125
|
-
public ScriptingContainer getJRuby()
|
126
|
-
{
|
127
|
-
return null;
|
128
|
-
}
|
129
|
-
}
|
130
|
-
|
131
|
-
private class TimestampParserColumnOptionImpl implements TimestampParser.TimestampColumnOption
|
132
|
-
{
|
133
|
-
private final Optional<DateTimeZone> timeZone;
|
134
|
-
private final Optional<String> format;
|
135
|
-
private final Optional<String> date;
|
136
|
-
public TimestampParserColumnOptionImpl(
|
137
|
-
Optional<DateTimeZone> timeZone,
|
138
|
-
Optional<String> format,
|
139
|
-
Optional<String> date)
|
140
|
-
{
|
141
|
-
this.timeZone = timeZone;
|
142
|
-
this.format = format;
|
143
|
-
this.date = date;
|
144
|
-
}
|
145
|
-
@Override
|
146
|
-
public Optional<DateTimeZone> getTimeZone()
|
147
|
-
{
|
148
|
-
return this.timeZone;
|
149
|
-
}
|
150
|
-
@Override
|
151
|
-
public Optional<String> getFormat()
|
152
|
-
{
|
153
|
-
return this.format;
|
154
|
-
}
|
155
|
-
@Override
|
156
|
-
public Optional<String> getDate()
|
157
|
-
{
|
158
|
-
return this.date;
|
159
|
-
}
|
160
|
-
}
|
161
|
-
|
162
|
-
private class TimestampFormatterTaskImpl implements TimestampFormatter.Task
|
163
|
-
{
|
164
|
-
private final DateTimeZone defaultTimeZone;
|
165
|
-
private final String defaultTimestampFormat;
|
166
|
-
public TimestampFormatterTaskImpl(
|
167
|
-
DateTimeZone defaultTimeZone,
|
168
|
-
String defaultTimestampFormat)
|
169
|
-
{
|
170
|
-
this.defaultTimeZone = defaultTimeZone;
|
171
|
-
this.defaultTimestampFormat = defaultTimestampFormat;
|
172
|
-
}
|
173
|
-
@Override
|
174
|
-
public DateTimeZone getDefaultTimeZone()
|
175
|
-
{
|
176
|
-
return this.defaultTimeZone;
|
177
|
-
}
|
178
|
-
@Override
|
179
|
-
public String getDefaultTimestampFormat()
|
180
|
-
{
|
181
|
-
return this.defaultTimestampFormat;
|
182
|
-
}
|
183
|
-
@Override
|
184
|
-
public ScriptingContainer getJRuby()
|
185
|
-
{
|
186
|
-
return null;
|
187
|
-
}
|
188
|
-
}
|
189
|
-
|
190
|
-
private class TimestampFormatterColumnOptionImpl implements TimestampFormatter.TimestampColumnOption
|
191
|
-
{
|
192
|
-
private final Optional<DateTimeZone> timeZone;
|
193
|
-
private final Optional<String> format;
|
194
|
-
public TimestampFormatterColumnOptionImpl(
|
195
|
-
Optional<DateTimeZone> timeZone,
|
196
|
-
Optional<String> format)
|
197
|
-
{
|
198
|
-
this.timeZone = timeZone;
|
199
|
-
this.format = format;
|
200
|
-
}
|
201
|
-
@Override
|
202
|
-
public Optional<DateTimeZone> getTimeZone()
|
203
|
-
{
|
204
|
-
return this.timeZone;
|
205
|
-
}
|
206
|
-
@Override
|
207
|
-
public Optional<String> getFormat()
|
208
|
-
{
|
209
|
-
return this.format;
|
210
|
-
}
|
211
|
-
}
|
212
|
-
|
213
|
-
private TimestampParser getTimestampParser(PluginTask task, ColumnConfig columnConfig)
|
214
|
-
{
|
215
|
-
// ToDo: Use following codes after deciding to drop supporting embulk < 0.8.29.
|
216
|
-
//
|
217
|
-
// DateTimeZone timezone = columnConfig.getTimeZone().or(task.getDefaultTimeZone());
|
218
|
-
// String format = columnConfig.getFormat().or(task.getDefaultTimestampFormat());
|
219
|
-
// String date = columnConfig.getDate().or(task.getDefaultDate());
|
220
|
-
// return new TimestampParser(format, timezone, date);
|
221
|
-
TimestampParserTaskImpl t = new TimestampParserTaskImpl(
|
222
|
-
task.getDefaultTimeZone(), task.getDefaultTimestampFormat(), task.getDefaultDate());
|
223
|
-
TimestampParserColumnOptionImpl columnOption = new TimestampParserColumnOptionImpl(
|
224
|
-
columnConfig.getTimeZone(), columnConfig.getFormat(), columnConfig.getDate());
|
225
|
-
return new TimestampParser(t, columnOption);
|
226
|
-
}
|
227
|
-
|
228
|
-
private TimestampFormatter getTimestampFormatter(PluginTask task, ColumnConfig columnConfig)
|
229
|
-
{
|
230
|
-
// ToDo: Use following codes after deciding to drop supporting embulk < 0.8.29.
|
231
|
-
//
|
232
|
-
// String format = columnConfig.getFormat().or(task.getDefaultTimestampFormat());
|
233
|
-
// DateTimeZone timezone = columnConfig.getTimeZone().or(task.getDefaultTimeZone());
|
234
|
-
// return new TimestampFormatter(format, timezone);
|
235
|
-
TimestampFormatterTaskImpl t = new TimestampFormatterTaskImpl(
|
236
|
-
task.getDefaultTimeZone(), task.getDefaultTimestampFormat());
|
237
|
-
TimestampFormatterColumnOptionImpl columnOption = new TimestampFormatterColumnOptionImpl(
|
238
|
-
columnConfig.getTimeZone(), columnConfig.getFormat());
|
239
|
-
return new TimestampFormatter(t, Optional.of(columnOption));
|
240
|
-
}
|
241
|
-
|
242
94
|
public void setFromBoolean(Column outputColumn, boolean value)
|
243
95
|
{
|
244
96
|
Type outputType = outputColumn.getType();
|
@@ -403,4 +255,184 @@ class ColumnCaster
|
|
403
255
|
assert false;
|
404
256
|
}
|
405
257
|
}
|
258
|
+
|
259
|
+
private TimestampFormatter createTimestampFormatter(PluginTask task, ColumnConfig columnConfig)
|
260
|
+
{
|
261
|
+
String format = columnConfig.getFormat().or(task.getDefaultTimestampFormat());
|
262
|
+
DateTimeZone timezone = columnConfig.getTimeZone().or(task.getDefaultTimeZone());
|
263
|
+
return createTimestampFormatter(format, timezone);
|
264
|
+
}
|
265
|
+
|
266
|
+
private TimestampParser createTimestampParser(PluginTask task, ColumnConfig columnConfig)
|
267
|
+
{
|
268
|
+
DateTimeZone timezone = columnConfig.getTimeZone().or(task.getDefaultTimeZone());
|
269
|
+
String format = columnConfig.getFormat().or(task.getDefaultTimestampFormat());
|
270
|
+
String date = columnConfig.getDate().or(task.getDefaultDate());
|
271
|
+
return createTimestampParser(format, timezone, date);
|
272
|
+
}
|
273
|
+
|
274
|
+
private class TimestampFormatterTaskImpl implements TimestampFormatter.Task
|
275
|
+
{
|
276
|
+
private final DateTimeZone defaultTimeZone;
|
277
|
+
private final String defaultTimestampFormat;
|
278
|
+
public TimestampFormatterTaskImpl(
|
279
|
+
DateTimeZone defaultTimeZone,
|
280
|
+
String defaultTimestampFormat)
|
281
|
+
{
|
282
|
+
this.defaultTimeZone = defaultTimeZone;
|
283
|
+
this.defaultTimestampFormat = defaultTimestampFormat;
|
284
|
+
}
|
285
|
+
@Override
|
286
|
+
public DateTimeZone getDefaultTimeZone()
|
287
|
+
{
|
288
|
+
return this.defaultTimeZone;
|
289
|
+
}
|
290
|
+
@Override
|
291
|
+
public String getDefaultTimeZoneId()
|
292
|
+
{
|
293
|
+
return this.defaultTimeZone.getID();
|
294
|
+
}
|
295
|
+
@Override
|
296
|
+
public String getDefaultTimestampFormat()
|
297
|
+
{
|
298
|
+
return this.defaultTimestampFormat;
|
299
|
+
}
|
300
|
+
}
|
301
|
+
|
302
|
+
private class TimestampFormatterColumnOptionImpl implements TimestampFormatter.TimestampColumnOption
|
303
|
+
{
|
304
|
+
private final Optional<DateTimeZone> timeZone;
|
305
|
+
private final Optional<String> format;
|
306
|
+
public TimestampFormatterColumnOptionImpl(
|
307
|
+
Optional<DateTimeZone> timeZone,
|
308
|
+
Optional<String> format)
|
309
|
+
{
|
310
|
+
this.timeZone = timeZone;
|
311
|
+
this.format = format;
|
312
|
+
}
|
313
|
+
@Override
|
314
|
+
public Optional<DateTimeZone> getTimeZone()
|
315
|
+
{
|
316
|
+
return this.timeZone;
|
317
|
+
}
|
318
|
+
@Override
|
319
|
+
public Optional<String> getFormat()
|
320
|
+
{
|
321
|
+
return this.format;
|
322
|
+
}
|
323
|
+
@Override
|
324
|
+
public Optional<String> getTimeZoneId()
|
325
|
+
{
|
326
|
+
if (this.timeZone.isPresent()) {
|
327
|
+
return Optional.of(this.timeZone.get().getID());
|
328
|
+
}
|
329
|
+
else {
|
330
|
+
return Optional.absent();
|
331
|
+
}
|
332
|
+
}
|
333
|
+
}
|
334
|
+
|
335
|
+
// ToDo: Replace with `TimestampFormatter.of(Task, TimestampColumnOption)`
|
336
|
+
// after deciding to drop supporting embulk < 0.8.29.
|
337
|
+
private TimestampFormatter createTimestampFormatter(String format, DateTimeZone timezone)
|
338
|
+
{
|
339
|
+
TimestampFormatterTaskImpl task = new TimestampFormatterTaskImpl(timezone, format);
|
340
|
+
TimestampFormatterColumnOptionImpl columnOption = new TimestampFormatterColumnOptionImpl(
|
341
|
+
Optional.of(timezone), Optional.of(format));
|
342
|
+
return new TimestampFormatter(task, Optional.of(columnOption));
|
343
|
+
}
|
344
|
+
|
345
|
+
private class TimestampParserTaskImpl implements TimestampParser.Task
|
346
|
+
{
|
347
|
+
private final DateTimeZone defaultTimeZone;
|
348
|
+
private final String defaultTimestampFormat;
|
349
|
+
private final String defaultDate;
|
350
|
+
public TimestampParserTaskImpl(
|
351
|
+
DateTimeZone defaultTimeZone,
|
352
|
+
String defaultTimestampFormat,
|
353
|
+
String defaultDate)
|
354
|
+
{
|
355
|
+
this.defaultTimeZone = defaultTimeZone;
|
356
|
+
this.defaultTimestampFormat = defaultTimestampFormat;
|
357
|
+
this.defaultDate = defaultDate;
|
358
|
+
}
|
359
|
+
@Override
|
360
|
+
public DateTimeZone getDefaultTimeZone()
|
361
|
+
{
|
362
|
+
return this.defaultTimeZone;
|
363
|
+
}
|
364
|
+
@Override
|
365
|
+
public String getDefaultTimeZoneId()
|
366
|
+
{
|
367
|
+
return this.defaultTimeZone.getID();
|
368
|
+
}
|
369
|
+
@Override
|
370
|
+
public String getDefaultTimestampFormat()
|
371
|
+
{
|
372
|
+
return this.defaultTimestampFormat;
|
373
|
+
}
|
374
|
+
@Override
|
375
|
+
public String getDefaultDate()
|
376
|
+
{
|
377
|
+
return this.defaultDate;
|
378
|
+
}
|
379
|
+
}
|
380
|
+
|
381
|
+
private class TimestampParserColumnOptionImpl implements TimestampParser.TimestampColumnOption
|
382
|
+
{
|
383
|
+
private final Optional<DateTimeZone> timeZone;
|
384
|
+
private final Optional<String> format;
|
385
|
+
private final Optional<String> date;
|
386
|
+
public TimestampParserColumnOptionImpl(
|
387
|
+
Optional<DateTimeZone> timeZone,
|
388
|
+
Optional<String> format,
|
389
|
+
Optional<String> date)
|
390
|
+
{
|
391
|
+
this.timeZone = timeZone;
|
392
|
+
this.format = format;
|
393
|
+
this.date = date;
|
394
|
+
}
|
395
|
+
@Override
|
396
|
+
public Optional<DateTimeZone> getTimeZone()
|
397
|
+
{
|
398
|
+
return this.timeZone;
|
399
|
+
}
|
400
|
+
@Override
|
401
|
+
public Optional<String> getFormat()
|
402
|
+
{
|
403
|
+
return this.format;
|
404
|
+
}
|
405
|
+
@Override
|
406
|
+
public Optional<String> getDate()
|
407
|
+
{
|
408
|
+
return this.date;
|
409
|
+
}
|
410
|
+
@Override
|
411
|
+
public Optional<String> getTimeZoneId()
|
412
|
+
{
|
413
|
+
if (this.timeZone.isPresent()) {
|
414
|
+
return Optional.of(this.timeZone.get().getID());
|
415
|
+
}
|
416
|
+
else {
|
417
|
+
return Optional.absent();
|
418
|
+
}
|
419
|
+
}
|
420
|
+
}
|
421
|
+
|
422
|
+
// ToDo: Replace with `TimestampParser.of(Task, TimestampColumnOption)`
|
423
|
+
// after deciding to drop supporting embulk < 0.8.29.
|
424
|
+
private TimestampParser createTimestampParser(String format, DateTimeZone timezone)
|
425
|
+
{
|
426
|
+
return createTimestampParser(format, timezone, "1970-01-01");
|
427
|
+
}
|
428
|
+
|
429
|
+
// ToDo: Replace with `TimestampParser.of(Task, TimestampColumnOption)`
|
430
|
+
// after deciding to drop supporting embulk < 0.8.29.
|
431
|
+
private TimestampParser createTimestampParser(String format, DateTimeZone timezone, String date)
|
432
|
+
{
|
433
|
+
TimestampParserTaskImpl task = new TimestampParserTaskImpl(timezone, format, date);
|
434
|
+
TimestampParserColumnOptionImpl columnOption = new TimestampParserColumnOptionImpl(
|
435
|
+
Optional.of(timezone), Optional.of(format), Optional.of(date));
|
436
|
+
return new TimestampParser(task, columnOption);
|
437
|
+
}
|
406
438
|
}
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embulk-filter-typecast
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Naotoshi Seo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
version_requirements: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ~>
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.0'
|
20
14
|
requirement: !ruby/object:Gem::Requirement
|
21
15
|
requirements:
|
22
|
-
- - ~>
|
16
|
+
- - "~>"
|
23
17
|
- !ruby/object:Gem::Version
|
24
18
|
version: '1.0'
|
19
|
+
name: bundler
|
25
20
|
prerelease: false
|
26
21
|
type: :development
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rake
|
29
22
|
version_requirements: !ruby/object:Gem::Requirement
|
30
23
|
requirements:
|
31
|
-
- -
|
24
|
+
- - "~>"
|
32
25
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
26
|
+
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
34
28
|
requirement: !ruby/object:Gem::Requirement
|
35
29
|
requirements:
|
36
|
-
- -
|
30
|
+
- - ">="
|
37
31
|
- !ruby/object:Gem::Version
|
38
32
|
version: '10.0'
|
33
|
+
name: rake
|
39
34
|
prerelease: false
|
40
35
|
type: :development
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
41
|
description: A filter plugin for Embulk to cast column type.
|
42
42
|
email:
|
43
43
|
- sonots@gmail.com
|
@@ -45,12 +45,18 @@ executables: []
|
|
45
45
|
extensions: []
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
|
-
- .gitignore
|
49
|
-
- .travis.yml
|
48
|
+
- ".gitignore"
|
49
|
+
- ".travis.yml"
|
50
50
|
- CHANGELOG.md
|
51
51
|
- LICENSE.txt
|
52
52
|
- README.md
|
53
53
|
- build.gradle
|
54
|
+
- classpath/JsonPathCompiler-0.1.1.jar
|
55
|
+
- classpath/accessors-smart-1.1.jar
|
56
|
+
- classpath/asm-5.0.3.jar
|
57
|
+
- classpath/embulk-filter-typecast-0.2.2.jar
|
58
|
+
- classpath/json-smart-2.2.1.jar
|
59
|
+
- classpath/slf4j-api-1.7.21.jar
|
54
60
|
- config/checkstyle/checkstyle.xml
|
55
61
|
- example/empty.yml
|
56
62
|
- example/example.csv
|
@@ -86,12 +92,6 @@ files:
|
|
86
92
|
- src/test/java/org/embulk/filter/typecast/cast/TestLongCast.java
|
87
93
|
- src/test/java/org/embulk/filter/typecast/cast/TestStringCast.java
|
88
94
|
- src/test/java/org/embulk/filter/typecast/cast/TestTimestampCast.java
|
89
|
-
- classpath/accessors-smart-1.1.jar
|
90
|
-
- classpath/asm-5.0.3.jar
|
91
|
-
- classpath/embulk-filter-typecast-0.2.1.jar
|
92
|
-
- classpath/json-smart-2.2.1.jar
|
93
|
-
- classpath/JsonPathCompiler-0.1.1.jar
|
94
|
-
- classpath/slf4j-api-1.7.21.jar
|
95
95
|
homepage: https://github.com/sonots/embulk-filter-typecast
|
96
96
|
licenses:
|
97
97
|
- MIT
|
@@ -102,17 +102,17 @@ require_paths:
|
|
102
102
|
- lib
|
103
103
|
required_ruby_version: !ruby/object:Gem::Requirement
|
104
104
|
requirements:
|
105
|
-
- -
|
105
|
+
- - ">="
|
106
106
|
- !ruby/object:Gem::Version
|
107
107
|
version: '0'
|
108
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
109
|
requirements:
|
110
|
-
- -
|
110
|
+
- - ">="
|
111
111
|
- !ruby/object:Gem::Version
|
112
112
|
version: '0'
|
113
113
|
requirements: []
|
114
114
|
rubyforge_project:
|
115
|
-
rubygems_version: 2.
|
115
|
+
rubygems_version: 2.6.8
|
116
116
|
signing_key:
|
117
117
|
specification_version: 4
|
118
118
|
summary: A filter plugin for Embulk to cast column type
|
data/example/example.yml
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
in:
|
2
|
-
type: file
|
3
|
-
path_prefix: example/example.csv
|
4
|
-
parser:
|
5
|
-
type: csv
|
6
|
-
charset: UTF-8
|
7
|
-
newline: CRLF
|
8
|
-
null_string: ''
|
9
|
-
skip_header_lines: 1
|
10
|
-
comment_line_marker: '#'
|
11
|
-
columns:
|
12
|
-
- {name: timestamp, type: string}
|
13
|
-
- {name: "null", type: string}
|
14
|
-
- {name: long, type: string}
|
15
|
-
- {name: string, type: string}
|
16
|
-
- {name: double, type: string}
|
17
|
-
- {name: json1, type: string}
|
18
|
-
- {name: json2, type: string}
|
19
|
-
- {name: array_str, type: string}
|
20
|
-
- {name: array_int, type: string}
|
21
|
-
- {name: ignore, type: string}
|
22
|
-
- {name: boolean, type: string}
|
23
|
-
filters:
|
24
|
-
- type: typecast
|
25
|
-
columns:
|
26
|
-
- {name: timestamp, type: timestamp, format: "%Y-%m-%d %H:%M:%S.%N", timezone: "+09:00"}
|
27
|
-
- {name: "null", type: long}
|
28
|
-
- {name: long, type: long}
|
29
|
-
- {name: string, type: string}
|
30
|
-
- {name: double, type: double}
|
31
|
-
- {name: json1, type: json}
|
32
|
-
- {name: json2, type: json}
|
33
|
-
- {name: array_str, type: json}
|
34
|
-
- {name: array_int, type: json}
|
35
|
-
- {name: boolean, type: boolean}
|
36
|
-
- {name: "$.json1.string", type: long}
|
37
|
-
- {name: "$.json2.long", type: long}
|
38
|
-
- {name: "$.array_str[0]", type: long}
|
39
|
-
- {name: "$.array_int[*]", type: long}
|
40
|
-
out:
|
41
|
-
type: "null"
|