embulk 0.1.0
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 +15 -0
- data/.gitignore +13 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +33 -0
- data/README.md +117 -0
- data/Rakefile +58 -0
- data/bin/embulk +63 -0
- data/build.gradle +149 -0
- data/embulk-cli/build.gradle +6 -0
- data/embulk-cli/pom.xml +94 -0
- data/embulk-cli/src/main/java/org/embulk/cli/Main.java +15 -0
- data/embulk-core/build.gradle +6 -0
- data/embulk-core/pom.xml +143 -0
- data/embulk-core/src/main/java/org/embulk/EmbulkService.java +39 -0
- data/embulk-core/src/main/java/org/embulk/command/Runner.java +199 -0
- data/embulk-core/src/main/java/org/embulk/command/TablePrinter.java +119 -0
- data/embulk-core/src/main/java/org/embulk/config/CommitReport.java +26 -0
- data/embulk-core/src/main/java/org/embulk/config/Config.java +15 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigDefault.java +15 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigException.java +20 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigLoader.java +83 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigSource.java +28 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSource.java +35 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +208 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +80 -0
- data/embulk-core/src/main/java/org/embulk/config/GenericTypeReference.java +20 -0
- data/embulk-core/src/main/java/org/embulk/config/ModelManager.java +125 -0
- data/embulk-core/src/main/java/org/embulk/config/NextConfig.java +26 -0
- data/embulk-core/src/main/java/org/embulk/config/Task.java +10 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskInvocationHandler.java +180 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskSerDe.java +343 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskSource.java +28 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskValidationException.java +37 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskValidator.java +24 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecModule.java +45 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecuteInterruptedException.java +10 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecuteResult.java +19 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExtensionServiceLoaderModule.java +43 -0
- data/embulk-core/src/main/java/org/embulk/exec/ForSystemConfig.java +16 -0
- data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +307 -0
- data/embulk-core/src/main/java/org/embulk/exec/LocalExecutor.java +274 -0
- data/embulk-core/src/main/java/org/embulk/exec/LoggerProvider.java +30 -0
- data/embulk-core/src/main/java/org/embulk/exec/NoSampleException.java +10 -0
- data/embulk-core/src/main/java/org/embulk/exec/PooledBufferAllocator.java +58 -0
- data/embulk-core/src/main/java/org/embulk/exec/PreviewExecutor.java +138 -0
- data/embulk-core/src/main/java/org/embulk/exec/PreviewResult.java +27 -0
- data/embulk-core/src/main/java/org/embulk/exec/PreviewedNoticeError.java +17 -0
- data/embulk-core/src/main/java/org/embulk/exec/SamplingParserPlugin.java +116 -0
- data/embulk-core/src/main/java/org/embulk/exec/SystemConfigModule.java +24 -0
- data/embulk-core/src/main/java/org/embulk/jruby/JRubyPluginSource.java +69 -0
- data/embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.java +100 -0
- data/embulk-core/src/main/java/org/embulk/plugin/BuiltinPluginSourceModule.java +17 -0
- data/embulk-core/src/main/java/org/embulk/plugin/InjectedPluginSource.java +92 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +34 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginSource.java +6 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginSourceNotMatchException.java +19 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginType.java +47 -0
- data/embulk-core/src/main/java/org/embulk/plugin/SetThreadContextClassLoader.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/Buffer.java +113 -0
- data/embulk-core/src/main/java/org/embulk/spi/BufferAllocator.java +8 -0
- data/embulk-core/src/main/java/org/embulk/spi/Column.java +92 -0
- data/embulk-core/src/main/java/org/embulk/spi/ColumnConfig.java +79 -0
- data/embulk-core/src/main/java/org/embulk/spi/DecoderPlugin.java +16 -0
- data/embulk-core/src/main/java/org/embulk/spi/EncoderPlugin.java +16 -0
- data/embulk-core/src/main/java/org/embulk/spi/Exec.java +76 -0
- data/embulk-core/src/main/java/org/embulk/spi/ExecAction.java +6 -0
- data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +105 -0
- data/embulk-core/src/main/java/org/embulk/spi/Extension.java +42 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileInput.java +11 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileInputPlugin.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +113 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileOutput.java +13 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileOutputPlugin.java +20 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +167 -0
- data/embulk-core/src/main/java/org/embulk/spi/FormatterPlugin.java +18 -0
- data/embulk-core/src/main/java/org/embulk/spi/GuessPlugin.java +9 -0
- data/embulk-core/src/main/java/org/embulk/spi/InputPlugin.java +20 -0
- data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +21 -0
- data/embulk-core/src/main/java/org/embulk/spi/Page.java +45 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageBuilder.java +327 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageFormat.java +47 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageOutput.java +11 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageReader.java +227 -0
- data/embulk-core/src/main/java/org/embulk/spi/ParserPlugin.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/Schema.java +101 -0
- data/embulk-core/src/main/java/org/embulk/spi/SchemaConfig.java +52 -0
- data/embulk-core/src/main/java/org/embulk/spi/SchemaVisitor.java +14 -0
- data/embulk-core/src/main/java/org/embulk/spi/Transactional.java +10 -0
- data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileInput.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileOutput.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/TransactionalPageOutput.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/DateTimeZoneSerDe.java +57 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelper.java +8 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelperFactory.java +6 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/Timestamp.java +159 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormat.java +98 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +55 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParseException.java +6 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +60 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampSerDe.java +50 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/AbstractType.java +55 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/BooleanType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/DoubleType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/LongType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/StringType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/TimestampType.java +39 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/Type.java +15 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/TypeDeserializer.java +47 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/Types.java +14 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/CharsetSerDe.java +55 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Decoders.java +81 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Encoders.java +81 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/FileInputInputStream.java +110 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/FileOutputOutputStream.java +94 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamFileInput.java +111 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Inputs.java +74 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/LineDecoder.java +118 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/LineEncoder.java +109 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/ListFileInput.java +52 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Newline.java +38 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java +102 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Pages.java +139 -0
- data/embulk-core/src/test/java/org/embulk/EmbulkTestRuntime.java +110 -0
- data/embulk-core/src/test/java/org/embulk/GuiceBinder.java +72 -0
- data/embulk-core/src/test/java/org/embulk/RandomManager.java +53 -0
- data/embulk-core/src/test/java/org/embulk/TestPluginSourceModule.java +23 -0
- data/embulk-core/src/test/java/org/embulk/TestUtilityModule.java +17 -0
- data/embulk-core/src/test/java/org/embulk/config/TestConfigSource.java +114 -0
- data/embulk-core/src/test/java/org/embulk/config/TestTaskSource.java +70 -0
- data/embulk-core/src/test/java/org/embulk/plugin/MockPluginSource.java +57 -0
- data/embulk-core/src/test/java/org/embulk/plugin/TestPluginType.java +18 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockFileOutput.java +63 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockFormatterPlugin.java +101 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockParserPlugin.java +73 -0
- data/embulk-core/src/test/java/org/embulk/spi/PageTestUtils.java +78 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileInputInputStream.java +67 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +180 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +192 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestInputStreamFileInput.java +188 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestPageBuilderReader.java +301 -0
- data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestamp.java +116 -0
- data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParser.java +52 -0
- data/embulk-core/src/test/java/org/embulk/spi/type/TestTypeSerDe.java +45 -0
- data/embulk-core/src/test/java/org/embulk/spi/util/TestLineDecoder.java +132 -0
- data/embulk-core/src/test/java/org/embulk/spi/util/TestLineEncoder.java +123 -0
- data/embulk-standards/build.gradle +6 -0
- data/embulk-standards/pom.xml +68 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +158 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +233 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvTokenizer.java +355 -0
- data/embulk-standards/src/main/java/org/embulk/standards/GzipFileDecoderPlugin.java +55 -0
- data/embulk-standards/src/main/java/org/embulk/standards/GzipFileEncoderPlugin.java +39 -0
- data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +138 -0
- data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +128 -0
- data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +46 -0
- data/embulk-standards/src/main/java/org/embulk/standards/S3FileInputPlugin.java +238 -0
- data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginExtension.java +16 -0
- data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java +44 -0
- data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +71 -0
- data/embulk-standards/src/main/resources/META-INF/services/org.embulk.spi.Extension +1 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestCsvParserPlugin.java +69 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestCsvTokenizer.java +291 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestS3FileInputPlugin.java +43 -0
- data/embulk.gemspec +27 -0
- data/examples/config.yml +34 -0
- data/examples/csv/sample.csv.gz +0 -0
- data/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/gradle/wrapper/gradle-wrapper.properties +6 -0
- data/gradlew +164 -0
- data/gradlew.bat +90 -0
- data/lib/embulk.rb +16 -0
- data/lib/embulk/buffer.rb +17 -0
- data/lib/embulk/column.rb +47 -0
- data/lib/embulk/command/embulk.rb +39 -0
- data/lib/embulk/command/embulk_example.rb +32 -0
- data/lib/embulk/command/embulk_generate_bin.rb +62 -0
- data/lib/embulk/command/embulk_run.rb +243 -0
- data/lib/embulk/data/bundle/.bundle/config +3 -0
- data/lib/embulk/data/bundle/Gemfile +31 -0
- data/lib/embulk/data/bundle/Gemfile.lock +8 -0
- data/lib/embulk/data/bundle/embulk/input_example.rb +40 -0
- data/lib/embulk/data/bundle/embulk/output_example.rb +51 -0
- data/lib/embulk/data_source.rb +66 -0
- data/lib/embulk/error.rb +5 -0
- data/lib/embulk/guess_charset.rb +26 -0
- data/lib/embulk/guess_csv.rb +195 -0
- data/lib/embulk/guess_gzip.rb +18 -0
- data/lib/embulk/guess_newline.rb +20 -0
- data/lib/embulk/guess_plugin.rb +113 -0
- data/lib/embulk/input_plugin.rb +53 -0
- data/lib/embulk/java/bootstrap.rb +12 -0
- data/lib/embulk/java/imports.rb +26 -0
- data/lib/embulk/java/time_helper.rb +77 -0
- data/lib/embulk/output_plugin.rb +104 -0
- data/lib/embulk/page.rb +28 -0
- data/lib/embulk/page_builder.rb +22 -0
- data/lib/embulk/plugin.rb +152 -0
- data/lib/embulk/plugin_registry.rb +70 -0
- data/lib/embulk/schema.rb +85 -0
- data/lib/embulk/time_format_guess.rb +331 -0
- data/lib/embulk/version.rb +3 -0
- data/pom.xml +533 -0
- data/settings.gradle +5 -0
- metadata +370 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
package org.embulk.spi;
|
|
2
|
+
|
|
3
|
+
import org.embulk.config.TaskSource;
|
|
4
|
+
import org.embulk.config.ConfigSource;
|
|
5
|
+
|
|
6
|
+
public interface ParserPlugin
|
|
7
|
+
{
|
|
8
|
+
public interface Control
|
|
9
|
+
{
|
|
10
|
+
public void run(TaskSource taskSource, Schema schema);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public void transaction(ConfigSource config, ParserPlugin.Control control);
|
|
14
|
+
|
|
15
|
+
public void run(TaskSource taskSource, Schema schema,
|
|
16
|
+
FileInput input, PageOutput output);
|
|
17
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
package org.embulk.spi;
|
|
2
|
+
|
|
3
|
+
import java.util.List;
|
|
4
|
+
import com.google.common.base.Objects;
|
|
5
|
+
import com.fasterxml.jackson.annotation.JsonCreator;
|
|
6
|
+
import com.fasterxml.jackson.annotation.JsonValue;
|
|
7
|
+
import org.embulk.spi.type.Type;
|
|
8
|
+
|
|
9
|
+
public class Schema
|
|
10
|
+
{
|
|
11
|
+
private final List<Column> columns;
|
|
12
|
+
|
|
13
|
+
@JsonCreator
|
|
14
|
+
public Schema(List<Column> columns)
|
|
15
|
+
{
|
|
16
|
+
this.columns = columns;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@JsonValue
|
|
20
|
+
public List<Column> getColumns()
|
|
21
|
+
{
|
|
22
|
+
return columns;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public int getColumnCount()
|
|
26
|
+
{
|
|
27
|
+
return columns.size();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public Column getColumn(int index)
|
|
31
|
+
{
|
|
32
|
+
return columns.get(index);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public String getColumnName(int index)
|
|
36
|
+
{
|
|
37
|
+
return getColumn(index).getName();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public Type getColumnType(int index)
|
|
41
|
+
{
|
|
42
|
+
return getColumn(index).getType();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public void visitColumns(SchemaVisitor visitor)
|
|
46
|
+
{
|
|
47
|
+
for (Column column : columns) {
|
|
48
|
+
column.visit(visitor);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public boolean isEmpty()
|
|
53
|
+
{
|
|
54
|
+
return columns.isEmpty();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public int size()
|
|
58
|
+
{
|
|
59
|
+
return columns.size();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public int getFixedStorageSize()
|
|
63
|
+
{
|
|
64
|
+
int total = 0;
|
|
65
|
+
for (Column column : columns) {
|
|
66
|
+
total += column.getType().getFixedStorageSize();
|
|
67
|
+
}
|
|
68
|
+
return total;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@Override
|
|
72
|
+
public boolean equals(Object obj)
|
|
73
|
+
{
|
|
74
|
+
if (this == obj) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
if (!(obj instanceof Schema)) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
Schema other = (Schema) obj;
|
|
81
|
+
return Objects.equal(columns, other.columns);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@Override
|
|
85
|
+
public int hashCode()
|
|
86
|
+
{
|
|
87
|
+
return Objects.hashCode(columns);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@Override
|
|
91
|
+
public String toString()
|
|
92
|
+
{
|
|
93
|
+
StringBuilder sbuf = new StringBuilder();
|
|
94
|
+
sbuf.append("Schema{\n");
|
|
95
|
+
for (Column c : columns) {
|
|
96
|
+
sbuf.append(String.format(" %4d: %s %s%n", c.getIndex(), c.getName(), c.getType()));
|
|
97
|
+
}
|
|
98
|
+
sbuf.append("}");
|
|
99
|
+
return sbuf.toString();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
package org.embulk.spi;
|
|
2
|
+
|
|
3
|
+
import java.util.List;
|
|
4
|
+
import com.google.common.base.Objects;
|
|
5
|
+
import com.google.common.collect.ImmutableList;
|
|
6
|
+
import com.fasterxml.jackson.annotation.JsonCreator;
|
|
7
|
+
import com.fasterxml.jackson.annotation.JsonValue;
|
|
8
|
+
|
|
9
|
+
public class SchemaConfig
|
|
10
|
+
{
|
|
11
|
+
private final List<ColumnConfig> columns;
|
|
12
|
+
|
|
13
|
+
@JsonCreator
|
|
14
|
+
public SchemaConfig(List<ColumnConfig> columns)
|
|
15
|
+
{
|
|
16
|
+
this.columns = columns;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@JsonValue
|
|
20
|
+
public List<ColumnConfig> getColumns()
|
|
21
|
+
{
|
|
22
|
+
return columns;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public Schema toSchema()
|
|
26
|
+
{
|
|
27
|
+
ImmutableList.Builder<Column> builder = ImmutableList.builder();
|
|
28
|
+
for (int i=0; i < columns.size(); i++) {
|
|
29
|
+
builder.add(columns.get(i).toColumn(i));
|
|
30
|
+
}
|
|
31
|
+
return new Schema(builder.build());
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@Override
|
|
35
|
+
public boolean equals(Object obj)
|
|
36
|
+
{
|
|
37
|
+
if (this == obj) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
if (!(obj instanceof SchemaConfig)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
SchemaConfig other = (SchemaConfig) obj;
|
|
44
|
+
return Objects.equal(columns, other.columns);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@Override
|
|
48
|
+
public int hashCode()
|
|
49
|
+
{
|
|
50
|
+
return Objects.hashCode(columns);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
package org.embulk.spi;
|
|
2
|
+
|
|
3
|
+
public interface SchemaVisitor
|
|
4
|
+
{
|
|
5
|
+
public void booleanColumn(Column column);
|
|
6
|
+
|
|
7
|
+
public void longColumn(Column column);
|
|
8
|
+
|
|
9
|
+
public void doubleColumn(Column column);
|
|
10
|
+
|
|
11
|
+
public void stringColumn(Column column);
|
|
12
|
+
|
|
13
|
+
public void timestampColumn(Column column);
|
|
14
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
package org.embulk.spi;
|
|
2
|
+
|
|
3
|
+
import org.embulk.config.CommitReport;
|
|
4
|
+
|
|
5
|
+
public interface TransactionalFileInput
|
|
6
|
+
extends Transactional, FileInput
|
|
7
|
+
{
|
|
8
|
+
public Buffer poll();
|
|
9
|
+
|
|
10
|
+
public boolean nextFile();
|
|
11
|
+
|
|
12
|
+
public void close();
|
|
13
|
+
|
|
14
|
+
public void abort();
|
|
15
|
+
|
|
16
|
+
public CommitReport commit();
|
|
17
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
package org.embulk.spi;
|
|
2
|
+
|
|
3
|
+
import org.embulk.config.CommitReport;
|
|
4
|
+
|
|
5
|
+
public interface TransactionalFileOutput
|
|
6
|
+
extends Transactional, FileOutput
|
|
7
|
+
{
|
|
8
|
+
public void nextFile();
|
|
9
|
+
|
|
10
|
+
public void add(Buffer buffer);
|
|
11
|
+
|
|
12
|
+
public void finish();
|
|
13
|
+
|
|
14
|
+
public void close();
|
|
15
|
+
|
|
16
|
+
public void abort();
|
|
17
|
+
|
|
18
|
+
public CommitReport commit();
|
|
19
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
package org.embulk.spi;
|
|
2
|
+
|
|
3
|
+
import org.embulk.config.CommitReport;
|
|
4
|
+
|
|
5
|
+
public interface TransactionalPageOutput
|
|
6
|
+
extends Transactional, PageOutput
|
|
7
|
+
{
|
|
8
|
+
public void add(Page page);
|
|
9
|
+
|
|
10
|
+
public void finish();
|
|
11
|
+
|
|
12
|
+
public void close();
|
|
13
|
+
|
|
14
|
+
public void abort();
|
|
15
|
+
|
|
16
|
+
public CommitReport commit();
|
|
17
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
package org.embulk.spi.time;
|
|
2
|
+
|
|
3
|
+
import java.io.IOException;
|
|
4
|
+
import org.joda.time.DateTimeZone;
|
|
5
|
+
import com.fasterxml.jackson.core.JsonGenerator;
|
|
6
|
+
import com.fasterxml.jackson.databind.Module;
|
|
7
|
+
import com.fasterxml.jackson.databind.module.SimpleModule;
|
|
8
|
+
import com.fasterxml.jackson.databind.SerializerProvider;
|
|
9
|
+
import com.fasterxml.jackson.databind.DeserializationContext;
|
|
10
|
+
import com.fasterxml.jackson.databind.JsonSerializer;
|
|
11
|
+
import com.fasterxml.jackson.databind.JsonMappingException;
|
|
12
|
+
import com.fasterxml.jackson.databind.deser.std.FromStringDeserializer;
|
|
13
|
+
import com.fasterxml.jackson.module.guice.ObjectMapperModule;
|
|
14
|
+
import org.embulk.config.ModelManager;
|
|
15
|
+
|
|
16
|
+
public class DateTimeZoneSerDe
|
|
17
|
+
{
|
|
18
|
+
public static void configure(ObjectMapperModule mapper)
|
|
19
|
+
{
|
|
20
|
+
SimpleModule module = new SimpleModule();
|
|
21
|
+
module.addSerializer(DateTimeZone.class, new DateTimeZoneSerializer());
|
|
22
|
+
module.addDeserializer(DateTimeZone.class, new DateTimeZoneDeserializer());
|
|
23
|
+
mapper.registerModule(module);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public static class DateTimeZoneSerializer
|
|
27
|
+
extends JsonSerializer<DateTimeZone>
|
|
28
|
+
{
|
|
29
|
+
@Override
|
|
30
|
+
public void serialize(DateTimeZone value, JsonGenerator jgen, SerializerProvider provider)
|
|
31
|
+
throws IOException
|
|
32
|
+
{
|
|
33
|
+
jgen.writeString(value.getID());
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public static class DateTimeZoneDeserializer
|
|
38
|
+
extends FromStringDeserializer<DateTimeZone>
|
|
39
|
+
{
|
|
40
|
+
public DateTimeZoneDeserializer()
|
|
41
|
+
{
|
|
42
|
+
super(DateTimeZone.class);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@Override
|
|
46
|
+
protected DateTimeZone _deserialize(String value, DeserializationContext context)
|
|
47
|
+
throws JsonMappingException
|
|
48
|
+
{
|
|
49
|
+
DateTimeZone parsed = TimestampFormat.parseDateTimeZone(value);
|
|
50
|
+
if (parsed == null) {
|
|
51
|
+
// TODO include link to a document to the message for the list of supported time zones
|
|
52
|
+
throw new JsonMappingException(String.format("Unknown time zone name '%s'", value));
|
|
53
|
+
}
|
|
54
|
+
return parsed;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
package org.embulk.spi.time;
|
|
2
|
+
|
|
3
|
+
import java.util.regex.Pattern;
|
|
4
|
+
import java.util.regex.Matcher;
|
|
5
|
+
import org.joda.time.format.DateTimeFormat;
|
|
6
|
+
import org.joda.time.format.DateTimeFormatter;
|
|
7
|
+
import org.joda.time.DateTime;
|
|
8
|
+
import org.jruby.Ruby;
|
|
9
|
+
import org.jruby.RubyTime;
|
|
10
|
+
|
|
11
|
+
public class Timestamp
|
|
12
|
+
implements Comparable<Timestamp>
|
|
13
|
+
{
|
|
14
|
+
private final static DateTimeFormatter TO_STRING_FORMATTER_SECONDS = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss z").withZoneUTC();
|
|
15
|
+
private final static DateTimeFormatter TO_STRING_FORMATTER_MILLIS = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS z").withZoneUTC();
|
|
16
|
+
private final static DateTimeFormatter TO_STRING_FORMATTER_CUSTOM = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").withZoneUTC();
|
|
17
|
+
private static final Pattern FROM_STRING_PATTERN = Pattern.compile("(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})(?:\\.(\\d{1,9}))? UTC");
|
|
18
|
+
|
|
19
|
+
private final long seconds;
|
|
20
|
+
private final int nano;
|
|
21
|
+
|
|
22
|
+
private Timestamp(long seconds, int nano)
|
|
23
|
+
{
|
|
24
|
+
this.seconds = seconds;
|
|
25
|
+
this.nano = nano;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public static Timestamp ofEpochSecond(long epochSecond)
|
|
29
|
+
{
|
|
30
|
+
return new Timestamp(epochSecond, 0);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public static Timestamp ofEpochSecond(long epochSecond, long nanoAdjustment)
|
|
34
|
+
{
|
|
35
|
+
return new Timestamp(epochSecond + nanoAdjustment / 1000000000, (int) (nanoAdjustment % 1000000000));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public static Timestamp ofEpochMilli(long epochMilli)
|
|
39
|
+
{
|
|
40
|
+
return new Timestamp(epochMilli / 1000, (int) (epochMilli % 1000 * 1000000));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public long getEpochSecond()
|
|
44
|
+
{
|
|
45
|
+
return seconds;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public int getNano()
|
|
49
|
+
{
|
|
50
|
+
return nano;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public long toEpochMilli()
|
|
54
|
+
{
|
|
55
|
+
return seconds * 1000 + nano / 1000000;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@Override
|
|
59
|
+
public boolean equals(Object other)
|
|
60
|
+
{
|
|
61
|
+
if (this == other) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
if (!(other instanceof Timestamp)) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
Timestamp o = (Timestamp) other;
|
|
68
|
+
return this.seconds == o.seconds && this.nano == o.nano;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@Override
|
|
72
|
+
public int hashCode()
|
|
73
|
+
{
|
|
74
|
+
int h = (int) (seconds ^ (seconds >>> 32));
|
|
75
|
+
h += 17 * nano;
|
|
76
|
+
return h;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@Override
|
|
80
|
+
public int compareTo(Timestamp t)
|
|
81
|
+
{
|
|
82
|
+
if (seconds < t.seconds) {
|
|
83
|
+
return -1;
|
|
84
|
+
} else if (seconds == t.seconds) {
|
|
85
|
+
return nano == t.nano ? 0 : (nano < t.nano ? -1 : 1);
|
|
86
|
+
} else {
|
|
87
|
+
return 1;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
public RubyTime getRubyTime(Ruby runtime)
|
|
92
|
+
{
|
|
93
|
+
RubyTime time = new RubyTime(runtime, runtime.getClass("Time"), new DateTime(toEpochMilli())).gmtime();
|
|
94
|
+
time.setNSec(nano % 1000000);
|
|
95
|
+
return time;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public Timestamp fromRubyTime(RubyTime time)
|
|
99
|
+
{
|
|
100
|
+
long msec = time.getDateTime().getMillis();
|
|
101
|
+
long sec = msec / 1000;
|
|
102
|
+
long nsec = time.getNSec() + (msec % 1000) * 1000000;
|
|
103
|
+
return Timestamp.ofEpochSecond(sec, nsec);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
@Override
|
|
107
|
+
public String toString()
|
|
108
|
+
{
|
|
109
|
+
if (nano == 0) {
|
|
110
|
+
return TO_STRING_FORMATTER_SECONDS.print(getEpochSecond() * 1000);
|
|
111
|
+
|
|
112
|
+
} else if (nano % 1000000 == 0) {
|
|
113
|
+
return TO_STRING_FORMATTER_MILLIS.print(toEpochMilli());
|
|
114
|
+
|
|
115
|
+
} else {
|
|
116
|
+
StringBuffer sb = new StringBuffer();
|
|
117
|
+
TO_STRING_FORMATTER_CUSTOM.printTo(sb, getEpochSecond() * 1000);
|
|
118
|
+
sb.append(".");
|
|
119
|
+
|
|
120
|
+
String digits;
|
|
121
|
+
int zeroDigits;
|
|
122
|
+
if (nano % 1000 == 0) {
|
|
123
|
+
digits = Integer.toString(nano / 1000);
|
|
124
|
+
zeroDigits = 6 - digits.length();
|
|
125
|
+
} else {
|
|
126
|
+
digits = Integer.toString(nano);
|
|
127
|
+
zeroDigits = 9 - digits.length();
|
|
128
|
+
}
|
|
129
|
+
sb.append(digits);
|
|
130
|
+
for (; zeroDigits > 0; zeroDigits--) {
|
|
131
|
+
sb.append('0');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
sb.append(" UTC");
|
|
135
|
+
return sb.toString();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
static Timestamp fromString(String text)
|
|
140
|
+
{
|
|
141
|
+
// TODO exception handling
|
|
142
|
+
Matcher m = FROM_STRING_PATTERN.matcher(text);
|
|
143
|
+
if (!m.matches()) {
|
|
144
|
+
throw new IllegalArgumentException(String.format("Invalid timestamp format '%s'", text));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
long seconds = TO_STRING_FORMATTER_CUSTOM.parseDateTime(m.group(1)).getMillis() / 1000;
|
|
148
|
+
|
|
149
|
+
int nano;
|
|
150
|
+
String frac = m.group(2);
|
|
151
|
+
if (frac == null) {
|
|
152
|
+
nano = 0;
|
|
153
|
+
} else {
|
|
154
|
+
nano = Integer.parseInt(frac) * (int) Math.pow(10, 9 - frac.length());
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return new Timestamp(seconds, nano);
|
|
158
|
+
}
|
|
159
|
+
}
|