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,73 @@
|
|
|
1
|
+
package org.embulk.spi;
|
|
2
|
+
|
|
3
|
+
import org.embulk.config.Config;
|
|
4
|
+
import org.embulk.config.ConfigSource;
|
|
5
|
+
import org.embulk.config.Task;
|
|
6
|
+
import org.embulk.config.TaskSource;
|
|
7
|
+
import org.embulk.spi.time.Timestamp;
|
|
8
|
+
import org.embulk.spi.type.Type;
|
|
9
|
+
import org.embulk.spi.Column;
|
|
10
|
+
import org.embulk.spi.Schema;
|
|
11
|
+
import org.embulk.spi.SchemaConfig;
|
|
12
|
+
import org.embulk.spi.PageOutput;
|
|
13
|
+
|
|
14
|
+
public class MockParserPlugin implements ParserPlugin
|
|
15
|
+
{
|
|
16
|
+
public static boolean raiseException = false;
|
|
17
|
+
|
|
18
|
+
public interface PluginTask extends Task
|
|
19
|
+
{
|
|
20
|
+
@Config("columns")
|
|
21
|
+
public SchemaConfig getSchemaConfig();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@Override
|
|
25
|
+
public void transaction(ConfigSource config, Control control)
|
|
26
|
+
{
|
|
27
|
+
PluginTask task = config.loadConfig(PluginTask.class);
|
|
28
|
+
control.run(task.dump(), task.getSchemaConfig().toSchema());
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@Override
|
|
32
|
+
public void run(TaskSource taskSource, Schema schema,
|
|
33
|
+
FileInput input, PageOutput output)
|
|
34
|
+
{
|
|
35
|
+
try (final PageBuilder pageBuilder = new PageBuilder(
|
|
36
|
+
Exec.getBufferAllocator(), schema, output)) {
|
|
37
|
+
while (input.nextFile()) {
|
|
38
|
+
Buffer buffer = input.poll();
|
|
39
|
+
if (buffer != null) {
|
|
40
|
+
for (Column column : schema.getColumns()) {
|
|
41
|
+
Type type = column.getType();
|
|
42
|
+
switch (type.getName()) {
|
|
43
|
+
case "boolean":
|
|
44
|
+
pageBuilder.setBoolean(column, true);
|
|
45
|
+
break;
|
|
46
|
+
case "long":
|
|
47
|
+
pageBuilder.setLong(column, 2L);
|
|
48
|
+
break;
|
|
49
|
+
case "double":
|
|
50
|
+
pageBuilder.setDouble(column, 3.0D);
|
|
51
|
+
break;
|
|
52
|
+
case "string":
|
|
53
|
+
pageBuilder.setString(column, "45");
|
|
54
|
+
break;
|
|
55
|
+
case "timestamp":
|
|
56
|
+
pageBuilder.setTimestamp(column,
|
|
57
|
+
Timestamp.ofEpochMilli(678L));
|
|
58
|
+
break;
|
|
59
|
+
default:
|
|
60
|
+
throw new IllegalStateException("Unknown type: "
|
|
61
|
+
+ type.getName());
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
pageBuilder.addRecord();
|
|
65
|
+
if (raiseException) {
|
|
66
|
+
throw new RuntimeException("emulated exception");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
pageBuilder.finish();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
package org.embulk.spi;
|
|
2
|
+
|
|
3
|
+
import java.util.ArrayList;
|
|
4
|
+
import java.util.List;
|
|
5
|
+
|
|
6
|
+
import org.embulk.spi.TestPageBuilderReader.MockPageOutput;
|
|
7
|
+
import org.embulk.spi.time.Timestamp;
|
|
8
|
+
import org.embulk.spi.Column;
|
|
9
|
+
import org.embulk.spi.ColumnConfig;
|
|
10
|
+
import org.embulk.spi.Schema;
|
|
11
|
+
import org.embulk.spi.SchemaConfig;
|
|
12
|
+
import org.embulk.spi.SchemaVisitor;
|
|
13
|
+
import org.embulk.spi.type.Type;
|
|
14
|
+
|
|
15
|
+
import com.google.common.collect.ImmutableList;
|
|
16
|
+
|
|
17
|
+
public class PageTestUtils
|
|
18
|
+
{
|
|
19
|
+
private PageTestUtils()
|
|
20
|
+
{
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public static Schema newSchema()
|
|
24
|
+
{
|
|
25
|
+
return new Schema(ImmutableList.<Column> of());
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public static Schema newSchema(Column... columns)
|
|
29
|
+
{
|
|
30
|
+
return new Schema(ImmutableList.copyOf(columns));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public static Schema newSchema(ColumnConfig... columns)
|
|
34
|
+
{
|
|
35
|
+
return new SchemaConfig(ImmutableList.copyOf(columns)).toSchema();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public static ColumnConfig newColumn(String name, Type type)
|
|
39
|
+
{
|
|
40
|
+
return new ColumnConfig(name, type, null);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public static List<Page> buildPage(BufferAllocator bufferAllocator,
|
|
44
|
+
Schema schema, Object... values)
|
|
45
|
+
{
|
|
46
|
+
MockPageOutput output = new MockPageOutput();
|
|
47
|
+
try (PageBuilder builder = new PageBuilder(bufferAllocator, schema,
|
|
48
|
+
output)) {
|
|
49
|
+
int idx = 0;
|
|
50
|
+
while (idx < values.length) {
|
|
51
|
+
for (int column = 0; column < builder.getSchema()
|
|
52
|
+
.getColumnCount(); ++column) {
|
|
53
|
+
Object value = values[idx++];
|
|
54
|
+
if (value == null) {
|
|
55
|
+
builder.setNull(column);
|
|
56
|
+
} else if (value instanceof Boolean) {
|
|
57
|
+
builder.setBoolean(column, (Boolean) value);
|
|
58
|
+
} else if (value instanceof Double) {
|
|
59
|
+
builder.setDouble(column, (Double) value);
|
|
60
|
+
} else if (value instanceof Long) {
|
|
61
|
+
builder.setLong(column, (Long) value);
|
|
62
|
+
} else if (value instanceof String) {
|
|
63
|
+
builder.setString(column, (String) value);
|
|
64
|
+
} else if (value instanceof Timestamp) {
|
|
65
|
+
builder.setTimestamp(column, (Timestamp) value);
|
|
66
|
+
} else {
|
|
67
|
+
throw new IllegalStateException(
|
|
68
|
+
"Unsupported type in test utils: "
|
|
69
|
+
+ value.toString());
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
builder.addRecord();
|
|
73
|
+
}
|
|
74
|
+
builder.finish();
|
|
75
|
+
}
|
|
76
|
+
return output.pages;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
package org.embulk.spi;
|
|
2
|
+
|
|
3
|
+
import static org.junit.Assert.assertArrayEquals;
|
|
4
|
+
import static org.junit.Assert.assertEquals;
|
|
5
|
+
import java.io.ByteArrayOutputStream;
|
|
6
|
+
import java.util.Random;
|
|
7
|
+
import org.junit.Rule;
|
|
8
|
+
import org.junit.Test;
|
|
9
|
+
import org.embulk.spi.util.ListFileInput;
|
|
10
|
+
import org.embulk.spi.util.FileInputInputStream;
|
|
11
|
+
import org.embulk.spi.util.FileOutputOutputStream;
|
|
12
|
+
import org.embulk.EmbulkTestRuntime;
|
|
13
|
+
|
|
14
|
+
public class TestFileInputInputStream
|
|
15
|
+
{
|
|
16
|
+
@Rule
|
|
17
|
+
public EmbulkTestRuntime runtime = new EmbulkTestRuntime();
|
|
18
|
+
|
|
19
|
+
private ListFileInput fileInput;
|
|
20
|
+
private MockFileOutput fileOutput;
|
|
21
|
+
|
|
22
|
+
private FileInputInputStream in;
|
|
23
|
+
private FileOutputOutputStream out;
|
|
24
|
+
|
|
25
|
+
private void newOutputStream()
|
|
26
|
+
{
|
|
27
|
+
fileOutput = new MockFileOutput();
|
|
28
|
+
out = new FileOutputOutputStream(fileOutput, runtime.getBufferAllocator());
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private void newInputStream()
|
|
32
|
+
{
|
|
33
|
+
fileInput = new ListFileInput(fileOutput.getFiles());
|
|
34
|
+
in = new FileInputInputStream(fileInput);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@Test
|
|
38
|
+
public void testRandomReadWrite() throws Exception
|
|
39
|
+
{
|
|
40
|
+
newOutputStream();
|
|
41
|
+
out.nextFile();
|
|
42
|
+
ByteArrayOutputStream expectedOut = new ByteArrayOutputStream();
|
|
43
|
+
Random rand = runtime.getRandom();
|
|
44
|
+
byte[] buffer = new byte[rand.nextInt() % 1024 + 1024];
|
|
45
|
+
for (int i = 0; i < 256; i++) {
|
|
46
|
+
rand.nextBytes(buffer);
|
|
47
|
+
expectedOut.write(buffer);
|
|
48
|
+
out.write(buffer);
|
|
49
|
+
}
|
|
50
|
+
out.finish();
|
|
51
|
+
byte[] expected = expectedOut.toByteArray();
|
|
52
|
+
byte[] actual = new byte[expected.length];
|
|
53
|
+
|
|
54
|
+
newInputStream();
|
|
55
|
+
in.nextFile();
|
|
56
|
+
int pos = 0;
|
|
57
|
+
while (pos < actual.length) {
|
|
58
|
+
int n = in.read(actual, pos, actual.length - pos);
|
|
59
|
+
if (n < 0) {
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
pos += n;
|
|
63
|
+
}
|
|
64
|
+
assertEquals(expected.length, pos);
|
|
65
|
+
assertArrayEquals(expected, actual);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
package org.embulk.spi;
|
|
2
|
+
|
|
3
|
+
import static org.junit.Assert.assertEquals;
|
|
4
|
+
|
|
5
|
+
import java.util.ArrayList;
|
|
6
|
+
import java.util.Arrays;
|
|
7
|
+
import java.util.LinkedList;
|
|
8
|
+
import java.util.List;
|
|
9
|
+
import java.util.Queue;
|
|
10
|
+
import org.junit.Before;
|
|
11
|
+
import org.junit.Rule;
|
|
12
|
+
import org.junit.Test;
|
|
13
|
+
import com.google.common.collect.ImmutableList;
|
|
14
|
+
import com.google.common.collect.ImmutableMap;
|
|
15
|
+
import org.embulk.EmbulkTestRuntime;
|
|
16
|
+
import org.embulk.config.CommitReport;
|
|
17
|
+
import org.embulk.config.ConfigSource;
|
|
18
|
+
import org.embulk.config.NextConfig;
|
|
19
|
+
import org.embulk.config.TaskSource;
|
|
20
|
+
import org.embulk.spi.time.Timestamp;
|
|
21
|
+
import org.embulk.spi.TestPageBuilderReader.MockPageOutput;
|
|
22
|
+
import org.embulk.spi.Schema;
|
|
23
|
+
import org.embulk.spi.util.Pages;
|
|
24
|
+
|
|
25
|
+
public class TestFileInputRunner
|
|
26
|
+
{
|
|
27
|
+
@Rule
|
|
28
|
+
public EmbulkTestRuntime runtime = new EmbulkTestRuntime();
|
|
29
|
+
|
|
30
|
+
@Before
|
|
31
|
+
public void tearDown()
|
|
32
|
+
{
|
|
33
|
+
MockParserPlugin.raiseException = false;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
private static class MockFileInputPlugin implements FileInputPlugin
|
|
37
|
+
{
|
|
38
|
+
Boolean transactionCompleted = null;
|
|
39
|
+
Queue<Buffer> buffers;
|
|
40
|
+
|
|
41
|
+
public MockFileInputPlugin(Queue<Buffer> buffers)
|
|
42
|
+
{
|
|
43
|
+
this.buffers = buffers;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public NextConfig transaction(ConfigSource config,
|
|
47
|
+
FileInputPlugin.Control control)
|
|
48
|
+
{
|
|
49
|
+
control.run(Exec.newTaskSource(), 1);
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public TransactionalFileInput open(TaskSource taskSource,
|
|
54
|
+
int processorIndex)
|
|
55
|
+
{
|
|
56
|
+
return new TransactionalFileInput()
|
|
57
|
+
{
|
|
58
|
+
@Override
|
|
59
|
+
public Buffer poll()
|
|
60
|
+
{
|
|
61
|
+
return buffers.poll();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@Override
|
|
65
|
+
public boolean nextFile()
|
|
66
|
+
{
|
|
67
|
+
return !buffers.isEmpty();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@Override
|
|
71
|
+
public void close()
|
|
72
|
+
{
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@Override
|
|
76
|
+
public void abort()
|
|
77
|
+
{
|
|
78
|
+
transactionCompleted = false;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@Override
|
|
82
|
+
public CommitReport commit()
|
|
83
|
+
{
|
|
84
|
+
transactionCompleted = true;
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@Test
|
|
92
|
+
public void testMockParserIteration()
|
|
93
|
+
{
|
|
94
|
+
Buffer[] buffers = new Buffer[] {
|
|
95
|
+
runtime.getBufferAllocator().allocate(),
|
|
96
|
+
runtime.getBufferAllocator().allocate() };
|
|
97
|
+
MockFileInputPlugin fileInputPlugin = new MockFileInputPlugin(
|
|
98
|
+
new LinkedList<Buffer>(Arrays.asList(buffers)));
|
|
99
|
+
final FileInputRunner runner = new FileInputRunner(fileInputPlugin);
|
|
100
|
+
|
|
101
|
+
ConfigSource config = Exec.newConfigSource().set(
|
|
102
|
+
"parser",
|
|
103
|
+
ImmutableMap.of("type", "mock", "columns", ImmutableList.of(
|
|
104
|
+
ImmutableMap.of("name", "col1", "type", "boolean"),
|
|
105
|
+
ImmutableMap.of("name", "col2", "type", "long"),
|
|
106
|
+
ImmutableMap.of("name", "col3", "type", "double"),
|
|
107
|
+
ImmutableMap.of("name", "col4", "type", "string"),
|
|
108
|
+
ImmutableMap.of("name", "col5", "type", "timestamp"))));
|
|
109
|
+
|
|
110
|
+
final MockPageOutput output = new MockPageOutput();
|
|
111
|
+
runner.transaction(config, new InputPlugin.Control()
|
|
112
|
+
{
|
|
113
|
+
public List<CommitReport> run(TaskSource inputTaskSource,
|
|
114
|
+
Schema schema, int processorCount)
|
|
115
|
+
{
|
|
116
|
+
List<CommitReport> reports = new ArrayList<>();
|
|
117
|
+
reports.add(runner.run(inputTaskSource, schema, 0, output));
|
|
118
|
+
return reports;
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
assertEquals(true, fileInputPlugin.transactionCompleted);
|
|
123
|
+
assertEquals(1, output.pages.size());
|
|
124
|
+
|
|
125
|
+
Schema schema = config.getNested("parser")
|
|
126
|
+
.loadConfig(MockParserPlugin.PluginTask.class)
|
|
127
|
+
.getSchemaConfig().toSchema();
|
|
128
|
+
|
|
129
|
+
List<Object[]> records = Pages.toObjects(schema, output.pages);
|
|
130
|
+
assertEquals(2, records.size());
|
|
131
|
+
for (Object[] record : records) {
|
|
132
|
+
assertEquals(5, record.length);
|
|
133
|
+
assertEquals(true, record[0]);
|
|
134
|
+
assertEquals(2L, record[1]);
|
|
135
|
+
assertEquals(3.0D, (Double) record[2], 0.01D);
|
|
136
|
+
assertEquals("45", record[3]);
|
|
137
|
+
assertEquals(678L, ((Timestamp) record[4]).toEpochMilli());
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
@Test
|
|
142
|
+
public void testTransactionAborted()
|
|
143
|
+
{
|
|
144
|
+
Buffer[] buffers = new Buffer[] {
|
|
145
|
+
runtime.getBufferAllocator().allocate(),
|
|
146
|
+
runtime.getBufferAllocator().allocate() };
|
|
147
|
+
MockFileInputPlugin fileInputPlugin = new MockFileInputPlugin(
|
|
148
|
+
new LinkedList<Buffer>(Arrays.asList(buffers)));
|
|
149
|
+
final FileInputRunner runner = new FileInputRunner(fileInputPlugin);
|
|
150
|
+
|
|
151
|
+
ConfigSource config = Exec.newConfigSource().set(
|
|
152
|
+
"parser",
|
|
153
|
+
ImmutableMap.of("type", "mock", "columns", ImmutableList.of(
|
|
154
|
+
ImmutableMap.of("name", "col1", "type", "boolean"),
|
|
155
|
+
ImmutableMap.of("name", "col2", "type", "long"),
|
|
156
|
+
ImmutableMap.of("name", "col3", "type", "double"),
|
|
157
|
+
ImmutableMap.of("name", "col4", "type", "string"),
|
|
158
|
+
ImmutableMap.of("name", "col5", "type", "timestamp"))));
|
|
159
|
+
|
|
160
|
+
final MockPageOutput output = new MockPageOutput();
|
|
161
|
+
|
|
162
|
+
MockParserPlugin.raiseException = true;
|
|
163
|
+
|
|
164
|
+
try {
|
|
165
|
+
runner.transaction(config, new InputPlugin.Control()
|
|
166
|
+
{
|
|
167
|
+
public List<CommitReport> run(TaskSource inputTaskSource,
|
|
168
|
+
Schema schema, int processorCount)
|
|
169
|
+
{
|
|
170
|
+
List<CommitReport> reports = new ArrayList<>();
|
|
171
|
+
reports.add(runner.run(inputTaskSource, schema, 0, output));
|
|
172
|
+
return reports;
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
} catch (RuntimeException re) {
|
|
176
|
+
}
|
|
177
|
+
assertEquals(false, fileInputPlugin.transactionCompleted);
|
|
178
|
+
assertEquals(0, output.pages.size());
|
|
179
|
+
}
|
|
180
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
package org.embulk.spi;
|
|
2
|
+
|
|
3
|
+
import static org.junit.Assert.assertEquals;
|
|
4
|
+
|
|
5
|
+
import java.util.ArrayList;
|
|
6
|
+
import java.util.List;
|
|
7
|
+
|
|
8
|
+
import org.embulk.EmbulkTestRuntime;
|
|
9
|
+
import org.embulk.config.CommitReport;
|
|
10
|
+
import org.embulk.config.ConfigSource;
|
|
11
|
+
import org.embulk.config.NextConfig;
|
|
12
|
+
import org.embulk.config.Task;
|
|
13
|
+
import org.embulk.config.TaskSource;
|
|
14
|
+
import org.embulk.spi.time.Timestamp;
|
|
15
|
+
import org.embulk.spi.Schema;
|
|
16
|
+
import org.junit.Rule;
|
|
17
|
+
import org.junit.Test;
|
|
18
|
+
|
|
19
|
+
import com.google.common.collect.ImmutableList;
|
|
20
|
+
import com.google.common.collect.ImmutableMap;
|
|
21
|
+
|
|
22
|
+
public class TestFileOutputRunner
|
|
23
|
+
{
|
|
24
|
+
@Rule
|
|
25
|
+
public EmbulkTestRuntime runtime = new EmbulkTestRuntime();
|
|
26
|
+
|
|
27
|
+
public interface PluginTask extends Task
|
|
28
|
+
{
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private static class MockFileOutputPlugin implements FileOutputPlugin
|
|
32
|
+
{
|
|
33
|
+
Boolean transactionCompleted = null;
|
|
34
|
+
|
|
35
|
+
@Override
|
|
36
|
+
public NextConfig transaction(ConfigSource config, int processorCount,
|
|
37
|
+
FileOutputPlugin.Control control)
|
|
38
|
+
{
|
|
39
|
+
PluginTask task = config.loadConfig(PluginTask.class);
|
|
40
|
+
control.run(task.dump());
|
|
41
|
+
return Exec.newNextConfig();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@Override
|
|
45
|
+
public TransactionalFileOutput open(TaskSource taskSource,
|
|
46
|
+
final int processorIndex)
|
|
47
|
+
{
|
|
48
|
+
return new TransactionalFileOutput()
|
|
49
|
+
{
|
|
50
|
+
|
|
51
|
+
@Override
|
|
52
|
+
public void nextFile()
|
|
53
|
+
{
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@Override
|
|
57
|
+
public void add(Buffer buffer)
|
|
58
|
+
{
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@Override
|
|
62
|
+
public void finish()
|
|
63
|
+
{
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@Override
|
|
67
|
+
public void close()
|
|
68
|
+
{
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@Override
|
|
72
|
+
public void abort()
|
|
73
|
+
{
|
|
74
|
+
transactionCompleted = false;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@Override
|
|
78
|
+
public CommitReport commit()
|
|
79
|
+
{
|
|
80
|
+
transactionCompleted = true;
|
|
81
|
+
return Exec.newCommitReport();
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@Test
|
|
88
|
+
public void testMockFormatterIteration()
|
|
89
|
+
{
|
|
90
|
+
MockFileOutputPlugin fileOutputPlugin = new MockFileOutputPlugin();
|
|
91
|
+
final FileOutputRunner runner = new FileOutputRunner(fileOutputPlugin);
|
|
92
|
+
|
|
93
|
+
ImmutableList<ImmutableMap<String, String>> columns = ImmutableList.of(
|
|
94
|
+
ImmutableMap.of("name", "col1", "type", "boolean"),
|
|
95
|
+
ImmutableMap.of("name", "col2", "type", "long"),
|
|
96
|
+
ImmutableMap.of("name", "col3", "type", "double"),
|
|
97
|
+
ImmutableMap.of("name", "col4", "type", "string"),
|
|
98
|
+
ImmutableMap.of("name", "col5", "type", "timestamp"));
|
|
99
|
+
ConfigSource config = Exec
|
|
100
|
+
.newConfigSource()
|
|
101
|
+
.set("type", "unused?")
|
|
102
|
+
.set("formatter",
|
|
103
|
+
ImmutableMap.of("type", "mock", "columns", columns));
|
|
104
|
+
final Schema schema = config.getNested("formatter")
|
|
105
|
+
.loadConfig(MockParserPlugin.PluginTask.class)
|
|
106
|
+
.getSchemaConfig().toSchema();
|
|
107
|
+
|
|
108
|
+
runner.transaction(config, schema, 1, new OutputPlugin.Control()
|
|
109
|
+
{
|
|
110
|
+
public List<CommitReport> run(final TaskSource outputTask)
|
|
111
|
+
{
|
|
112
|
+
TransactionalPageOutput tran = runner.open(outputTask, schema,
|
|
113
|
+
1);
|
|
114
|
+
boolean committed = false;
|
|
115
|
+
try {
|
|
116
|
+
for (Page page : PageTestUtils.buildPage(
|
|
117
|
+
runtime.getBufferAllocator(), schema, true, 2L,
|
|
118
|
+
3.0D, "45", Timestamp.ofEpochMilli(678L), true, 2L,
|
|
119
|
+
3.0D, "45", Timestamp.ofEpochMilli(678L))) {
|
|
120
|
+
tran.add(page);
|
|
121
|
+
}
|
|
122
|
+
tran.commit();
|
|
123
|
+
committed = true;
|
|
124
|
+
} finally {
|
|
125
|
+
if (!committed) {
|
|
126
|
+
tran.abort();
|
|
127
|
+
}
|
|
128
|
+
tran.close();
|
|
129
|
+
}
|
|
130
|
+
return new ArrayList<CommitReport>();
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
assertEquals(true, fileOutputPlugin.transactionCompleted);
|
|
135
|
+
assertEquals(2, MockFormatterPlugin.records.size());
|
|
136
|
+
for (List<Object> record : MockFormatterPlugin.records) {
|
|
137
|
+
assertEquals(Boolean.TRUE, record.get(0));
|
|
138
|
+
assertEquals(2L, record.get(1));
|
|
139
|
+
assertEquals(3.0D, (Double) record.get(2), 0.1D);
|
|
140
|
+
assertEquals("45", record.get(3));
|
|
141
|
+
assertEquals(678L, ((Timestamp) record.get(4)).toEpochMilli());
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
@Test
|
|
146
|
+
public void testTransactionAborted()
|
|
147
|
+
{
|
|
148
|
+
MockFileOutputPlugin fileOutputPlugin = new MockFileOutputPlugin();
|
|
149
|
+
final FileOutputRunner runner = new FileOutputRunner(fileOutputPlugin);
|
|
150
|
+
|
|
151
|
+
ImmutableList<ImmutableMap<String, String>> columns = ImmutableList.of(
|
|
152
|
+
ImmutableMap.of("name", "col1", "type", "boolean"),
|
|
153
|
+
ImmutableMap.of("name", "col2", "type", "long"),
|
|
154
|
+
ImmutableMap.of("name", "col3", "type", "double"),
|
|
155
|
+
ImmutableMap.of("name", "col4", "type", "string"),
|
|
156
|
+
ImmutableMap.of("name", "col5", "type", "timestamp"));
|
|
157
|
+
ConfigSource config = Exec
|
|
158
|
+
.newConfigSource()
|
|
159
|
+
.set("type", "unused?")
|
|
160
|
+
.set("formatter",
|
|
161
|
+
ImmutableMap.of("type", "mock", "columns", columns));
|
|
162
|
+
final Schema schema = config.getNested("formatter")
|
|
163
|
+
.loadConfig(MockParserPlugin.PluginTask.class)
|
|
164
|
+
.getSchemaConfig().toSchema();
|
|
165
|
+
|
|
166
|
+
try {
|
|
167
|
+
runner.transaction(config, schema, 1, new OutputPlugin.Control()
|
|
168
|
+
{
|
|
169
|
+
public List<CommitReport> run(final TaskSource outputTask)
|
|
170
|
+
{
|
|
171
|
+
TransactionalPageOutput tran = runner.open(outputTask,
|
|
172
|
+
schema, 1);
|
|
173
|
+
boolean committed = false;
|
|
174
|
+
try {
|
|
175
|
+
tran.add(null);
|
|
176
|
+
tran.commit();
|
|
177
|
+
committed = true;
|
|
178
|
+
} finally {
|
|
179
|
+
if (!committed) {
|
|
180
|
+
tran.abort();
|
|
181
|
+
}
|
|
182
|
+
tran.close();
|
|
183
|
+
}
|
|
184
|
+
return new ArrayList<CommitReport>();
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
} catch (NullPointerException npe) {
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
assertEquals(false, fileOutputPlugin.transactionCompleted);
|
|
191
|
+
}
|
|
192
|
+
}
|