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,38 @@
|
|
|
1
|
+
package org.embulk.spi.util;
|
|
2
|
+
|
|
3
|
+
public enum Newline
|
|
4
|
+
{
|
|
5
|
+
CRLF("\r\n"),
|
|
6
|
+
LF("\n"),
|
|
7
|
+
CR("\r");
|
|
8
|
+
|
|
9
|
+
private final String string;
|
|
10
|
+
private final char firstCharCode;
|
|
11
|
+
private final char secondCharCode;
|
|
12
|
+
|
|
13
|
+
private Newline(String string)
|
|
14
|
+
{
|
|
15
|
+
this.string = string;
|
|
16
|
+
this.firstCharCode = string.charAt(0);
|
|
17
|
+
if (string.length() > 1) {
|
|
18
|
+
this.secondCharCode = string.charAt(1);
|
|
19
|
+
} else {
|
|
20
|
+
this.secondCharCode = 0;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public String getString()
|
|
25
|
+
{
|
|
26
|
+
return string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public char getFirstCharCode()
|
|
30
|
+
{
|
|
31
|
+
return firstCharCode;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public char getSecondCharCode()
|
|
35
|
+
{
|
|
36
|
+
return secondCharCode;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
package org.embulk.spi.util;
|
|
2
|
+
|
|
3
|
+
import java.util.List;
|
|
4
|
+
import java.util.ArrayList;
|
|
5
|
+
import org.embulk.spi.time.Timestamp;
|
|
6
|
+
import org.embulk.spi.time.TimestampFormatter;
|
|
7
|
+
import org.embulk.spi.Schema;
|
|
8
|
+
import org.embulk.spi.Column;
|
|
9
|
+
import org.embulk.spi.PageReader;
|
|
10
|
+
import org.embulk.spi.SchemaVisitor;
|
|
11
|
+
import org.embulk.spi.type.TimestampType;
|
|
12
|
+
|
|
13
|
+
public class PagePrinter
|
|
14
|
+
{
|
|
15
|
+
private final Schema schema;
|
|
16
|
+
private final TimestampFormatter[] timestampFormatters;
|
|
17
|
+
private final ArrayList<String> record;
|
|
18
|
+
|
|
19
|
+
public PagePrinter(Schema schema, TimestampFormatter.FormatterTask task)
|
|
20
|
+
{
|
|
21
|
+
this.schema = schema;
|
|
22
|
+
this.timestampFormatters = new TimestampFormatter[schema.getColumnCount()];
|
|
23
|
+
for (int i=0; i < timestampFormatters.length; i++) {
|
|
24
|
+
if (schema.getColumnType(i) instanceof TimestampType) {
|
|
25
|
+
TimestampType type = (TimestampType) schema.getColumnType(i);
|
|
26
|
+
timestampFormatters[i] = new TimestampFormatter(type.getFormat(), task);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
this.record = new ArrayList(schema.getColumnCount());
|
|
31
|
+
for (int i=0; i < schema.getColumnCount(); i++) {
|
|
32
|
+
record.add("");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public String printRecord(PageReader reader, String delimiter)
|
|
37
|
+
{
|
|
38
|
+
StringBuilder sb = new StringBuilder();
|
|
39
|
+
for (Column c : schema.getColumns()) {
|
|
40
|
+
if (c.getIndex() != 0) {
|
|
41
|
+
sb.append(delimiter);
|
|
42
|
+
}
|
|
43
|
+
sb.append(printColumn(reader, c));
|
|
44
|
+
}
|
|
45
|
+
return sb.toString();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public List<String> printRecord(PageReader reader)
|
|
49
|
+
{
|
|
50
|
+
for (Column c : schema.getColumns()) {
|
|
51
|
+
record.set(c.getIndex(), printColumn(reader, c));
|
|
52
|
+
}
|
|
53
|
+
return record;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public String printColumn(PageReader reader, Column column)
|
|
57
|
+
{
|
|
58
|
+
if (reader.isNull(column)) {
|
|
59
|
+
return "";
|
|
60
|
+
}
|
|
61
|
+
ToStringSchemaVisitor visitor = new ToStringSchemaVisitor(reader);
|
|
62
|
+
column.visit(visitor);
|
|
63
|
+
return visitor.string;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private class ToStringSchemaVisitor
|
|
67
|
+
implements SchemaVisitor
|
|
68
|
+
{
|
|
69
|
+
private final PageReader reader;
|
|
70
|
+
String string = "";
|
|
71
|
+
|
|
72
|
+
public ToStringSchemaVisitor(PageReader reader)
|
|
73
|
+
{
|
|
74
|
+
this.reader = reader;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
public void booleanColumn(Column column)
|
|
78
|
+
{
|
|
79
|
+
string = Boolean.toString(reader.getBoolean(column));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public void longColumn(Column column)
|
|
83
|
+
{
|
|
84
|
+
string = Long.toString(reader.getLong(column));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
public void doubleColumn(Column column)
|
|
88
|
+
{
|
|
89
|
+
string = Double.toString(reader.getDouble(column));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public void stringColumn(Column column)
|
|
93
|
+
{
|
|
94
|
+
string = reader.getString(column);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
public void timestampColumn(Column column)
|
|
98
|
+
{
|
|
99
|
+
string = timestampFormatters[column.getIndex()].format(reader.getTimestamp(column));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
package org.embulk.spi.util;
|
|
2
|
+
|
|
3
|
+
import java.util.List;
|
|
4
|
+
import java.util.Iterator;
|
|
5
|
+
import com.google.common.collect.ImmutableList;
|
|
6
|
+
import org.embulk.spi.time.Timestamp;
|
|
7
|
+
import org.embulk.spi.Schema;
|
|
8
|
+
import org.embulk.spi.SchemaVisitor;
|
|
9
|
+
import org.embulk.spi.Column;
|
|
10
|
+
import org.embulk.spi.Page;
|
|
11
|
+
import org.embulk.spi.PageReader;
|
|
12
|
+
|
|
13
|
+
public class Pages
|
|
14
|
+
{
|
|
15
|
+
public static List<Object[]> toObjects(Schema schema, Page page)
|
|
16
|
+
{
|
|
17
|
+
return toObjects(schema, ImmutableList.of(page));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// TODO use streaming and return Iterable
|
|
21
|
+
public static List<Object[]> toObjects(Schema schema, Iterable<Page> pages)
|
|
22
|
+
{
|
|
23
|
+
ImmutableList.Builder<Object[]> builder = ImmutableList.builder();
|
|
24
|
+
Iterator<Page> ite = pages.iterator();
|
|
25
|
+
try (PageReader reader = new PageReader(schema)) {
|
|
26
|
+
while (ite.hasNext()) {
|
|
27
|
+
reader.setPage(ite.next());
|
|
28
|
+
while (reader.nextRecord()) {
|
|
29
|
+
builder.add(toObjects(reader));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return builder.build();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public static Object[] toObjects(final PageReader record)
|
|
37
|
+
{
|
|
38
|
+
final Object[] values = new Object[record.getSchema().getColumns().size()];
|
|
39
|
+
record.getSchema().visitColumns(new ObjectSchemaVisitor(record) {
|
|
40
|
+
@Override
|
|
41
|
+
public void visit(Column column, Object object)
|
|
42
|
+
{
|
|
43
|
+
values[column.getIndex()] = object;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return values;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public static abstract class ObjectSchemaVisitor
|
|
50
|
+
implements SchemaVisitor
|
|
51
|
+
{
|
|
52
|
+
private final PageReader record;
|
|
53
|
+
|
|
54
|
+
public ObjectSchemaVisitor(PageReader record)
|
|
55
|
+
{
|
|
56
|
+
this.record = record;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public abstract void visit(Column column, Object obj);
|
|
60
|
+
|
|
61
|
+
@Override
|
|
62
|
+
public void booleanColumn(Column column)
|
|
63
|
+
{
|
|
64
|
+
if (record.isNull(column)) {
|
|
65
|
+
visit(column, null);
|
|
66
|
+
} else {
|
|
67
|
+
visit(column, record.getBoolean(column));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@Override
|
|
72
|
+
public void longColumn(Column column)
|
|
73
|
+
{
|
|
74
|
+
if (record.isNull(column)) {
|
|
75
|
+
visit(column, null);
|
|
76
|
+
} else {
|
|
77
|
+
visit(column, record.getLong(column));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@Override
|
|
82
|
+
public void doubleColumn(Column column)
|
|
83
|
+
{
|
|
84
|
+
if (record.isNull(column)) {
|
|
85
|
+
visit(column, null);
|
|
86
|
+
} else {
|
|
87
|
+
visit(column, record.getDouble(column));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@Override
|
|
92
|
+
public void stringColumn(Column column)
|
|
93
|
+
{
|
|
94
|
+
if (record.isNull(column)) {
|
|
95
|
+
visit(column, null);
|
|
96
|
+
} else {
|
|
97
|
+
visit(column, record.getString(column));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
@Override
|
|
102
|
+
public void timestampColumn(Column column)
|
|
103
|
+
{
|
|
104
|
+
if (record.isNull(column)) {
|
|
105
|
+
visit(column, null);
|
|
106
|
+
} else {
|
|
107
|
+
visit(column, record.getTimestamp(column));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
public static Object getObject(PageReader record, Column column)
|
|
113
|
+
{
|
|
114
|
+
GetObjectColumnVisitor visitor = new GetObjectColumnVisitor(record);
|
|
115
|
+
column.visit(visitor);
|
|
116
|
+
return visitor.get();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private static class GetObjectColumnVisitor
|
|
120
|
+
extends ObjectSchemaVisitor
|
|
121
|
+
{
|
|
122
|
+
private Object object;
|
|
123
|
+
|
|
124
|
+
public GetObjectColumnVisitor(PageReader record)
|
|
125
|
+
{
|
|
126
|
+
super(record);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
public Object get()
|
|
130
|
+
{
|
|
131
|
+
return object;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
public void visit(Column column, Object object)
|
|
135
|
+
{
|
|
136
|
+
this.object = object;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
package org.embulk;
|
|
2
|
+
|
|
3
|
+
import java.util.Random;
|
|
4
|
+
import org.junit.runner.Description;
|
|
5
|
+
import org.junit.runners.model.Statement;
|
|
6
|
+
import com.google.inject.Binder;
|
|
7
|
+
import com.google.inject.Module;
|
|
8
|
+
import org.embulk.config.ConfigSource;
|
|
9
|
+
import org.embulk.config.DataSourceImpl;
|
|
10
|
+
import org.embulk.config.ModelManager;
|
|
11
|
+
import org.embulk.exec.SystemConfigModule;
|
|
12
|
+
import org.embulk.exec.ExecModule;
|
|
13
|
+
import org.embulk.exec.ExtensionServiceLoaderModule;
|
|
14
|
+
import org.embulk.plugin.BuiltinPluginSourceModule;
|
|
15
|
+
import org.embulk.jruby.JRubyScriptingModule;
|
|
16
|
+
import org.embulk.spi.BufferAllocator;
|
|
17
|
+
import org.embulk.spi.Exec;
|
|
18
|
+
import org.embulk.spi.ExecAction;
|
|
19
|
+
import org.embulk.spi.ExecSession;
|
|
20
|
+
|
|
21
|
+
public class EmbulkTestRuntime
|
|
22
|
+
extends GuiceBinder
|
|
23
|
+
{
|
|
24
|
+
private static ConfigSource getSystemConfig()
|
|
25
|
+
{
|
|
26
|
+
// TODO set some default values
|
|
27
|
+
return new DataSourceImpl(null);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public static class TestRuntimeModule
|
|
31
|
+
implements Module
|
|
32
|
+
{
|
|
33
|
+
@Override
|
|
34
|
+
public void configure(Binder binder)
|
|
35
|
+
{
|
|
36
|
+
ConfigSource systemConfig = getSystemConfig();
|
|
37
|
+
new SystemConfigModule(systemConfig).configure(binder);
|
|
38
|
+
new ExecModule().configure(binder);
|
|
39
|
+
new ExtensionServiceLoaderModule(systemConfig).configure(binder);
|
|
40
|
+
new BuiltinPluginSourceModule().configure(binder);
|
|
41
|
+
new JRubyScriptingModule(systemConfig).configure(binder);
|
|
42
|
+
new TestUtilityModule().configure(binder);
|
|
43
|
+
new TestPluginSourceModule().configure(binder);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private ExecSession exec;
|
|
48
|
+
|
|
49
|
+
public EmbulkTestRuntime()
|
|
50
|
+
{
|
|
51
|
+
super(new TestRuntimeModule());
|
|
52
|
+
ConfigSource execConfig = new DataSourceImpl(null);
|
|
53
|
+
this.exec = new ExecSession(getInjector(), execConfig);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public ExecSession getExec()
|
|
57
|
+
{
|
|
58
|
+
return exec;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public BufferAllocator getBufferAllocator()
|
|
62
|
+
{
|
|
63
|
+
return getInstance(BufferAllocator.class);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public ModelManager getModelManager()
|
|
67
|
+
{
|
|
68
|
+
return getInstance(ModelManager.class);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public Random getRandom()
|
|
72
|
+
{
|
|
73
|
+
return getInstance(RandomManager.class).getRandom();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@Override
|
|
77
|
+
public Statement apply(Statement base, Description description)
|
|
78
|
+
{
|
|
79
|
+
final Statement superStatement = EmbulkTestRuntime.super.apply(base, description);
|
|
80
|
+
return new Statement() {
|
|
81
|
+
public void evaluate() throws Throwable
|
|
82
|
+
{
|
|
83
|
+
try {
|
|
84
|
+
Exec.doWith(exec, new ExecAction<Void>() {
|
|
85
|
+
public Void run()
|
|
86
|
+
{
|
|
87
|
+
try {
|
|
88
|
+
superStatement.evaluate();
|
|
89
|
+
} catch (Throwable ex) {
|
|
90
|
+
throw new RuntimeExecutionException(ex);
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
} catch (RuntimeException ex) {
|
|
96
|
+
throw ex.getCause();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
private static class RuntimeExecutionException
|
|
103
|
+
extends RuntimeException
|
|
104
|
+
{
|
|
105
|
+
public RuntimeExecutionException(Throwable cause)
|
|
106
|
+
{
|
|
107
|
+
super(cause);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
package org.embulk;
|
|
2
|
+
|
|
3
|
+
import java.util.ArrayList;
|
|
4
|
+
import java.util.List;
|
|
5
|
+
import org.junit.rules.TestRule;
|
|
6
|
+
import org.junit.rules.TestWatcher;
|
|
7
|
+
import org.junit.runner.Description;
|
|
8
|
+
import org.junit.runners.model.Statement;
|
|
9
|
+
import com.google.common.collect.ImmutableList;
|
|
10
|
+
import com.google.inject.Guice;
|
|
11
|
+
import com.google.inject.Injector;
|
|
12
|
+
import com.google.inject.Module;
|
|
13
|
+
|
|
14
|
+
public class GuiceBinder
|
|
15
|
+
implements TestRule
|
|
16
|
+
{
|
|
17
|
+
private final List<Module> baseModules;
|
|
18
|
+
private List<Module> extraModules;
|
|
19
|
+
private Injector injector;
|
|
20
|
+
|
|
21
|
+
public GuiceBinder(Module... baseModules)
|
|
22
|
+
{
|
|
23
|
+
this.baseModules = ImmutableList.copyOf(baseModules);
|
|
24
|
+
reset();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
private void reset()
|
|
28
|
+
{
|
|
29
|
+
extraModules = new ArrayList<Module>();
|
|
30
|
+
injector = null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public synchronized void addModule(Module module)
|
|
34
|
+
{
|
|
35
|
+
if (injector != null) {
|
|
36
|
+
throw new IllegalStateException("Injector is already initialized. Call addModule before getInjector or getInstance");
|
|
37
|
+
}
|
|
38
|
+
extraModules.add(module);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public synchronized Injector getInjector()
|
|
42
|
+
{
|
|
43
|
+
if (injector == null) {
|
|
44
|
+
ImmutableList.Builder modules = ImmutableList.builder();
|
|
45
|
+
modules.addAll(baseModules);
|
|
46
|
+
modules.addAll(extraModules);
|
|
47
|
+
injector = Guice.createInjector(modules.build());
|
|
48
|
+
}
|
|
49
|
+
return injector;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public <T> T getInstance(Class<T> klass)
|
|
53
|
+
{
|
|
54
|
+
return getInjector().getInstance(klass);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@Override
|
|
58
|
+
public Statement apply(Statement base, Description description)
|
|
59
|
+
{
|
|
60
|
+
return new GuceBinderWatcher().apply(base, description);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private class GuceBinderWatcher
|
|
64
|
+
extends TestWatcher
|
|
65
|
+
{
|
|
66
|
+
@Override
|
|
67
|
+
protected void starting(Description description)
|
|
68
|
+
{
|
|
69
|
+
reset();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|