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.
Files changed (204) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +13 -0
  3. data/Gemfile +3 -0
  4. data/Gemfile.lock +33 -0
  5. data/README.md +117 -0
  6. data/Rakefile +58 -0
  7. data/bin/embulk +63 -0
  8. data/build.gradle +149 -0
  9. data/embulk-cli/build.gradle +6 -0
  10. data/embulk-cli/pom.xml +94 -0
  11. data/embulk-cli/src/main/java/org/embulk/cli/Main.java +15 -0
  12. data/embulk-core/build.gradle +6 -0
  13. data/embulk-core/pom.xml +143 -0
  14. data/embulk-core/src/main/java/org/embulk/EmbulkService.java +39 -0
  15. data/embulk-core/src/main/java/org/embulk/command/Runner.java +199 -0
  16. data/embulk-core/src/main/java/org/embulk/command/TablePrinter.java +119 -0
  17. data/embulk-core/src/main/java/org/embulk/config/CommitReport.java +26 -0
  18. data/embulk-core/src/main/java/org/embulk/config/Config.java +15 -0
  19. data/embulk-core/src/main/java/org/embulk/config/ConfigDefault.java +15 -0
  20. data/embulk-core/src/main/java/org/embulk/config/ConfigException.java +20 -0
  21. data/embulk-core/src/main/java/org/embulk/config/ConfigLoader.java +83 -0
  22. data/embulk-core/src/main/java/org/embulk/config/ConfigSource.java +28 -0
  23. data/embulk-core/src/main/java/org/embulk/config/DataSource.java +35 -0
  24. data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +208 -0
  25. data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +80 -0
  26. data/embulk-core/src/main/java/org/embulk/config/GenericTypeReference.java +20 -0
  27. data/embulk-core/src/main/java/org/embulk/config/ModelManager.java +125 -0
  28. data/embulk-core/src/main/java/org/embulk/config/NextConfig.java +26 -0
  29. data/embulk-core/src/main/java/org/embulk/config/Task.java +10 -0
  30. data/embulk-core/src/main/java/org/embulk/config/TaskInvocationHandler.java +180 -0
  31. data/embulk-core/src/main/java/org/embulk/config/TaskSerDe.java +343 -0
  32. data/embulk-core/src/main/java/org/embulk/config/TaskSource.java +28 -0
  33. data/embulk-core/src/main/java/org/embulk/config/TaskValidationException.java +37 -0
  34. data/embulk-core/src/main/java/org/embulk/config/TaskValidator.java +24 -0
  35. data/embulk-core/src/main/java/org/embulk/exec/ExecModule.java +45 -0
  36. data/embulk-core/src/main/java/org/embulk/exec/ExecuteInterruptedException.java +10 -0
  37. data/embulk-core/src/main/java/org/embulk/exec/ExecuteResult.java +19 -0
  38. data/embulk-core/src/main/java/org/embulk/exec/ExtensionServiceLoaderModule.java +43 -0
  39. data/embulk-core/src/main/java/org/embulk/exec/ForSystemConfig.java +16 -0
  40. data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +307 -0
  41. data/embulk-core/src/main/java/org/embulk/exec/LocalExecutor.java +274 -0
  42. data/embulk-core/src/main/java/org/embulk/exec/LoggerProvider.java +30 -0
  43. data/embulk-core/src/main/java/org/embulk/exec/NoSampleException.java +10 -0
  44. data/embulk-core/src/main/java/org/embulk/exec/PooledBufferAllocator.java +58 -0
  45. data/embulk-core/src/main/java/org/embulk/exec/PreviewExecutor.java +138 -0
  46. data/embulk-core/src/main/java/org/embulk/exec/PreviewResult.java +27 -0
  47. data/embulk-core/src/main/java/org/embulk/exec/PreviewedNoticeError.java +17 -0
  48. data/embulk-core/src/main/java/org/embulk/exec/SamplingParserPlugin.java +116 -0
  49. data/embulk-core/src/main/java/org/embulk/exec/SystemConfigModule.java +24 -0
  50. data/embulk-core/src/main/java/org/embulk/jruby/JRubyPluginSource.java +69 -0
  51. data/embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.java +100 -0
  52. data/embulk-core/src/main/java/org/embulk/plugin/BuiltinPluginSourceModule.java +17 -0
  53. data/embulk-core/src/main/java/org/embulk/plugin/InjectedPluginSource.java +92 -0
  54. data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +34 -0
  55. data/embulk-core/src/main/java/org/embulk/plugin/PluginSource.java +6 -0
  56. data/embulk-core/src/main/java/org/embulk/plugin/PluginSourceNotMatchException.java +19 -0
  57. data/embulk-core/src/main/java/org/embulk/plugin/PluginType.java +47 -0
  58. data/embulk-core/src/main/java/org/embulk/plugin/SetThreadContextClassLoader.java +19 -0
  59. data/embulk-core/src/main/java/org/embulk/spi/Buffer.java +113 -0
  60. data/embulk-core/src/main/java/org/embulk/spi/BufferAllocator.java +8 -0
  61. data/embulk-core/src/main/java/org/embulk/spi/Column.java +92 -0
  62. data/embulk-core/src/main/java/org/embulk/spi/ColumnConfig.java +79 -0
  63. data/embulk-core/src/main/java/org/embulk/spi/DecoderPlugin.java +16 -0
  64. data/embulk-core/src/main/java/org/embulk/spi/EncoderPlugin.java +16 -0
  65. data/embulk-core/src/main/java/org/embulk/spi/Exec.java +76 -0
  66. data/embulk-core/src/main/java/org/embulk/spi/ExecAction.java +6 -0
  67. data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +105 -0
  68. data/embulk-core/src/main/java/org/embulk/spi/Extension.java +42 -0
  69. data/embulk-core/src/main/java/org/embulk/spi/FileInput.java +11 -0
  70. data/embulk-core/src/main/java/org/embulk/spi/FileInputPlugin.java +19 -0
  71. data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +113 -0
  72. data/embulk-core/src/main/java/org/embulk/spi/FileOutput.java +13 -0
  73. data/embulk-core/src/main/java/org/embulk/spi/FileOutputPlugin.java +20 -0
  74. data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +167 -0
  75. data/embulk-core/src/main/java/org/embulk/spi/FormatterPlugin.java +18 -0
  76. data/embulk-core/src/main/java/org/embulk/spi/GuessPlugin.java +9 -0
  77. data/embulk-core/src/main/java/org/embulk/spi/InputPlugin.java +20 -0
  78. data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +21 -0
  79. data/embulk-core/src/main/java/org/embulk/spi/Page.java +45 -0
  80. data/embulk-core/src/main/java/org/embulk/spi/PageBuilder.java +327 -0
  81. data/embulk-core/src/main/java/org/embulk/spi/PageFormat.java +47 -0
  82. data/embulk-core/src/main/java/org/embulk/spi/PageOutput.java +11 -0
  83. data/embulk-core/src/main/java/org/embulk/spi/PageReader.java +227 -0
  84. data/embulk-core/src/main/java/org/embulk/spi/ParserPlugin.java +17 -0
  85. data/embulk-core/src/main/java/org/embulk/spi/Schema.java +101 -0
  86. data/embulk-core/src/main/java/org/embulk/spi/SchemaConfig.java +52 -0
  87. data/embulk-core/src/main/java/org/embulk/spi/SchemaVisitor.java +14 -0
  88. data/embulk-core/src/main/java/org/embulk/spi/Transactional.java +10 -0
  89. data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileInput.java +17 -0
  90. data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileOutput.java +19 -0
  91. data/embulk-core/src/main/java/org/embulk/spi/TransactionalPageOutput.java +17 -0
  92. data/embulk-core/src/main/java/org/embulk/spi/time/DateTimeZoneSerDe.java +57 -0
  93. data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelper.java +8 -0
  94. data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelperFactory.java +6 -0
  95. data/embulk-core/src/main/java/org/embulk/spi/time/Timestamp.java +159 -0
  96. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormat.java +98 -0
  97. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +55 -0
  98. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParseException.java +6 -0
  99. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +60 -0
  100. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampSerDe.java +50 -0
  101. data/embulk-core/src/main/java/org/embulk/spi/type/AbstractType.java +55 -0
  102. data/embulk-core/src/main/java/org/embulk/spi/type/BooleanType.java +12 -0
  103. data/embulk-core/src/main/java/org/embulk/spi/type/DoubleType.java +12 -0
  104. data/embulk-core/src/main/java/org/embulk/spi/type/LongType.java +12 -0
  105. data/embulk-core/src/main/java/org/embulk/spi/type/StringType.java +12 -0
  106. data/embulk-core/src/main/java/org/embulk/spi/type/TimestampType.java +39 -0
  107. data/embulk-core/src/main/java/org/embulk/spi/type/Type.java +15 -0
  108. data/embulk-core/src/main/java/org/embulk/spi/type/TypeDeserializer.java +47 -0
  109. data/embulk-core/src/main/java/org/embulk/spi/type/Types.java +14 -0
  110. data/embulk-core/src/main/java/org/embulk/spi/util/CharsetSerDe.java +55 -0
  111. data/embulk-core/src/main/java/org/embulk/spi/util/Decoders.java +81 -0
  112. data/embulk-core/src/main/java/org/embulk/spi/util/Encoders.java +81 -0
  113. data/embulk-core/src/main/java/org/embulk/spi/util/FileInputInputStream.java +110 -0
  114. data/embulk-core/src/main/java/org/embulk/spi/util/FileOutputOutputStream.java +94 -0
  115. data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamFileInput.java +111 -0
  116. data/embulk-core/src/main/java/org/embulk/spi/util/Inputs.java +74 -0
  117. data/embulk-core/src/main/java/org/embulk/spi/util/LineDecoder.java +118 -0
  118. data/embulk-core/src/main/java/org/embulk/spi/util/LineEncoder.java +109 -0
  119. data/embulk-core/src/main/java/org/embulk/spi/util/ListFileInput.java +52 -0
  120. data/embulk-core/src/main/java/org/embulk/spi/util/Newline.java +38 -0
  121. data/embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java +102 -0
  122. data/embulk-core/src/main/java/org/embulk/spi/util/Pages.java +139 -0
  123. data/embulk-core/src/test/java/org/embulk/EmbulkTestRuntime.java +110 -0
  124. data/embulk-core/src/test/java/org/embulk/GuiceBinder.java +72 -0
  125. data/embulk-core/src/test/java/org/embulk/RandomManager.java +53 -0
  126. data/embulk-core/src/test/java/org/embulk/TestPluginSourceModule.java +23 -0
  127. data/embulk-core/src/test/java/org/embulk/TestUtilityModule.java +17 -0
  128. data/embulk-core/src/test/java/org/embulk/config/TestConfigSource.java +114 -0
  129. data/embulk-core/src/test/java/org/embulk/config/TestTaskSource.java +70 -0
  130. data/embulk-core/src/test/java/org/embulk/plugin/MockPluginSource.java +57 -0
  131. data/embulk-core/src/test/java/org/embulk/plugin/TestPluginType.java +18 -0
  132. data/embulk-core/src/test/java/org/embulk/spi/MockFileOutput.java +63 -0
  133. data/embulk-core/src/test/java/org/embulk/spi/MockFormatterPlugin.java +101 -0
  134. data/embulk-core/src/test/java/org/embulk/spi/MockParserPlugin.java +73 -0
  135. data/embulk-core/src/test/java/org/embulk/spi/PageTestUtils.java +78 -0
  136. data/embulk-core/src/test/java/org/embulk/spi/TestFileInputInputStream.java +67 -0
  137. data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +180 -0
  138. data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +192 -0
  139. data/embulk-core/src/test/java/org/embulk/spi/TestInputStreamFileInput.java +188 -0
  140. data/embulk-core/src/test/java/org/embulk/spi/TestPageBuilderReader.java +301 -0
  141. data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestamp.java +116 -0
  142. data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParser.java +52 -0
  143. data/embulk-core/src/test/java/org/embulk/spi/type/TestTypeSerDe.java +45 -0
  144. data/embulk-core/src/test/java/org/embulk/spi/util/TestLineDecoder.java +132 -0
  145. data/embulk-core/src/test/java/org/embulk/spi/util/TestLineEncoder.java +123 -0
  146. data/embulk-standards/build.gradle +6 -0
  147. data/embulk-standards/pom.xml +68 -0
  148. data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +158 -0
  149. data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +233 -0
  150. data/embulk-standards/src/main/java/org/embulk/standards/CsvTokenizer.java +355 -0
  151. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileDecoderPlugin.java +55 -0
  152. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileEncoderPlugin.java +39 -0
  153. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +138 -0
  154. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +128 -0
  155. data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +46 -0
  156. data/embulk-standards/src/main/java/org/embulk/standards/S3FileInputPlugin.java +238 -0
  157. data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginExtension.java +16 -0
  158. data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java +44 -0
  159. data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +71 -0
  160. data/embulk-standards/src/main/resources/META-INF/services/org.embulk.spi.Extension +1 -0
  161. data/embulk-standards/src/test/java/org/embulk/standards/TestCsvParserPlugin.java +69 -0
  162. data/embulk-standards/src/test/java/org/embulk/standards/TestCsvTokenizer.java +291 -0
  163. data/embulk-standards/src/test/java/org/embulk/standards/TestS3FileInputPlugin.java +43 -0
  164. data/embulk.gemspec +27 -0
  165. data/examples/config.yml +34 -0
  166. data/examples/csv/sample.csv.gz +0 -0
  167. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  168. data/gradle/wrapper/gradle-wrapper.properties +6 -0
  169. data/gradlew +164 -0
  170. data/gradlew.bat +90 -0
  171. data/lib/embulk.rb +16 -0
  172. data/lib/embulk/buffer.rb +17 -0
  173. data/lib/embulk/column.rb +47 -0
  174. data/lib/embulk/command/embulk.rb +39 -0
  175. data/lib/embulk/command/embulk_example.rb +32 -0
  176. data/lib/embulk/command/embulk_generate_bin.rb +62 -0
  177. data/lib/embulk/command/embulk_run.rb +243 -0
  178. data/lib/embulk/data/bundle/.bundle/config +3 -0
  179. data/lib/embulk/data/bundle/Gemfile +31 -0
  180. data/lib/embulk/data/bundle/Gemfile.lock +8 -0
  181. data/lib/embulk/data/bundle/embulk/input_example.rb +40 -0
  182. data/lib/embulk/data/bundle/embulk/output_example.rb +51 -0
  183. data/lib/embulk/data_source.rb +66 -0
  184. data/lib/embulk/error.rb +5 -0
  185. data/lib/embulk/guess_charset.rb +26 -0
  186. data/lib/embulk/guess_csv.rb +195 -0
  187. data/lib/embulk/guess_gzip.rb +18 -0
  188. data/lib/embulk/guess_newline.rb +20 -0
  189. data/lib/embulk/guess_plugin.rb +113 -0
  190. data/lib/embulk/input_plugin.rb +53 -0
  191. data/lib/embulk/java/bootstrap.rb +12 -0
  192. data/lib/embulk/java/imports.rb +26 -0
  193. data/lib/embulk/java/time_helper.rb +77 -0
  194. data/lib/embulk/output_plugin.rb +104 -0
  195. data/lib/embulk/page.rb +28 -0
  196. data/lib/embulk/page_builder.rb +22 -0
  197. data/lib/embulk/plugin.rb +152 -0
  198. data/lib/embulk/plugin_registry.rb +70 -0
  199. data/lib/embulk/schema.rb +85 -0
  200. data/lib/embulk/time_format_guess.rb +331 -0
  201. data/lib/embulk/version.rb +3 -0
  202. data/pom.xml +533 -0
  203. data/settings.gradle +5 -0
  204. 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
+ }