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,17 @@
1
+ package org.embulk.spi;
2
+
3
+ import org.embulk.config.TaskSource;
4
+ import org.embulk.config.ConfigSource;
5
+
6
+ public interface ParserPlugin
7
+ {
8
+ public interface Control
9
+ {
10
+ public void run(TaskSource taskSource, Schema schema);
11
+ }
12
+
13
+ public void transaction(ConfigSource config, ParserPlugin.Control control);
14
+
15
+ public void run(TaskSource taskSource, Schema schema,
16
+ FileInput input, PageOutput output);
17
+ }
@@ -0,0 +1,101 @@
1
+ package org.embulk.spi;
2
+
3
+ import java.util.List;
4
+ import com.google.common.base.Objects;
5
+ import com.fasterxml.jackson.annotation.JsonCreator;
6
+ import com.fasterxml.jackson.annotation.JsonValue;
7
+ import org.embulk.spi.type.Type;
8
+
9
+ public class Schema
10
+ {
11
+ private final List<Column> columns;
12
+
13
+ @JsonCreator
14
+ public Schema(List<Column> columns)
15
+ {
16
+ this.columns = columns;
17
+ }
18
+
19
+ @JsonValue
20
+ public List<Column> getColumns()
21
+ {
22
+ return columns;
23
+ }
24
+
25
+ public int getColumnCount()
26
+ {
27
+ return columns.size();
28
+ }
29
+
30
+ public Column getColumn(int index)
31
+ {
32
+ return columns.get(index);
33
+ }
34
+
35
+ public String getColumnName(int index)
36
+ {
37
+ return getColumn(index).getName();
38
+ }
39
+
40
+ public Type getColumnType(int index)
41
+ {
42
+ return getColumn(index).getType();
43
+ }
44
+
45
+ public void visitColumns(SchemaVisitor visitor)
46
+ {
47
+ for (Column column : columns) {
48
+ column.visit(visitor);
49
+ }
50
+ }
51
+
52
+ public boolean isEmpty()
53
+ {
54
+ return columns.isEmpty();
55
+ }
56
+
57
+ public int size()
58
+ {
59
+ return columns.size();
60
+ }
61
+
62
+ public int getFixedStorageSize()
63
+ {
64
+ int total = 0;
65
+ for (Column column : columns) {
66
+ total += column.getType().getFixedStorageSize();
67
+ }
68
+ return total;
69
+ }
70
+
71
+ @Override
72
+ public boolean equals(Object obj)
73
+ {
74
+ if (this == obj) {
75
+ return true;
76
+ }
77
+ if (!(obj instanceof Schema)) {
78
+ return false;
79
+ }
80
+ Schema other = (Schema) obj;
81
+ return Objects.equal(columns, other.columns);
82
+ }
83
+
84
+ @Override
85
+ public int hashCode()
86
+ {
87
+ return Objects.hashCode(columns);
88
+ }
89
+
90
+ @Override
91
+ public String toString()
92
+ {
93
+ StringBuilder sbuf = new StringBuilder();
94
+ sbuf.append("Schema{\n");
95
+ for (Column c : columns) {
96
+ sbuf.append(String.format(" %4d: %s %s%n", c.getIndex(), c.getName(), c.getType()));
97
+ }
98
+ sbuf.append("}");
99
+ return sbuf.toString();
100
+ }
101
+ }
@@ -0,0 +1,52 @@
1
+ package org.embulk.spi;
2
+
3
+ import java.util.List;
4
+ import com.google.common.base.Objects;
5
+ import com.google.common.collect.ImmutableList;
6
+ import com.fasterxml.jackson.annotation.JsonCreator;
7
+ import com.fasterxml.jackson.annotation.JsonValue;
8
+
9
+ public class SchemaConfig
10
+ {
11
+ private final List<ColumnConfig> columns;
12
+
13
+ @JsonCreator
14
+ public SchemaConfig(List<ColumnConfig> columns)
15
+ {
16
+ this.columns = columns;
17
+ }
18
+
19
+ @JsonValue
20
+ public List<ColumnConfig> getColumns()
21
+ {
22
+ return columns;
23
+ }
24
+
25
+ public Schema toSchema()
26
+ {
27
+ ImmutableList.Builder<Column> builder = ImmutableList.builder();
28
+ for (int i=0; i < columns.size(); i++) {
29
+ builder.add(columns.get(i).toColumn(i));
30
+ }
31
+ return new Schema(builder.build());
32
+ }
33
+
34
+ @Override
35
+ public boolean equals(Object obj)
36
+ {
37
+ if (this == obj) {
38
+ return true;
39
+ }
40
+ if (!(obj instanceof SchemaConfig)) {
41
+ return false;
42
+ }
43
+ SchemaConfig other = (SchemaConfig) obj;
44
+ return Objects.equal(columns, other.columns);
45
+ }
46
+
47
+ @Override
48
+ public int hashCode()
49
+ {
50
+ return Objects.hashCode(columns);
51
+ }
52
+ }
@@ -0,0 +1,14 @@
1
+ package org.embulk.spi;
2
+
3
+ public interface SchemaVisitor
4
+ {
5
+ public void booleanColumn(Column column);
6
+
7
+ public void longColumn(Column column);
8
+
9
+ public void doubleColumn(Column column);
10
+
11
+ public void stringColumn(Column column);
12
+
13
+ public void timestampColumn(Column column);
14
+ }
@@ -0,0 +1,10 @@
1
+ package org.embulk.spi;
2
+
3
+ import org.embulk.config.CommitReport;
4
+
5
+ public interface Transactional
6
+ {
7
+ public void abort();
8
+
9
+ public CommitReport commit();
10
+ }
@@ -0,0 +1,17 @@
1
+ package org.embulk.spi;
2
+
3
+ import org.embulk.config.CommitReport;
4
+
5
+ public interface TransactionalFileInput
6
+ extends Transactional, FileInput
7
+ {
8
+ public Buffer poll();
9
+
10
+ public boolean nextFile();
11
+
12
+ public void close();
13
+
14
+ public void abort();
15
+
16
+ public CommitReport commit();
17
+ }
@@ -0,0 +1,19 @@
1
+ package org.embulk.spi;
2
+
3
+ import org.embulk.config.CommitReport;
4
+
5
+ public interface TransactionalFileOutput
6
+ extends Transactional, FileOutput
7
+ {
8
+ public void nextFile();
9
+
10
+ public void add(Buffer buffer);
11
+
12
+ public void finish();
13
+
14
+ public void close();
15
+
16
+ public void abort();
17
+
18
+ public CommitReport commit();
19
+ }
@@ -0,0 +1,17 @@
1
+ package org.embulk.spi;
2
+
3
+ import org.embulk.config.CommitReport;
4
+
5
+ public interface TransactionalPageOutput
6
+ extends Transactional, PageOutput
7
+ {
8
+ public void add(Page page);
9
+
10
+ public void finish();
11
+
12
+ public void close();
13
+
14
+ public void abort();
15
+
16
+ public CommitReport commit();
17
+ }
@@ -0,0 +1,57 @@
1
+ package org.embulk.spi.time;
2
+
3
+ import java.io.IOException;
4
+ import org.joda.time.DateTimeZone;
5
+ import com.fasterxml.jackson.core.JsonGenerator;
6
+ import com.fasterxml.jackson.databind.Module;
7
+ import com.fasterxml.jackson.databind.module.SimpleModule;
8
+ import com.fasterxml.jackson.databind.SerializerProvider;
9
+ import com.fasterxml.jackson.databind.DeserializationContext;
10
+ import com.fasterxml.jackson.databind.JsonSerializer;
11
+ import com.fasterxml.jackson.databind.JsonMappingException;
12
+ import com.fasterxml.jackson.databind.deser.std.FromStringDeserializer;
13
+ import com.fasterxml.jackson.module.guice.ObjectMapperModule;
14
+ import org.embulk.config.ModelManager;
15
+
16
+ public class DateTimeZoneSerDe
17
+ {
18
+ public static void configure(ObjectMapperModule mapper)
19
+ {
20
+ SimpleModule module = new SimpleModule();
21
+ module.addSerializer(DateTimeZone.class, new DateTimeZoneSerializer());
22
+ module.addDeserializer(DateTimeZone.class, new DateTimeZoneDeserializer());
23
+ mapper.registerModule(module);
24
+ }
25
+
26
+ public static class DateTimeZoneSerializer
27
+ extends JsonSerializer<DateTimeZone>
28
+ {
29
+ @Override
30
+ public void serialize(DateTimeZone value, JsonGenerator jgen, SerializerProvider provider)
31
+ throws IOException
32
+ {
33
+ jgen.writeString(value.getID());
34
+ }
35
+ }
36
+
37
+ public static class DateTimeZoneDeserializer
38
+ extends FromStringDeserializer<DateTimeZone>
39
+ {
40
+ public DateTimeZoneDeserializer()
41
+ {
42
+ super(DateTimeZone.class);
43
+ }
44
+
45
+ @Override
46
+ protected DateTimeZone _deserialize(String value, DeserializationContext context)
47
+ throws JsonMappingException
48
+ {
49
+ DateTimeZone parsed = TimestampFormat.parseDateTimeZone(value);
50
+ if (parsed == null) {
51
+ // TODO include link to a document to the message for the list of supported time zones
52
+ throw new JsonMappingException(String.format("Unknown time zone name '%s'", value));
53
+ }
54
+ return parsed;
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,8 @@
1
+ package org.embulk.spi.time;
2
+
3
+ public interface JRubyTimeParserHelper
4
+ {
5
+ public long strptime(String text) throws TimestampParseException;
6
+
7
+ public String getZone();
8
+ }
@@ -0,0 +1,6 @@
1
+ package org.embulk.spi.time;
2
+
3
+ public interface JRubyTimeParserHelperFactory
4
+ {
5
+ public JRubyTimeParserHelper newInstance(String formatString, int year, int mon, int day, int hour, int min, int sec, int usec);
6
+ }
@@ -0,0 +1,159 @@
1
+ package org.embulk.spi.time;
2
+
3
+ import java.util.regex.Pattern;
4
+ import java.util.regex.Matcher;
5
+ import org.joda.time.format.DateTimeFormat;
6
+ import org.joda.time.format.DateTimeFormatter;
7
+ import org.joda.time.DateTime;
8
+ import org.jruby.Ruby;
9
+ import org.jruby.RubyTime;
10
+
11
+ public class Timestamp
12
+ implements Comparable<Timestamp>
13
+ {
14
+ private final static DateTimeFormatter TO_STRING_FORMATTER_SECONDS = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss z").withZoneUTC();
15
+ private final static DateTimeFormatter TO_STRING_FORMATTER_MILLIS = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS z").withZoneUTC();
16
+ private final static DateTimeFormatter TO_STRING_FORMATTER_CUSTOM = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").withZoneUTC();
17
+ private static final Pattern FROM_STRING_PATTERN = Pattern.compile("(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})(?:\\.(\\d{1,9}))? UTC");
18
+
19
+ private final long seconds;
20
+ private final int nano;
21
+
22
+ private Timestamp(long seconds, int nano)
23
+ {
24
+ this.seconds = seconds;
25
+ this.nano = nano;
26
+ }
27
+
28
+ public static Timestamp ofEpochSecond(long epochSecond)
29
+ {
30
+ return new Timestamp(epochSecond, 0);
31
+ }
32
+
33
+ public static Timestamp ofEpochSecond(long epochSecond, long nanoAdjustment)
34
+ {
35
+ return new Timestamp(epochSecond + nanoAdjustment / 1000000000, (int) (nanoAdjustment % 1000000000));
36
+ }
37
+
38
+ public static Timestamp ofEpochMilli(long epochMilli)
39
+ {
40
+ return new Timestamp(epochMilli / 1000, (int) (epochMilli % 1000 * 1000000));
41
+ }
42
+
43
+ public long getEpochSecond()
44
+ {
45
+ return seconds;
46
+ }
47
+
48
+ public int getNano()
49
+ {
50
+ return nano;
51
+ }
52
+
53
+ public long toEpochMilli()
54
+ {
55
+ return seconds * 1000 + nano / 1000000;
56
+ }
57
+
58
+ @Override
59
+ public boolean equals(Object other)
60
+ {
61
+ if (this == other) {
62
+ return true;
63
+ }
64
+ if (!(other instanceof Timestamp)) {
65
+ return false;
66
+ }
67
+ Timestamp o = (Timestamp) other;
68
+ return this.seconds == o.seconds && this.nano == o.nano;
69
+ }
70
+
71
+ @Override
72
+ public int hashCode()
73
+ {
74
+ int h = (int) (seconds ^ (seconds >>> 32));
75
+ h += 17 * nano;
76
+ return h;
77
+ }
78
+
79
+ @Override
80
+ public int compareTo(Timestamp t)
81
+ {
82
+ if (seconds < t.seconds) {
83
+ return -1;
84
+ } else if (seconds == t.seconds) {
85
+ return nano == t.nano ? 0 : (nano < t.nano ? -1 : 1);
86
+ } else {
87
+ return 1;
88
+ }
89
+ }
90
+
91
+ public RubyTime getRubyTime(Ruby runtime)
92
+ {
93
+ RubyTime time = new RubyTime(runtime, runtime.getClass("Time"), new DateTime(toEpochMilli())).gmtime();
94
+ time.setNSec(nano % 1000000);
95
+ return time;
96
+ }
97
+
98
+ public Timestamp fromRubyTime(RubyTime time)
99
+ {
100
+ long msec = time.getDateTime().getMillis();
101
+ long sec = msec / 1000;
102
+ long nsec = time.getNSec() + (msec % 1000) * 1000000;
103
+ return Timestamp.ofEpochSecond(sec, nsec);
104
+ }
105
+
106
+ @Override
107
+ public String toString()
108
+ {
109
+ if (nano == 0) {
110
+ return TO_STRING_FORMATTER_SECONDS.print(getEpochSecond() * 1000);
111
+
112
+ } else if (nano % 1000000 == 0) {
113
+ return TO_STRING_FORMATTER_MILLIS.print(toEpochMilli());
114
+
115
+ } else {
116
+ StringBuffer sb = new StringBuffer();
117
+ TO_STRING_FORMATTER_CUSTOM.printTo(sb, getEpochSecond() * 1000);
118
+ sb.append(".");
119
+
120
+ String digits;
121
+ int zeroDigits;
122
+ if (nano % 1000 == 0) {
123
+ digits = Integer.toString(nano / 1000);
124
+ zeroDigits = 6 - digits.length();
125
+ } else {
126
+ digits = Integer.toString(nano);
127
+ zeroDigits = 9 - digits.length();
128
+ }
129
+ sb.append(digits);
130
+ for (; zeroDigits > 0; zeroDigits--) {
131
+ sb.append('0');
132
+ }
133
+
134
+ sb.append(" UTC");
135
+ return sb.toString();
136
+ }
137
+ }
138
+
139
+ static Timestamp fromString(String text)
140
+ {
141
+ // TODO exception handling
142
+ Matcher m = FROM_STRING_PATTERN.matcher(text);
143
+ if (!m.matches()) {
144
+ throw new IllegalArgumentException(String.format("Invalid timestamp format '%s'", text));
145
+ }
146
+
147
+ long seconds = TO_STRING_FORMATTER_CUSTOM.parseDateTime(m.group(1)).getMillis() / 1000;
148
+
149
+ int nano;
150
+ String frac = m.group(2);
151
+ if (frac == null) {
152
+ nano = 0;
153
+ } else {
154
+ nano = Integer.parseInt(frac) * (int) Math.pow(10, 9 - frac.length());
155
+ }
156
+
157
+ return new Timestamp(seconds, nano);
158
+ }
159
+ }