embulk 0.3.2 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/.travis.yml +16 -0
- data/Gemfile +0 -1
- data/README.md +37 -19
- data/Rakefile +5 -37
- data/bin/embulk +1 -1
- data/build.gradle +178 -95
- data/embulk-core/build.gradle +1 -1
- data/embulk-core/src/main/java/org/embulk/command/Runner.java +11 -10
- data/embulk-core/src/main/java/org/embulk/config/ConfigDiff.java +26 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigInject.java +14 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +2 -2
- data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +4 -3
- data/embulk-core/src/main/java/org/embulk/config/TaskSerDe.java +5 -3
- data/embulk-core/src/main/java/org/embulk/config/TaskValidationException.java +1 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecutionResult.java +6 -6
- data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +19 -19
- data/embulk-core/src/main/java/org/embulk/exec/LocalExecutor.java +61 -36
- data/embulk-core/src/main/java/org/embulk/plugin/InjectedPluginSource.java +4 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +16 -1
- data/embulk-core/src/main/java/org/embulk/spi/Column.java +1 -1
- data/embulk-core/src/main/java/org/embulk/spi/{SchemaVisitor.java → ColumnVisitor.java} +1 -1
- data/embulk-core/src/main/java/org/embulk/spi/Exec.java +3 -3
- data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +2 -2
- data/embulk-core/src/main/java/org/embulk/spi/FileInputPlugin.java +3 -3
- data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +3 -3
- data/embulk-core/src/main/java/org/embulk/spi/FileOutputPlugin.java +3 -3
- data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +3 -3
- data/embulk-core/src/main/java/org/embulk/spi/FilterPlugin.java +1 -1
- data/embulk-core/src/main/java/org/embulk/spi/GuessPlugin.java +2 -2
- data/embulk-core/src/main/java/org/embulk/spi/InputPlugin.java +3 -3
- data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +3 -3
- data/embulk-core/src/main/java/org/embulk/spi/PluginClassLoader.java +80 -0
- data/embulk-core/src/main/java/org/embulk/spi/Schema.java +1 -1
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +2 -2
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +2 -2
- data/embulk-core/src/main/java/org/embulk/spi/util/Filters.java +1 -1
- data/embulk-core/src/main/java/org/embulk/spi/util/LineEncoder.java +2 -2
- data/embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java +6 -6
- data/embulk-core/src/main/java/org/embulk/spi/util/Pages.java +6 -6
- data/embulk-core/src/test/java/org/embulk/GuiceBinder.java +1 -1
- data/embulk-core/src/test/java/org/embulk/plugin/MockPluginSource.java +1 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockFormatterPlugin.java +2 -2
- data/embulk-core/src/test/java/org/embulk/spi/PageTestUtils.java +1 -1
- data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +3 -3
- data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +4 -4
- data/embulk-docs/Makefile +178 -0
- data/embulk-docs/build.gradle +20 -0
- data/embulk-docs/make.bat +243 -0
- data/embulk-docs/push-gh-pages.sh +29 -0
- data/embulk-docs/src/conf.py +260 -0
- data/embulk-docs/src/index.rst +19 -0
- data/embulk-docs/src/release.rst +14 -0
- data/embulk-docs/src/release/release-0.1.0.rst +8 -0
- data/embulk-docs/src/release/release-0.2.0.rst +16 -0
- data/embulk-docs/src/release/release-0.2.1.rst +19 -0
- data/embulk-docs/src/release/release-0.3.0.rst +34 -0
- data/embulk-docs/src/release/release-0.3.1.rst +11 -0
- data/embulk-docs/src/release/release-0.3.2.rst +15 -0
- data/embulk-docs/src/release/release-0.4.0.rst +74 -0
- data/embulk-standards/build.gradle +0 -1
- data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +2 -2
- data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +12 -3
- data/embulk-standards/src/main/java/org/embulk/standards/GzipFileDecoderPlugin.java +2 -2
- data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +49 -26
- data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +16 -17
- data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +4 -4
- data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java +0 -1
- data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +5 -5
- data/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/gradle/wrapper/gradle-wrapper.properties +2 -2
- data/lib/embulk/buffer.rb +2 -2
- data/lib/embulk/column.rb +6 -6
- data/lib/embulk/command/embulk_example.rb +1 -1
- data/lib/embulk/command/embulk_new_plugin.rb +87 -0
- data/lib/embulk/command/embulk_run.rb +84 -26
- data/lib/embulk/data/bundle/Gemfile +12 -20
- data/lib/embulk/data/bundle/embulk/{filter_example.rb → filter/example.rb} +3 -3
- data/lib/embulk/data/bundle/embulk/{input_example.rb → input/example.rb} +3 -3
- data/lib/embulk/data/bundle/embulk/{output_example.rb → output/example.rb} +3 -3
- data/lib/embulk/data/new/LICENSE.txt +21 -0
- data/lib/embulk/data/new/README.md.erb +75 -0
- data/lib/embulk/data/new/gitignore.erb +12 -0
- data/lib/embulk/data/new/java/build.gradle.erb +57 -0
- data/lib/embulk/data/new/java/decoder.java.erb +40 -0
- data/lib/embulk/data/new/java/encoder.java.erb +40 -0
- data/lib/embulk/data/new/java/file_input.java.erb +64 -0
- data/lib/embulk/data/new/java/file_output.java.erb +66 -0
- data/lib/embulk/data/new/java/filter.java.erb +47 -0
- data/lib/embulk/data/new/java/formatter.java.erb +45 -0
- data/lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.properties +6 -0
- data/lib/embulk/data/new/java/gradlew +164 -0
- data/lib/embulk/data/new/java/gradlew.bat +90 -0
- data/lib/embulk/data/new/java/input.java.erb +69 -0
- data/lib/embulk/data/new/java/output.java.erb +65 -0
- data/lib/embulk/data/new/java/parser.java.erb +51 -0
- data/lib/embulk/data/new/java/plugin_loader.rb.erb +3 -0
- data/lib/embulk/data/new/java/test.java.erb +5 -0
- data/lib/embulk/data/new/ruby/Gemfile +2 -0
- data/lib/embulk/data/new/ruby/Rakefile +1 -0
- data/lib/embulk/data/new/ruby/filter.rb.erb +39 -0
- data/lib/embulk/data/new/ruby/gemspec.erb +19 -0
- data/lib/embulk/data/new/ruby/input.rb.erb +47 -0
- data/lib/embulk/data/new/ruby/output.rb.erb +59 -0
- data/lib/embulk/data/package_data.rb +64 -0
- data/lib/embulk/data_source.rb +2 -2
- data/lib/embulk/decoder_plugin.rb +27 -0
- data/lib/embulk/encoder_plugin.rb +27 -0
- data/lib/embulk/error.rb +3 -0
- data/lib/embulk/file_input_plugin.rb +27 -0
- data/lib/embulk/file_output_plugin.rb +27 -0
- data/lib/embulk/filter_plugin.rb +28 -9
- data/lib/embulk/formatter_plugin.rb +105 -0
- data/lib/embulk/guess_csv.rb +10 -1
- data/lib/embulk/guess_plugin.rb +22 -27
- data/lib/embulk/input_plugin.rb +34 -20
- data/lib/embulk/java/bootstrap.rb +5 -0
- data/lib/embulk/java/imports.rb +7 -0
- data/lib/embulk/java_plugin.rb +84 -0
- data/lib/embulk/output_plugin.rb +35 -19
- data/lib/embulk/page.rb +1 -1
- data/lib/embulk/page_builder.rb +1 -1
- data/lib/embulk/parser_plugin.rb +76 -0
- data/lib/embulk/plugin.rb +130 -65
- data/lib/embulk/plugin_registry.rb +19 -8
- data/lib/embulk/schema.rb +4 -4
- data/lib/embulk/version.rb +1 -1
- data/settings.gradle +1 -0
- metadata +123 -90
- data/ChangeLog +0 -46
- data/embulk-cli/pom.xml +0 -94
- data/embulk-core/pom.xml +0 -148
- data/embulk-core/src/main/java/org/embulk/config/NextConfig.java +0 -26
- data/embulk-standards/pom.xml +0 -68
- data/embulk-standards/src/main/java/org/embulk/standards/S3FileInputPlugin.java +0 -250
- data/embulk-standards/src/test/java/org/embulk/standards/TestS3FileInputPlugin.java +0 -43
- data/pom.xml +0 -541
data/embulk-core/build.gradle
CHANGED
@@ -17,7 +17,7 @@ import com.google.inject.Injector;
|
|
17
17
|
import org.embulk.config.ConfigSource;
|
18
18
|
import org.embulk.config.DataSource;
|
19
19
|
import org.embulk.config.ConfigLoader;
|
20
|
-
import org.embulk.config.
|
20
|
+
import org.embulk.config.ConfigDiff;
|
21
21
|
import org.embulk.config.ModelManager;
|
22
22
|
import org.embulk.config.ConfigException;
|
23
23
|
import org.embulk.exec.LocalExecutor;
|
@@ -130,13 +130,14 @@ public class Runner
|
|
130
130
|
|
131
131
|
// delete resume file
|
132
132
|
if (options.getResumeStatePath() != null) {
|
133
|
-
new File(options.getResumeStatePath()).delete();
|
133
|
+
boolean dontCare = new File(options.getResumeStatePath()).delete();
|
134
134
|
}
|
135
135
|
|
136
136
|
// write next config
|
137
|
-
|
138
|
-
exec.getLogger(Runner.class).info("
|
139
|
-
|
137
|
+
ConfigDiff configDiff = result.getConfigDiff();
|
138
|
+
exec.getLogger(Runner.class).info("Committed.");
|
139
|
+
exec.getLogger(Runner.class).info("Next config diff: {}", configDiff.toString());
|
140
|
+
writeNextConfig(options.getNextConfigOutputPath(), config, configDiff);
|
140
141
|
}
|
141
142
|
|
142
143
|
public void cleanup(String configPath)
|
@@ -154,7 +155,7 @@ public class Runner
|
|
154
155
|
local.cleanup(config, resume);
|
155
156
|
|
156
157
|
// delete resume file
|
157
|
-
new File(options.getResumeStatePath()).delete();
|
158
|
+
boolean dontCare = new File(options.getResumeStatePath()).delete();
|
158
159
|
}
|
159
160
|
|
160
161
|
public void guess(String partialConfigPath)
|
@@ -164,9 +165,9 @@ public class Runner
|
|
164
165
|
|
165
166
|
ExecSession exec = newExecSession(config);
|
166
167
|
GuessExecutor guess = injector.getInstance(GuessExecutor.class);
|
167
|
-
|
168
|
+
ConfigDiff configDiff = guess.guess(exec, config);
|
168
169
|
|
169
|
-
String yml = writeNextConfig(options.getNextConfigOutputPath(), config,
|
170
|
+
String yml = writeNextConfig(options.getNextConfigOutputPath(), config, configDiff);
|
170
171
|
System.err.println(yml);
|
171
172
|
}
|
172
173
|
|
@@ -181,9 +182,9 @@ public class Runner
|
|
181
182
|
}
|
182
183
|
}
|
183
184
|
|
184
|
-
private String writeNextConfig(String path, ConfigSource originalConfig,
|
185
|
+
private String writeNextConfig(String path, ConfigSource originalConfig, ConfigDiff configDiff)
|
185
186
|
{
|
186
|
-
return writeYaml(path, originalConfig.merge(
|
187
|
+
return writeYaml(path, originalConfig.merge(configDiff));
|
187
188
|
}
|
188
189
|
|
189
190
|
private String writeYaml(String path, Object obj)
|
@@ -0,0 +1,26 @@
|
|
1
|
+
package org.embulk.config;
|
2
|
+
|
3
|
+
public interface ConfigDiff
|
4
|
+
extends DataSource
|
5
|
+
{
|
6
|
+
@Override
|
7
|
+
public ConfigDiff getNested(String attrName);
|
8
|
+
|
9
|
+
@Override
|
10
|
+
public ConfigDiff getNestedOrSetEmpty(String attrName);
|
11
|
+
|
12
|
+
@Override
|
13
|
+
public ConfigDiff set(String attrName, Object v);
|
14
|
+
|
15
|
+
@Override
|
16
|
+
public ConfigDiff setNested(String attrName, DataSource v);
|
17
|
+
|
18
|
+
@Override
|
19
|
+
public ConfigDiff setAll(DataSource other);
|
20
|
+
|
21
|
+
@Override
|
22
|
+
public ConfigDiff deepCopy();
|
23
|
+
|
24
|
+
@Override
|
25
|
+
public ConfigDiff merge(DataSource other);
|
26
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
package org.embulk.config;
|
2
|
+
|
3
|
+
import java.lang.annotation.Documented;
|
4
|
+
import java.lang.annotation.ElementType;
|
5
|
+
import java.lang.annotation.Retention;
|
6
|
+
import java.lang.annotation.RetentionPolicy;
|
7
|
+
import java.lang.annotation.Target;
|
8
|
+
|
9
|
+
@Documented
|
10
|
+
@Retention(RetentionPolicy.RUNTIME)
|
11
|
+
@Target(ElementType.METHOD)
|
12
|
+
public @interface ConfigInject
|
13
|
+
{
|
14
|
+
}
|
@@ -13,7 +13,7 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
|
|
13
13
|
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
|
14
14
|
|
15
15
|
public class DataSourceImpl
|
16
|
-
implements ConfigSource, TaskSource, CommitReport,
|
16
|
+
implements ConfigSource, TaskSource, CommitReport, ConfigDiff
|
17
17
|
{
|
18
18
|
protected final ObjectNode data;
|
19
19
|
protected final ModelManager model;
|
@@ -51,7 +51,7 @@ public class DataSourceImpl
|
|
51
51
|
@Override
|
52
52
|
public Iterable<Map.Entry<String, JsonNode>> getAttributes()
|
53
53
|
{
|
54
|
-
return new Iterable() {
|
54
|
+
return new Iterable<Map.Entry<String,JsonNode>>() {
|
55
55
|
public Iterator<Map.Entry<String, JsonNode>> iterator()
|
56
56
|
{
|
57
57
|
return data.fields();
|
@@ -38,9 +38,9 @@ public class DataSourceSerDe
|
|
38
38
|
addSerializer(CommitReport.class, new DataSourceSerializer<CommitReport>());
|
39
39
|
addDeserializer(CommitReport.class, new DataSourceDeserializer<CommitReport>(model));
|
40
40
|
|
41
|
-
//
|
42
|
-
addSerializer(
|
43
|
-
addDeserializer(
|
41
|
+
// ConfigDiff
|
42
|
+
addSerializer(ConfigDiff.class, new DataSourceSerializer<ConfigDiff>());
|
43
|
+
addDeserializer(ConfigDiff.class, new DataSourceDeserializer<ConfigDiff>(model));
|
44
44
|
}
|
45
45
|
}
|
46
46
|
|
@@ -57,6 +57,7 @@ public class DataSourceSerDe
|
|
57
57
|
}
|
58
58
|
|
59
59
|
@Override
|
60
|
+
@SuppressWarnings("unchecked")
|
60
61
|
public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
|
61
62
|
{
|
62
63
|
JsonNode json = treeObjectMapper.readTree(jp);
|
@@ -28,7 +28,6 @@ import com.fasterxml.jackson.databind.SerializerProvider;
|
|
28
28
|
import com.fasterxml.jackson.databind.DeserializationContext;
|
29
29
|
import com.fasterxml.jackson.databind.DeserializationConfig;
|
30
30
|
import com.fasterxml.jackson.databind.JsonMappingException;
|
31
|
-
import com.fasterxml.jackson.annotation.JacksonInject;
|
32
31
|
|
33
32
|
class TaskSerDe
|
34
33
|
{
|
@@ -93,7 +92,7 @@ class TaskSerDe
|
|
93
92
|
Method getterMethod = getter.getValue();
|
94
93
|
String fieldName = getter.getKey();
|
95
94
|
|
96
|
-
if (getterMethod.getAnnotation(
|
95
|
+
if (getterMethod.getAnnotation(ConfigInject.class) != null) {
|
97
96
|
// InjectEntry
|
98
97
|
continue;
|
99
98
|
}
|
@@ -117,7 +116,7 @@ class TaskSerDe
|
|
117
116
|
for (Map.Entry<String, Method> getter : TaskInvocationHandler.fieldGetters(iface).entrySet()) {
|
118
117
|
Method getterMethod = getter.getValue();
|
119
118
|
String fieldName = getter.getKey();
|
120
|
-
|
119
|
+
ConfigInject inject = getterMethod.getAnnotation(ConfigInject.class);
|
121
120
|
if (inject != null) {
|
122
121
|
// InjectEntry
|
123
122
|
builder.add(new InjectEntry(fieldName, getterMethod.getReturnType()));
|
@@ -137,6 +136,7 @@ class TaskSerDe
|
|
137
136
|
}
|
138
137
|
|
139
138
|
@Override
|
139
|
+
@SuppressWarnings("unchecked")
|
140
140
|
public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
|
141
141
|
{
|
142
142
|
Map<String, Object> objects = new ConcurrentHashMap<String, Object>();
|
@@ -317,6 +317,7 @@ class TaskSerDe
|
|
317
317
|
});
|
318
318
|
}
|
319
319
|
|
320
|
+
@SuppressWarnings("unchecked")
|
320
321
|
protected JsonDeserializer<?> newTaskDeserializer(Class<?> raw)
|
321
322
|
{
|
322
323
|
return new TaskDeserializer(nestedObjectMapper, model, raw);
|
@@ -335,6 +336,7 @@ class TaskSerDe
|
|
335
336
|
public String getModuleName() { return "embulk.config.ConfigTaskSerDe"; }
|
336
337
|
|
337
338
|
@Override
|
339
|
+
@SuppressWarnings("unchecked")
|
338
340
|
protected JsonDeserializer<?> newTaskDeserializer(Class<?> raw)
|
339
341
|
{
|
340
342
|
return new ConfigTaskDeserializer(nestedObjectMapper, model, raw);
|
@@ -1,22 +1,22 @@
|
|
1
1
|
package org.embulk.exec;
|
2
2
|
|
3
3
|
import java.util.List;
|
4
|
-
import org.embulk.config.
|
4
|
+
import org.embulk.config.ConfigDiff;
|
5
5
|
|
6
6
|
public class ExecutionResult
|
7
7
|
{
|
8
|
-
private final
|
8
|
+
private final ConfigDiff configDiff;
|
9
9
|
private final List<Throwable> ignoredExceptions;
|
10
10
|
|
11
|
-
public ExecutionResult(
|
11
|
+
public ExecutionResult(ConfigDiff configDiff, List<Throwable> ignoredExceptions)
|
12
12
|
{
|
13
|
-
this.
|
13
|
+
this.configDiff = configDiff;
|
14
14
|
this.ignoredExceptions = ignoredExceptions;
|
15
15
|
}
|
16
16
|
|
17
|
-
public
|
17
|
+
public ConfigDiff getConfigDiff()
|
18
18
|
{
|
19
|
-
return
|
19
|
+
return configDiff;
|
20
20
|
}
|
21
21
|
|
22
22
|
public List<Throwable> getIgnoredExceptions()
|
@@ -8,7 +8,7 @@ import com.google.inject.Injector;
|
|
8
8
|
import com.google.common.base.Throwables;
|
9
9
|
import org.embulk.config.Config;
|
10
10
|
import org.embulk.config.ConfigDefault;
|
11
|
-
import org.embulk.config.
|
11
|
+
import org.embulk.config.ConfigDiff;
|
12
12
|
import org.embulk.config.DataSource;
|
13
13
|
import org.embulk.config.Task;
|
14
14
|
import org.embulk.config.TaskSource;
|
@@ -64,11 +64,11 @@ public class GuessExecutor
|
|
64
64
|
new PluginType("csv"));
|
65
65
|
}
|
66
66
|
|
67
|
-
public
|
67
|
+
public ConfigDiff guess(ExecSession exec, final ConfigSource config)
|
68
68
|
{
|
69
69
|
try {
|
70
|
-
return Exec.doWith(exec, new ExecAction<
|
71
|
-
public
|
70
|
+
return Exec.doWith(exec, new ExecAction<ConfigDiff>() {
|
71
|
+
public ConfigDiff run()
|
72
72
|
{
|
73
73
|
return doGuess(config);
|
74
74
|
}
|
@@ -78,7 +78,7 @@ public class GuessExecutor
|
|
78
78
|
}
|
79
79
|
}
|
80
80
|
|
81
|
-
private
|
81
|
+
private ConfigDiff doGuess(ConfigSource config)
|
82
82
|
{
|
83
83
|
Buffer sample = SamplingParserPlugin.runFileInputSampling(config);
|
84
84
|
if (sample.limit() == 0) {
|
@@ -93,11 +93,11 @@ public class GuessExecutor
|
|
93
93
|
return runGuessInput(sample, config, guessPlugins);
|
94
94
|
}
|
95
95
|
|
96
|
-
private
|
96
|
+
private ConfigDiff runGuessInput(Buffer sample,
|
97
97
|
ConfigSource config, List<PluginType> guessPlugins)
|
98
98
|
{
|
99
99
|
// repeat guessing upto 10 times
|
100
|
-
|
100
|
+
ConfigDiff lastGuessed = Exec.newConfigDiff();
|
101
101
|
for (int i=0; i < 10; i++) {
|
102
102
|
// include last-guessed config to run guess input
|
103
103
|
ConfigSource originalConfig = config.getNested("in").deepCopy().merge(lastGuessed);
|
@@ -109,7 +109,7 @@ public class GuessExecutor
|
|
109
109
|
|
110
110
|
// run FileInputPlugin
|
111
111
|
final FileInputRunner input = new FileInputRunner(new BufferFileInputPlugin(sample));
|
112
|
-
|
112
|
+
ConfigDiff guessed;
|
113
113
|
try {
|
114
114
|
input.transaction(guessInputConfig, new InputPlugin.Control() {
|
115
115
|
public List<CommitReport> run(TaskSource inputTaskSource, Schema schema, int processorCount)
|
@@ -148,9 +148,9 @@ public class GuessExecutor
|
|
148
148
|
return wrapInIn(lastGuessed);
|
149
149
|
}
|
150
150
|
|
151
|
-
private static
|
151
|
+
private static ConfigDiff wrapInIn(ConfigDiff lastGuessed)
|
152
152
|
{
|
153
|
-
|
153
|
+
ConfigDiff wrapped = Exec.newConfigDiff();
|
154
154
|
wrapped.getNestedOrSetEmpty("in").merge(lastGuessed);
|
155
155
|
return wrapped;
|
156
156
|
}
|
@@ -165,13 +165,13 @@ public class GuessExecutor
|
|
165
165
|
this.buffer = buffer;
|
166
166
|
}
|
167
167
|
|
168
|
-
public
|
168
|
+
public ConfigDiff transaction(ConfigSource config, FileInputPlugin.Control control)
|
169
169
|
{
|
170
170
|
control.run(Exec.newTaskSource(), 1);
|
171
|
-
return Exec.
|
171
|
+
return Exec.newConfigDiff();
|
172
172
|
}
|
173
173
|
|
174
|
-
public
|
174
|
+
public ConfigDiff resume(TaskSource taskSource,
|
175
175
|
int processorCount,
|
176
176
|
FileInputPlugin.Control control)
|
177
177
|
{
|
@@ -271,9 +271,9 @@ public class GuessExecutor
|
|
271
271
|
|
272
272
|
// run guess plugins
|
273
273
|
ConfigSource mergedConfig = originalConfig.deepCopy();
|
274
|
-
|
274
|
+
ConfigDiff mergedGuessed = Exec.newConfigDiff();
|
275
275
|
for (int i=0; i < guesses.size(); i++) {
|
276
|
-
|
276
|
+
ConfigDiff guessed = guesses.get(i).guess(originalConfig, sample);
|
277
277
|
guessed = addAssumedDecoderConfigs(originalConfig, guessed);
|
278
278
|
mergedGuessed.merge(guessed);
|
279
279
|
mergedConfig.merge(mergedGuessed);
|
@@ -308,7 +308,7 @@ public class GuessExecutor
|
|
308
308
|
|
309
309
|
private static class ConfigSourceList extends ArrayList<ConfigSource> { };
|
310
310
|
|
311
|
-
private static
|
311
|
+
private static ConfigDiff addAssumedDecoderConfigs(ConfigSource originalConfig, ConfigDiff guessed)
|
312
312
|
{
|
313
313
|
List<ConfigSource> guessedDecoders = guessed.get(ConfigSourceList.class, "decoders", null);
|
314
314
|
if (guessedDecoders == null) {
|
@@ -328,14 +328,14 @@ public class GuessExecutor
|
|
328
328
|
public static class GuessedNoticeError
|
329
329
|
extends Error
|
330
330
|
{
|
331
|
-
private final
|
331
|
+
private final ConfigDiff guessedConfig;
|
332
332
|
|
333
|
-
public GuessedNoticeError(
|
333
|
+
public GuessedNoticeError(ConfigDiff guessedConfig)
|
334
334
|
{
|
335
335
|
this.guessedConfig = guessedConfig;
|
336
336
|
}
|
337
337
|
|
338
|
-
public
|
338
|
+
public ConfigDiff getGuessedConfig()
|
339
339
|
{
|
340
340
|
return guessedConfig;
|
341
341
|
}
|
@@ -22,7 +22,7 @@ import org.embulk.config.Config;
|
|
22
22
|
import org.embulk.config.ConfigDefault;
|
23
23
|
import org.embulk.config.ConfigSource;
|
24
24
|
import org.embulk.config.TaskSource;
|
25
|
-
import org.embulk.config.
|
25
|
+
import org.embulk.config.ConfigDiff;
|
26
26
|
import org.embulk.config.CommitReport;
|
27
27
|
import org.embulk.plugin.PluginType;
|
28
28
|
import org.embulk.spi.Schema;
|
@@ -93,8 +93,8 @@ public class LocalExecutor
|
|
93
93
|
private volatile Throwable[] exceptions;
|
94
94
|
private volatile CommitReport[] inputCommitReports;
|
95
95
|
private volatile CommitReport[] outputCommitReports;
|
96
|
-
private volatile
|
97
|
-
private volatile
|
96
|
+
private volatile ConfigDiff inputConfigDiff;
|
97
|
+
private volatile ConfigDiff outputConfigDiff;
|
98
98
|
private int processorCount;
|
99
99
|
|
100
100
|
public ProcessState(Logger logger)
|
@@ -231,20 +231,20 @@ public class LocalExecutor
|
|
231
231
|
return false;
|
232
232
|
}
|
233
233
|
|
234
|
-
public void
|
234
|
+
public void setOutputConfigDiff(ConfigDiff outputConfigDiff)
|
235
235
|
{
|
236
|
-
if (
|
237
|
-
|
236
|
+
if (outputConfigDiff == null) {
|
237
|
+
outputConfigDiff = Exec.newConfigDiff();
|
238
238
|
}
|
239
|
-
this.
|
239
|
+
this.outputConfigDiff = outputConfigDiff;
|
240
240
|
}
|
241
241
|
|
242
|
-
public void
|
242
|
+
public void setInputConfigDiff(ConfigDiff inputConfigDiff)
|
243
243
|
{
|
244
|
-
if (
|
245
|
-
|
244
|
+
if (inputConfigDiff == null) {
|
245
|
+
inputConfigDiff = Exec.newConfigDiff();
|
246
246
|
}
|
247
|
-
this.
|
247
|
+
this.inputConfigDiff = inputConfigDiff;
|
248
248
|
}
|
249
249
|
|
250
250
|
public List<CommitReport> getInputCommitReports()
|
@@ -297,12 +297,12 @@ public class LocalExecutor
|
|
297
297
|
|
298
298
|
public ExecutionResult buildExecuteResultWithWarningException(Throwable ex)
|
299
299
|
{
|
300
|
-
|
301
|
-
if (
|
302
|
-
|
300
|
+
ConfigDiff configDiff = Exec.newConfigDiff();
|
301
|
+
if (inputConfigDiff != null) {
|
302
|
+
configDiff.getNestedOrSetEmpty("in").merge(inputConfigDiff);
|
303
303
|
}
|
304
|
-
if (
|
305
|
-
|
304
|
+
if (outputConfigDiff != null) {
|
305
|
+
configDiff.getNestedOrSetEmpty("out").merge(outputConfigDiff);
|
306
306
|
}
|
307
307
|
|
308
308
|
ImmutableList.Builder<Throwable> ignoredExceptions = ImmutableList.builder();
|
@@ -315,17 +315,22 @@ public class LocalExecutor
|
|
315
315
|
ignoredExceptions.add(ex);
|
316
316
|
}
|
317
317
|
|
318
|
-
return new ExecutionResult(
|
318
|
+
return new ExecutionResult(configDiff, ignoredExceptions.build());
|
319
|
+
}
|
320
|
+
|
321
|
+
public ResumeState buildResumeState(ExecutorTask task, ExecSession exec)
|
322
|
+
{
|
323
|
+
return new ResumeState(
|
324
|
+
exec.getSessionConfigSource(),
|
325
|
+
task.getInputTask(), task.getOutputTask(),
|
326
|
+
inputSchema, outputSchema,
|
327
|
+
Arrays.asList(inputCommitReports), Arrays.asList(outputCommitReports));
|
319
328
|
}
|
320
329
|
|
321
330
|
public PartialExecutionException buildPartialExecuteException(Throwable cause,
|
322
331
|
ExecutorTask task, ExecSession exec)
|
323
332
|
{
|
324
|
-
return new PartialExecutionException(cause,
|
325
|
-
exec.getSessionConfigSource(),
|
326
|
-
task.getInputTask(), task.getOutputTask(),
|
327
|
-
inputSchema, outputSchema,
|
328
|
-
Arrays.asList(inputCommitReports), Arrays.asList(outputCommitReports)));
|
333
|
+
return new PartialExecutionException(cause, buildResumeState(task, exec));
|
329
334
|
}
|
330
335
|
}
|
331
336
|
|
@@ -417,7 +422,7 @@ public class LocalExecutor
|
|
417
422
|
|
418
423
|
final ProcessState state = new ProcessState(Exec.getLogger(LocalExecutor.class));
|
419
424
|
try {
|
420
|
-
|
425
|
+
ConfigDiff inputConfigDiff = in.transaction(task.getInputConfig(), new InputPlugin.Control() {
|
421
426
|
public List<CommitReport> run(final TaskSource inputTask, final Schema inputSchema, final int processorCount)
|
422
427
|
{
|
423
428
|
state.initialize(processorCount);
|
@@ -427,27 +432,37 @@ public class LocalExecutor
|
|
427
432
|
{
|
428
433
|
Schema outputSchema = last(filterSchemas);
|
429
434
|
state.setOutputSchema(outputSchema);
|
430
|
-
|
435
|
+
ConfigDiff outputConfigDiff = out.transaction(task.getOutputConfig(), outputSchema, processorCount, new OutputPlugin.Control() {
|
431
436
|
public List<CommitReport> run(final TaskSource outputTask)
|
432
437
|
{
|
433
438
|
task.setInputTask(inputTask);
|
434
439
|
task.setFilterTasks(filterTasks);
|
435
440
|
task.setOutputTask(outputTask);
|
436
441
|
|
437
|
-
|
438
|
-
|
439
|
-
|
442
|
+
if (processorCount > 0) {
|
443
|
+
process(task.dump(), filterSchemas, processorCount, state);
|
444
|
+
if (!state.isAllCommitted()) {
|
445
|
+
throw state.getRepresentativeException();
|
446
|
+
}
|
447
|
+
} else {
|
448
|
+
// TODO warning?
|
440
449
|
}
|
441
450
|
return state.getOutputCommitReports();
|
442
451
|
}
|
443
452
|
});
|
444
|
-
state.
|
453
|
+
state.setOutputConfigDiff(outputConfigDiff);
|
445
454
|
}
|
446
455
|
});
|
447
456
|
return state.getInputCommitReports();
|
448
457
|
}
|
449
458
|
});
|
450
|
-
state.
|
459
|
+
state.setInputConfigDiff(inputConfigDiff);
|
460
|
+
|
461
|
+
try {
|
462
|
+
doCleanup(config, state.buildResumeState(task, Exec.session()));
|
463
|
+
} catch (Exception ex) {
|
464
|
+
state.logger.warn("Commit succeeded but cleanup failed. Ignoring this exception.", ex); // TODO
|
465
|
+
}
|
451
466
|
|
452
467
|
return state.buildExecuteResult();
|
453
468
|
|
@@ -473,7 +488,7 @@ public class LocalExecutor
|
|
473
488
|
|
474
489
|
final ProcessState state = new ProcessState(Exec.getLogger(LocalExecutor.class));
|
475
490
|
try {
|
476
|
-
|
491
|
+
ConfigDiff inputConfigDiff = in.resume(resume.getInputTaskSource(), resume.getInputSchema(), resume.getInputCommitReports().size(), new InputPlugin.Control() {
|
477
492
|
public List<CommitReport> run(final TaskSource inputTask, final Schema inputSchema, final int processorCount)
|
478
493
|
{
|
479
494
|
// TODO validate inputTask?
|
@@ -485,7 +500,7 @@ public class LocalExecutor
|
|
485
500
|
{
|
486
501
|
Schema outputSchema = last(filterSchemas);
|
487
502
|
state.setOutputSchema(outputSchema);
|
488
|
-
|
503
|
+
ConfigDiff outputConfigDiff = out.resume(resume.getOutputTaskSource(), outputSchema, processorCount, new OutputPlugin.Control() {
|
489
504
|
public List<CommitReport> run(final TaskSource outputTask)
|
490
505
|
{
|
491
506
|
// TODO validate outputTask?
|
@@ -502,20 +517,30 @@ public class LocalExecutor
|
|
502
517
|
}
|
503
518
|
}
|
504
519
|
|
505
|
-
|
506
|
-
|
507
|
-
|
520
|
+
if (processorCount > 0) {
|
521
|
+
process(task.dump(), filterSchemas, processorCount, state);
|
522
|
+
if (!state.isAllCommitted()) {
|
523
|
+
throw state.getRepresentativeException();
|
524
|
+
}
|
525
|
+
} else {
|
526
|
+
// TODO warning?
|
508
527
|
}
|
509
528
|
return state.getOutputCommitReports();
|
510
529
|
}
|
511
530
|
});
|
512
|
-
state.
|
531
|
+
state.setOutputConfigDiff(outputConfigDiff);
|
513
532
|
}
|
514
533
|
});
|
515
534
|
return state.getInputCommitReports();
|
516
535
|
}
|
517
536
|
});
|
518
|
-
state.
|
537
|
+
state.setInputConfigDiff(inputConfigDiff);
|
538
|
+
|
539
|
+
try {
|
540
|
+
doCleanup(config, state.buildResumeState(task, Exec.session()));
|
541
|
+
} catch (Exception ex) {
|
542
|
+
state.logger.warn("Commit succeeded but cleanup failed. Ignoring this exception.", ex); // TODO
|
543
|
+
}
|
519
544
|
|
520
545
|
return state.buildExecuteResult();
|
521
546
|
|