embulk 0.3.2 → 0.4.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 +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
|
|