embulk-filter-expand_json 0.0.3 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +4 -0
- data/build.gradle +22 -4
- data/config/checkstyle/checkstyle.xml +128 -0
- data/config/checkstyle/default.xml +108 -0
- data/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/gradle/wrapper/gradle-wrapper.properties +2 -2
- data/src/main/java/org/embulk/filter/expand_json/ExpandJsonFilterPlugin.java +14 -4
- data/src/main/java/org/embulk/filter/expand_json/FilteredPageOutput.java +191 -94
- data/src/test/java/org/embulk/filter/expand_json/TestExpandJsonFilterPlugin.java +44 -7
- metadata +11 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07943e1a2bf6a447bccb93cbd9ec0412f00382f0
|
4
|
+
data.tar.gz: 0051fdf7de1702ddd169afb6d9a4fe9ce53e0ded
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 860428fccd8b863e1070ef0e23f657c88e5312031aa222588e51b20c7caa394b2425f26dfc3322fdf69dbc0d3984ff524e3969666cb9a53c68672ead92fd8c25
|
7
|
+
data.tar.gz: d862d2cd98f348242f78a04d5cc2d4117cd4d3923428e181a40b778b509aaf37630abe97158a0f1a8d9351bffcd990aa8675ee5076f522575d86972c8f4bf6d2
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
0.0.5 (2016-03-04)
|
2
|
+
==================
|
3
|
+
- [Fix] Avoid `NullPointerException` if a column specified as `json_column_name` option doesn't exist in input schema.
|
4
|
+
- https://github.com/civitaspo/embulk-filter-expand_json/pull/6 from @muga
|
5
|
+
- [Fix] Migrate for Embulk v0.8.x
|
6
|
+
- https://github.com/civitaspo/embulk-filter-expand_json/pull/7
|
data/README.md
CHANGED
data/build.gradle
CHANGED
@@ -4,6 +4,7 @@ plugins {
|
|
4
4
|
id "com.github.kt3k.coveralls" version "2.4.0"
|
5
5
|
id "jacoco"
|
6
6
|
id "java"
|
7
|
+
id "checkstyle"
|
7
8
|
}
|
8
9
|
import com.github.jrubygradle.JRubyExec
|
9
10
|
repositories {
|
@@ -14,16 +15,16 @@ configurations {
|
|
14
15
|
provided
|
15
16
|
}
|
16
17
|
|
17
|
-
version = "0.0.
|
18
|
+
version = "0.0.5"
|
18
19
|
sourceCompatibility = 1.7
|
19
20
|
targetCompatibility = 1.7
|
20
21
|
|
21
22
|
dependencies {
|
22
|
-
compile "org.embulk:embulk-core:0.
|
23
|
-
provided "org.embulk:embulk-core:0.
|
23
|
+
compile "org.embulk:embulk-core:0.8.6"
|
24
|
+
provided "org.embulk:embulk-core:0.8.6"
|
24
25
|
compile "com.jayway.jsonpath:json-path:2.+"
|
25
26
|
testCompile "junit:junit:4.+"
|
26
|
-
testCompile "org.embulk:embulk-core:0.
|
27
|
+
testCompile "org.embulk:embulk-core:0.8.6:tests"
|
27
28
|
}
|
28
29
|
|
29
30
|
jacocoTestReport {
|
@@ -40,6 +41,23 @@ task classpath(type: Copy, dependsOn: ["jar"]) {
|
|
40
41
|
}
|
41
42
|
clean { delete "classpath" }
|
42
43
|
|
44
|
+
checkstyle {
|
45
|
+
configFile = file("${project.rootDir}/config/checkstyle/checkstyle.xml")
|
46
|
+
toolVersion = '6.14.1'
|
47
|
+
}
|
48
|
+
checkstyleMain {
|
49
|
+
configFile = file("${project.rootDir}/config/checkstyle/default.xml")
|
50
|
+
ignoreFailures = true
|
51
|
+
}
|
52
|
+
checkstyleTest {
|
53
|
+
configFile = file("${project.rootDir}/config/checkstyle/default.xml")
|
54
|
+
ignoreFailures = true
|
55
|
+
}
|
56
|
+
task checkstyle(type: Checkstyle) {
|
57
|
+
classpath = sourceSets.main.output + sourceSets.test.output
|
58
|
+
source = sourceSets.main.allJava + sourceSets.test.allJava
|
59
|
+
}
|
60
|
+
|
43
61
|
task gem(type: JRubyExec, dependsOn: ["gemspec", "classpath"]) {
|
44
62
|
jrubyArgs "-rrubygems/gem_runner", "-eGem::GemRunner.new.run(ARGV)", "build"
|
45
63
|
script "${project.name}.gemspec"
|
@@ -0,0 +1,128 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE module PUBLIC
|
3
|
+
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
|
4
|
+
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
|
5
|
+
<module name="Checker">
|
6
|
+
<!-- https://github.com/facebook/presto/blob/master/src/checkstyle/checks.xml -->
|
7
|
+
<module name="FileTabCharacter"/>
|
8
|
+
<module name="NewlineAtEndOfFile">
|
9
|
+
<property name="lineSeparator" value="lf"/>
|
10
|
+
</module>
|
11
|
+
<module name="RegexpMultiline">
|
12
|
+
<property name="format" value="\r"/>
|
13
|
+
<property name="message" value="Line contains carriage return"/>
|
14
|
+
</module>
|
15
|
+
<module name="RegexpMultiline">
|
16
|
+
<property name="format" value=" \n"/>
|
17
|
+
<property name="message" value="Line has trailing whitespace"/>
|
18
|
+
</module>
|
19
|
+
<module name="RegexpMultiline">
|
20
|
+
<property name="format" value="\{\n\n"/>
|
21
|
+
<property name="message" value="Blank line after opening brace"/>
|
22
|
+
</module>
|
23
|
+
<module name="RegexpMultiline">
|
24
|
+
<property name="format" value="\n\n\s*\}"/>
|
25
|
+
<property name="message" value="Blank line before closing brace"/>
|
26
|
+
</module>
|
27
|
+
<module name="RegexpMultiline">
|
28
|
+
<property name="format" value="\n\n\n"/>
|
29
|
+
<property name="message" value="Multiple consecutive blank lines"/>
|
30
|
+
</module>
|
31
|
+
<module name="RegexpMultiline">
|
32
|
+
<property name="format" value="\n\n\Z"/>
|
33
|
+
<property name="message" value="Blank line before end of file"/>
|
34
|
+
</module>
|
35
|
+
<module name="RegexpMultiline">
|
36
|
+
<property name="format" value="Preconditions\.checkNotNull"/>
|
37
|
+
<property name="message" value="Use of checkNotNull"/>
|
38
|
+
</module>
|
39
|
+
|
40
|
+
<module name="TreeWalker">
|
41
|
+
<module name="EmptyBlock">
|
42
|
+
<property name="option" value="text"/>
|
43
|
+
<property name="tokens" value="
|
44
|
+
LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_IF,
|
45
|
+
LITERAL_FOR, LITERAL_TRY, LITERAL_WHILE, INSTANCE_INIT, STATIC_INIT"/>
|
46
|
+
</module>
|
47
|
+
<module name="EmptyStatement"/>
|
48
|
+
<module name="EmptyForInitializerPad"/>
|
49
|
+
<module name="EmptyForIteratorPad">
|
50
|
+
<property name="option" value="space"/>
|
51
|
+
</module>
|
52
|
+
<module name="MethodParamPad">
|
53
|
+
<property name="allowLineBreaks" value="true"/>
|
54
|
+
<property name="option" value="nospace"/>
|
55
|
+
</module>
|
56
|
+
<module name="ParenPad"/>
|
57
|
+
<module name="TypecastParenPad"/>
|
58
|
+
<module name="NeedBraces"/>
|
59
|
+
<module name="LeftCurly">
|
60
|
+
<property name="option" value="nl"/>
|
61
|
+
<property name="tokens" value="CLASS_DEF, CTOR_DEF, INTERFACE_DEF, METHOD_DEF"/>
|
62
|
+
</module>
|
63
|
+
<module name="LeftCurly">
|
64
|
+
<property name="option" value="eol"/>
|
65
|
+
<property name="tokens" value="
|
66
|
+
LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR,
|
67
|
+
LITERAL_IF, LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE"/>
|
68
|
+
</module>
|
69
|
+
<module name="RightCurly">
|
70
|
+
<property name="option" value="alone"/>
|
71
|
+
</module>
|
72
|
+
<module name="GenericWhitespace"/>
|
73
|
+
<module name="WhitespaceAfter"/>
|
74
|
+
<module name="NoWhitespaceBefore"/>
|
75
|
+
|
76
|
+
<module name="UpperEll"/>
|
77
|
+
<module name="DefaultComesLast"/>
|
78
|
+
<module name="ArrayTypeStyle"/>
|
79
|
+
<module name="MultipleVariableDeclarations"/>
|
80
|
+
<module name="ModifierOrder"/>
|
81
|
+
<module name="OneStatementPerLine"/>
|
82
|
+
<module name="StringLiteralEquality"/>
|
83
|
+
<module name="MutableException"/>
|
84
|
+
<module name="EqualsHashCode"/>
|
85
|
+
<module name="InnerAssignment"/>
|
86
|
+
<module name="InterfaceIsType"/>
|
87
|
+
<module name="HideUtilityClassConstructor"/>
|
88
|
+
|
89
|
+
<module name="MemberName"/>
|
90
|
+
<module name="LocalVariableName"/>
|
91
|
+
<module name="LocalFinalVariableName"/>
|
92
|
+
<module name="TypeName"/>
|
93
|
+
<module name="PackageName"/>
|
94
|
+
<module name="ParameterName"/>
|
95
|
+
<module name="StaticVariableName"/>
|
96
|
+
<module name="ClassTypeParameterName">
|
97
|
+
<property name="format" value="^[A-Z][0-9]?$"/>
|
98
|
+
</module>
|
99
|
+
<module name="MethodTypeParameterName">
|
100
|
+
<property name="format" value="^[A-Z][0-9]?$"/>
|
101
|
+
</module>
|
102
|
+
|
103
|
+
<module name="AvoidStarImport"/>
|
104
|
+
<module name="RedundantImport"/>
|
105
|
+
<module name="UnusedImports"/>
|
106
|
+
<module name="ImportOrder">
|
107
|
+
<property name="groups" value="*,javax,java"/>
|
108
|
+
<property name="separated" value="true"/>
|
109
|
+
<property name="option" value="bottom"/>
|
110
|
+
<property name="sortStaticImportsAlphabetically" value="true"/>
|
111
|
+
</module>
|
112
|
+
|
113
|
+
<module name="WhitespaceAround">
|
114
|
+
<property name="allowEmptyConstructors" value="true"/>
|
115
|
+
<property name="allowEmptyMethods" value="true"/>
|
116
|
+
<property name="ignoreEnhancedForColon" value="false"/>
|
117
|
+
<property name="tokens" value="
|
118
|
+
ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN,
|
119
|
+
BXOR, BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, EQUAL, GE, GT, LAND, LE,
|
120
|
+
LITERAL_ASSERT, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE,
|
121
|
+
LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_RETURN,
|
122
|
+
LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE,
|
123
|
+
LOR, LT, MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN, NOT_EQUAL,
|
124
|
+
PLUS, PLUS_ASSIGN, QUESTION, SL, SLIST, SL_ASSIGN, SR, SR_ASSIGN,
|
125
|
+
STAR, STAR_ASSIGN, TYPE_EXTENSION_AND"/>
|
126
|
+
</module>
|
127
|
+
</module>
|
128
|
+
</module>
|
@@ -0,0 +1,108 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE module PUBLIC
|
3
|
+
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
|
4
|
+
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
|
5
|
+
<!--
|
6
|
+
This is a subset of ./checkstyle.xml which allows some loose styles
|
7
|
+
-->
|
8
|
+
<module name="Checker">
|
9
|
+
<module name="FileTabCharacter"/>
|
10
|
+
<module name="NewlineAtEndOfFile">
|
11
|
+
<property name="lineSeparator" value="lf"/>
|
12
|
+
</module>
|
13
|
+
<module name="RegexpMultiline">
|
14
|
+
<property name="format" value="\r"/>
|
15
|
+
<property name="message" value="Line contains carriage return"/>
|
16
|
+
</module>
|
17
|
+
<module name="RegexpMultiline">
|
18
|
+
<property name="format" value=" \n"/>
|
19
|
+
<property name="message" value="Line has trailing whitespace"/>
|
20
|
+
</module>
|
21
|
+
<module name="RegexpMultiline">
|
22
|
+
<property name="format" value="\n\n\n"/>
|
23
|
+
<property name="message" value="Multiple consecutive blank lines"/>
|
24
|
+
</module>
|
25
|
+
<module name="RegexpMultiline">
|
26
|
+
<property name="format" value="\n\n\Z"/>
|
27
|
+
<property name="message" value="Blank line before end of file"/>
|
28
|
+
</module>
|
29
|
+
|
30
|
+
<module name="TreeWalker">
|
31
|
+
<module name="EmptyBlock">
|
32
|
+
<property name="option" value="text"/>
|
33
|
+
<property name="tokens" value="
|
34
|
+
LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_IF,
|
35
|
+
LITERAL_FOR, LITERAL_TRY, LITERAL_WHILE, INSTANCE_INIT, STATIC_INIT"/>
|
36
|
+
</module>
|
37
|
+
<module name="EmptyStatement"/>
|
38
|
+
<module name="EmptyForInitializerPad"/>
|
39
|
+
<module name="EmptyForIteratorPad">
|
40
|
+
<property name="option" value="space"/>
|
41
|
+
</module>
|
42
|
+
<module name="MethodParamPad">
|
43
|
+
<property name="allowLineBreaks" value="true"/>
|
44
|
+
<property name="option" value="nospace"/>
|
45
|
+
</module>
|
46
|
+
<module name="ParenPad"/>
|
47
|
+
<module name="TypecastParenPad"/>
|
48
|
+
<module name="NeedBraces"/>
|
49
|
+
<module name="LeftCurly">
|
50
|
+
<property name="option" value="nl"/>
|
51
|
+
<property name="tokens" value="CLASS_DEF, CTOR_DEF, INTERFACE_DEF, METHOD_DEF"/>
|
52
|
+
</module>
|
53
|
+
<module name="LeftCurly">
|
54
|
+
<property name="option" value="eol"/>
|
55
|
+
<property name="tokens" value="
|
56
|
+
LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR,
|
57
|
+
LITERAL_IF, LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE"/>
|
58
|
+
</module>
|
59
|
+
<module name="RightCurly">
|
60
|
+
<property name="option" value="alone"/>
|
61
|
+
</module>
|
62
|
+
<module name="GenericWhitespace"/>
|
63
|
+
<module name="WhitespaceAfter"/>
|
64
|
+
<module name="NoWhitespaceBefore"/>
|
65
|
+
|
66
|
+
<module name="UpperEll"/>
|
67
|
+
<module name="DefaultComesLast"/>
|
68
|
+
<module name="ArrayTypeStyle"/>
|
69
|
+
<module name="MultipleVariableDeclarations"/>
|
70
|
+
<module name="ModifierOrder"/>
|
71
|
+
<module name="OneStatementPerLine"/>
|
72
|
+
<module name="StringLiteralEquality"/>
|
73
|
+
<module name="MutableException"/>
|
74
|
+
<module name="EqualsHashCode"/>
|
75
|
+
<module name="InnerAssignment"/>
|
76
|
+
<module name="InterfaceIsType"/>
|
77
|
+
<module name="HideUtilityClassConstructor"/>
|
78
|
+
|
79
|
+
<module name="MemberName"/>
|
80
|
+
<module name="LocalVariableName"/>
|
81
|
+
<module name="LocalFinalVariableName"/>
|
82
|
+
<module name="TypeName"/>
|
83
|
+
<module name="PackageName"/>
|
84
|
+
<module name="ParameterName"/>
|
85
|
+
<module name="StaticVariableName"/>
|
86
|
+
<module name="ClassTypeParameterName">
|
87
|
+
<property name="format" value="^[A-Z][0-9]?$"/>
|
88
|
+
</module>
|
89
|
+
<module name="MethodTypeParameterName">
|
90
|
+
<property name="format" value="^[A-Z][0-9]?$"/>
|
91
|
+
</module>
|
92
|
+
|
93
|
+
<module name="WhitespaceAround">
|
94
|
+
<property name="allowEmptyConstructors" value="true"/>
|
95
|
+
<property name="allowEmptyMethods" value="true"/>
|
96
|
+
<property name="ignoreEnhancedForColon" value="false"/>
|
97
|
+
<property name="tokens" value="
|
98
|
+
ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN,
|
99
|
+
BXOR, BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, EQUAL, GE, GT, LAND, LE,
|
100
|
+
LITERAL_ASSERT, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE,
|
101
|
+
LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_RETURN,
|
102
|
+
LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE,
|
103
|
+
LOR, LT, MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN, NOT_EQUAL,
|
104
|
+
PLUS, PLUS_ASSIGN, QUESTION, SL, SLIST, SL_ASSIGN, SR, SR_ASSIGN,
|
105
|
+
STAR, STAR_ASSIGN, TYPE_EXTENSION_AND"/>
|
106
|
+
</module>
|
107
|
+
</module>
|
108
|
+
</module>
|
Binary file
|
@@ -1,6 +1,6 @@
|
|
1
|
-
#
|
1
|
+
#Wed Jan 13 12:41:02 JST 2016
|
2
2
|
distributionBase=GRADLE_USER_HOME
|
3
3
|
distributionPath=wrapper/dists
|
4
4
|
zipStoreBase=GRADLE_USER_HOME
|
5
5
|
zipStorePath=wrapper/dists
|
6
|
-
distributionUrl=https\://services.gradle.org/distributions/gradle-2.
|
6
|
+
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-bin.zip
|
@@ -46,6 +46,10 @@ public class ExpandJsonFilterPlugin
|
|
46
46
|
FilterPlugin.Control control)
|
47
47
|
{
|
48
48
|
PluginTask task = config.loadConfig(PluginTask.class);
|
49
|
+
|
50
|
+
// check if the specified json column exists or not
|
51
|
+
inputSchema.lookupColumn(task.getJsonColumnName());
|
52
|
+
|
49
53
|
Schema outputSchema = buildOutputSchema(task, inputSchema);
|
50
54
|
control.run(task.dump(), outputSchema);
|
51
55
|
}
|
@@ -65,14 +69,16 @@ public class ExpandJsonFilterPlugin
|
|
65
69
|
int i = 0; // columns index
|
66
70
|
for (Column inputColumn: inputSchema.getColumns()) {
|
67
71
|
if (inputColumn.getName().contentEquals(task.getJsonColumnName())) {
|
68
|
-
logger.info("removed column: name: {}, type: {}",
|
72
|
+
logger.info("removed column: name: {}, type: {}, index: {}",
|
69
73
|
inputColumn.getName(),
|
70
|
-
inputColumn.getType()
|
74
|
+
inputColumn.getType(),
|
75
|
+
inputColumn.getIndex());
|
71
76
|
for (ColumnConfig expandedColumnConfig: task.getExpandedColumns()) {
|
72
|
-
logger.info("added column: name: {}, type: {}, options: {}",
|
77
|
+
logger.info("added column: name: {}, type: {}, options: {}, index: {}",
|
73
78
|
expandedColumnConfig.getName(),
|
74
79
|
expandedColumnConfig.getType(),
|
75
|
-
expandedColumnConfig.getOption()
|
80
|
+
expandedColumnConfig.getOption(),
|
81
|
+
i);
|
76
82
|
Column outputColumn = new Column(i++,
|
77
83
|
expandedColumnConfig.getName(),
|
78
84
|
expandedColumnConfig.getType());
|
@@ -80,6 +86,10 @@ public class ExpandJsonFilterPlugin
|
|
80
86
|
}
|
81
87
|
}
|
82
88
|
else {
|
89
|
+
logger.info("unchanged column: name: {}, type: {}, index: {}",
|
90
|
+
inputColumn.getName(),
|
91
|
+
inputColumn.getType(),
|
92
|
+
i);
|
83
93
|
Column outputColumn = new Column(i++,
|
84
94
|
inputColumn.getName(),
|
85
95
|
inputColumn.getType());
|
@@ -2,12 +2,13 @@ package org.embulk.filter.expand_json;
|
|
2
2
|
|
3
3
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
4
4
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
5
|
+
import com.google.common.base.Optional;
|
5
6
|
import com.google.common.base.Throwables;
|
6
7
|
import com.google.common.collect.ImmutableList;
|
7
|
-
import com.google.common.collect.Maps;
|
8
8
|
import com.jayway.jsonpath.Configuration;
|
9
9
|
import com.jayway.jsonpath.JsonPath;
|
10
10
|
import com.jayway.jsonpath.Option;
|
11
|
+
import com.jayway.jsonpath.ParseContext;
|
11
12
|
import com.jayway.jsonpath.ReadContext;
|
12
13
|
import org.embulk.spi.Column;
|
13
14
|
import org.embulk.spi.ColumnConfig;
|
@@ -22,7 +23,6 @@ import org.embulk.spi.type.Types;
|
|
22
23
|
import org.joda.time.DateTimeZone;
|
23
24
|
import org.slf4j.Logger;
|
24
25
|
|
25
|
-
import java.util.HashMap;
|
26
26
|
import java.util.List;
|
27
27
|
import java.util.Map;
|
28
28
|
|
@@ -34,49 +34,167 @@ import static org.embulk.filter.expand_json.ExpandJsonFilterPlugin.PluginTask;
|
|
34
34
|
public class FilteredPageOutput
|
35
35
|
implements PageOutput
|
36
36
|
{
|
37
|
+
private class ExpandedColumn
|
38
|
+
{
|
39
|
+
private final String key;
|
40
|
+
private final Column column;
|
41
|
+
private final String jsonPath;
|
42
|
+
private final Optional<TimestampParser> timestampParser;
|
43
|
+
|
44
|
+
ExpandedColumn(String key,
|
45
|
+
Column column,
|
46
|
+
String jsonPath,
|
47
|
+
Optional<TimestampParser> timestampParser)
|
48
|
+
{
|
49
|
+
this.key = key;
|
50
|
+
this.column = column;
|
51
|
+
this.jsonPath = jsonPath;
|
52
|
+
this.timestampParser = timestampParser;
|
53
|
+
}
|
54
|
+
|
55
|
+
public String getKey()
|
56
|
+
{
|
57
|
+
return key;
|
58
|
+
}
|
59
|
+
|
60
|
+
public Column getColumn()
|
61
|
+
{
|
62
|
+
return column;
|
63
|
+
}
|
64
|
+
|
65
|
+
public String getJsonPath()
|
66
|
+
{
|
67
|
+
return jsonPath;
|
68
|
+
}
|
69
|
+
|
70
|
+
public Optional<TimestampParser> getTimestampParser()
|
71
|
+
{
|
72
|
+
return timestampParser;
|
73
|
+
}
|
74
|
+
}
|
75
|
+
|
76
|
+
private class UnchangedColumn
|
77
|
+
{
|
78
|
+
private final String key;
|
79
|
+
private final Column inputColumn;
|
80
|
+
private final Column outputColumn;
|
81
|
+
|
82
|
+
UnchangedColumn(String key, Column inputColumn, Column outputColumn)
|
83
|
+
{
|
84
|
+
this.key = key;
|
85
|
+
this.inputColumn = inputColumn;
|
86
|
+
this.outputColumn = outputColumn;
|
87
|
+
}
|
88
|
+
|
89
|
+
public String getKey()
|
90
|
+
{
|
91
|
+
return key;
|
92
|
+
}
|
93
|
+
|
94
|
+
public Column getInputColumn()
|
95
|
+
{
|
96
|
+
return inputColumn;
|
97
|
+
}
|
98
|
+
|
99
|
+
public Column getOutputColumn()
|
100
|
+
{
|
101
|
+
return outputColumn;
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
|
37
106
|
private final Logger logger = Exec.getLogger(FilteredPageOutput.class);
|
38
|
-
private final
|
39
|
-
private final List<
|
40
|
-
private final List<Column> expandedJsonColumns;
|
41
|
-
private final HashMap<String, TimestampParser> timestampParserHashMap;
|
107
|
+
private final List<UnchangedColumn> unchangedColumns;
|
108
|
+
private final List<ExpandedColumn> expandedColumns;
|
42
109
|
private final Column jsonColumn;
|
43
110
|
private final PageReader pageReader;
|
44
|
-
private final Schema inputSchema;
|
45
|
-
private final Schema outputSchema;
|
46
111
|
private final PageBuilder pageBuilder;
|
47
|
-
private final
|
112
|
+
private final ObjectMapper objectMapper = new ObjectMapper();
|
113
|
+
private final ParseContext parseContext;
|
48
114
|
|
49
|
-
|
115
|
+
private List<ExpandedColumn> initializeExpandedColumns(PluginTask task,
|
116
|
+
Schema outputSchema)
|
50
117
|
{
|
51
|
-
|
118
|
+
ImmutableList.Builder<ExpandedColumn> expandedJsonColumnsBuilder = ImmutableList.builder();
|
119
|
+
for (Column outputColumn : outputSchema.getColumns()) {
|
120
|
+
for (ColumnConfig expandedColumnConfig : task.getExpandedColumns()) {
|
121
|
+
if (outputColumn.getName().equals(expandedColumnConfig.getName())) {
|
52
122
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
123
|
+
TimestampParser timestampParser = null;
|
124
|
+
if (Types.TIMESTAMP.equals(expandedColumnConfig.getType())) {
|
125
|
+
String format;
|
126
|
+
if (expandedColumnConfig.getOption().has("format")) {
|
127
|
+
format = expandedColumnConfig.getOption().get(String.class, "format");
|
128
|
+
}
|
129
|
+
else {
|
130
|
+
format = task.getDefaultTimestampFormat();
|
131
|
+
}
|
132
|
+
DateTimeZone timezone = DateTimeZone.forID(task.getTimeZone());
|
133
|
+
timestampParser = new TimestampParser(task.getJRuby(), format, timezone);
|
134
|
+
}
|
135
|
+
|
136
|
+
ExpandedColumn expandedColumn = new ExpandedColumn(outputColumn.getName(),
|
137
|
+
outputColumn,
|
138
|
+
task.getRoot() + outputColumn.getName(),
|
139
|
+
Optional.fromNullable(timestampParser));
|
140
|
+
expandedJsonColumnsBuilder.add(expandedColumn);
|
141
|
+
}
|
58
142
|
}
|
59
|
-
|
60
|
-
|
143
|
+
}
|
144
|
+
return expandedJsonColumnsBuilder.build();
|
145
|
+
}
|
146
|
+
|
147
|
+
private List<UnchangedColumn> initializeUnchangedColumns(Schema inputSchema,
|
148
|
+
Schema outputSchema,
|
149
|
+
Column excludeColumn)
|
150
|
+
{
|
151
|
+
ImmutableList.Builder<UnchangedColumn> unchangedColumnsBuilder = ImmutableList.builder();
|
152
|
+
for (Column outputColumn : outputSchema.getColumns()) {
|
153
|
+
for (Column inputColumn : inputSchema.getColumns()) {
|
154
|
+
if (inputColumn.getName().equals(outputColumn.getName()) &&
|
155
|
+
!excludeColumn.getName().equals(outputColumn.getName())) {
|
156
|
+
|
157
|
+
UnchangedColumn unchangedColumn = new UnchangedColumn(outputColumn.getName(),
|
158
|
+
inputColumn,
|
159
|
+
outputColumn);
|
160
|
+
unchangedColumnsBuilder.add(unchangedColumn);
|
161
|
+
}
|
61
162
|
}
|
62
163
|
}
|
63
|
-
|
64
|
-
|
164
|
+
return unchangedColumnsBuilder.build();
|
165
|
+
}
|
65
166
|
|
66
|
-
|
167
|
+
private Column initializeJsonColumn(PluginTask task, Schema inputSchema)
|
168
|
+
{
|
169
|
+
Column jsonColumn = null;
|
67
170
|
for (Column column: inputSchema.getColumns()) {
|
68
171
|
if (column.getName().contentEquals(task.getJsonColumnName())) {
|
69
|
-
|
172
|
+
jsonColumn = column;
|
70
173
|
}
|
71
174
|
}
|
72
|
-
|
175
|
+
return jsonColumn;
|
176
|
+
}
|
177
|
+
|
178
|
+
private ParseContext initializeParseContext()
|
179
|
+
{
|
180
|
+
Configuration conf = Configuration.defaultConfiguration();
|
181
|
+
conf = conf.addOptions(Option.DEFAULT_PATH_LEAF_TO_NULL);
|
182
|
+
conf = conf.addOptions(Option.SUPPRESS_EXCEPTIONS);
|
183
|
+
return JsonPath.using(conf);
|
184
|
+
}
|
185
|
+
|
186
|
+
FilteredPageOutput(PluginTask task, Schema inputSchema, Schema outputSchema, PageOutput pageOutput)
|
187
|
+
{
|
188
|
+
this.jsonColumn = initializeJsonColumn(task, inputSchema);
|
189
|
+
this.unchangedColumns = initializeUnchangedColumns(inputSchema,
|
190
|
+
outputSchema,
|
191
|
+
jsonColumn);
|
192
|
+
this.expandedColumns = initializeExpandedColumns(task,
|
193
|
+
outputSchema);
|
73
194
|
|
74
|
-
this.timestampParserHashMap = buildTimestampParserHashMap(task);
|
75
195
|
this.pageReader = new PageReader(inputSchema);
|
76
|
-
this.inputSchema = inputSchema;
|
77
|
-
this.outputSchema = outputSchema;
|
78
|
-
this.pageOutput = pageOutput;
|
79
196
|
this.pageBuilder = new PageBuilder(Exec.getBufferAllocator(), outputSchema, pageOutput);
|
197
|
+
this.parseContext = initializeParseContext();
|
80
198
|
}
|
81
199
|
|
82
200
|
@Override
|
@@ -86,8 +204,8 @@ public class FilteredPageOutput
|
|
86
204
|
pageReader.setPage(page);
|
87
205
|
|
88
206
|
while (pageReader.nextRecord()) {
|
89
|
-
|
90
|
-
|
207
|
+
setExpandedJsonColumns();
|
208
|
+
setUnchangedColumns();
|
91
209
|
pageBuilder.addRecord();
|
92
210
|
}
|
93
211
|
}
|
@@ -101,7 +219,6 @@ public class FilteredPageOutput
|
|
101
219
|
public void finish()
|
102
220
|
{
|
103
221
|
pageBuilder.finish();
|
104
|
-
pageOutput.finish();
|
105
222
|
}
|
106
223
|
|
107
224
|
@Override
|
@@ -109,116 +226,97 @@ public class FilteredPageOutput
|
|
109
226
|
{
|
110
227
|
pageReader.close();
|
111
228
|
pageBuilder.close();
|
112
|
-
pageOutput.close();
|
113
229
|
}
|
114
230
|
|
115
|
-
private HashMap<String, TimestampParser> buildTimestampParserHashMap(PluginTask task)
|
116
|
-
{
|
117
|
-
final HashMap<String, TimestampParser> timestampParserHashMap = Maps.newHashMap();
|
118
|
-
for (ColumnConfig expandedColumnConfig: task.getExpandedColumns()) {
|
119
|
-
if (Types.TIMESTAMP.equals(expandedColumnConfig.getType())) {
|
120
|
-
String format;
|
121
|
-
if (expandedColumnConfig.getOption().has("format")) {
|
122
|
-
format = expandedColumnConfig.getOption().get(String.class, "format");
|
123
|
-
}
|
124
|
-
else {
|
125
|
-
format = task.getDefaultTimestampFormat();
|
126
|
-
}
|
127
|
-
DateTimeZone timezone = DateTimeZone.forID(task.getTimeZone());
|
128
|
-
TimestampParser parser = new TimestampParser(task.getJRuby(), format, timezone);
|
129
|
-
|
130
|
-
String columnName = expandedColumnConfig.getName();
|
131
|
-
|
132
|
-
timestampParserHashMap.put(columnName, parser);
|
133
|
-
}
|
134
|
-
}
|
135
|
-
|
136
|
-
return timestampParserHashMap;
|
137
|
-
}
|
138
231
|
|
139
|
-
private void
|
140
|
-
for (
|
232
|
+
private void setUnchangedColumns() {
|
233
|
+
for (UnchangedColumn unchangedColumn : unchangedColumns) {
|
234
|
+
Column inputColumn = unchangedColumn.getInputColumn();
|
235
|
+
Column outputColumn = unchangedColumn.getOutputColumn();
|
236
|
+
|
141
237
|
if (pageReader.isNull(inputColumn)) {
|
142
|
-
pageBuilder.setNull(
|
238
|
+
pageBuilder.setNull(outputColumn);
|
143
239
|
continue;
|
144
240
|
}
|
145
241
|
|
146
|
-
if (Types.STRING.equals(
|
147
|
-
pageBuilder.setString(
|
242
|
+
if (Types.STRING.equals(outputColumn.getType())) {
|
243
|
+
pageBuilder.setString(outputColumn, pageReader.getString(inputColumn));
|
148
244
|
}
|
149
|
-
else if (Types.BOOLEAN.equals(
|
150
|
-
pageBuilder.setBoolean(
|
245
|
+
else if (Types.BOOLEAN.equals(outputColumn.getType())) {
|
246
|
+
pageBuilder.setBoolean(outputColumn, pageReader.getBoolean(inputColumn));
|
151
247
|
}
|
152
|
-
else if (Types.DOUBLE.equals(
|
153
|
-
pageBuilder.setDouble(
|
248
|
+
else if (Types.DOUBLE.equals(outputColumn.getType())) {
|
249
|
+
pageBuilder.setDouble(outputColumn, pageReader.getDouble(inputColumn));
|
154
250
|
}
|
155
|
-
else if (Types.LONG.equals(
|
156
|
-
pageBuilder.setLong(
|
251
|
+
else if (Types.LONG.equals(outputColumn.getType())) {
|
252
|
+
pageBuilder.setLong(outputColumn, pageReader.getLong(inputColumn));
|
157
253
|
}
|
158
|
-
else if (Types.TIMESTAMP.equals(
|
159
|
-
pageBuilder.setTimestamp(
|
254
|
+
else if (Types.TIMESTAMP.equals(outputColumn.getType())) {
|
255
|
+
pageBuilder.setTimestamp(outputColumn, pageReader.getTimestamp(inputColumn));
|
160
256
|
}
|
161
257
|
}
|
162
258
|
}
|
163
259
|
|
164
|
-
private void setExpandedJsonColumns(
|
260
|
+
private void setExpandedJsonColumns()
|
165
261
|
throws JsonProcessingException
|
166
262
|
{
|
167
263
|
final ReadContext json;
|
168
|
-
if (pageReader.isNull(
|
264
|
+
if (pageReader.isNull(jsonColumn)) {
|
169
265
|
json = null;
|
170
266
|
}
|
171
267
|
else {
|
172
|
-
String jsonObject = pageReader.getString(
|
173
|
-
|
174
|
-
conf = conf.addOptions(Option.DEFAULT_PATH_LEAF_TO_NULL);
|
175
|
-
conf = conf.addOptions(Option.SUPPRESS_EXCEPTIONS);
|
176
|
-
json = JsonPath.using(conf).parse(jsonObject);
|
268
|
+
String jsonObject = pageReader.getString(jsonColumn);
|
269
|
+
json = parseContext.parse(jsonObject);
|
177
270
|
}
|
178
271
|
|
179
|
-
for (
|
272
|
+
for (ExpandedColumn expandedJsonColumn: expandedColumns) {
|
180
273
|
if (json == null) {
|
181
|
-
pageBuilder.setNull(expandedJsonColumn);
|
274
|
+
pageBuilder.setNull(expandedJsonColumn.getColumn());
|
182
275
|
continue;
|
183
276
|
}
|
184
277
|
|
185
|
-
Object value = json.read(
|
186
|
-
final String finalValue =
|
278
|
+
Object value = json.read(expandedJsonColumn.getJsonPath());
|
279
|
+
final String finalValue = convertJsonNodeAsString(value);
|
187
280
|
if (finalValue == null) {
|
188
|
-
pageBuilder.setNull(expandedJsonColumn);
|
281
|
+
pageBuilder.setNull(expandedJsonColumn.getColumn());
|
189
282
|
continue;
|
190
283
|
}
|
191
284
|
|
192
|
-
if (Types.STRING.equals(expandedJsonColumn.getType())) {
|
193
|
-
pageBuilder.setString(expandedJsonColumn, finalValue);
|
285
|
+
if (Types.STRING.equals(expandedJsonColumn.getColumn().getType())) {
|
286
|
+
pageBuilder.setString(expandedJsonColumn.getColumn(), finalValue);
|
194
287
|
}
|
195
|
-
else if (Types.BOOLEAN.equals(expandedJsonColumn.getType())) {
|
196
|
-
pageBuilder.setBoolean(expandedJsonColumn, Boolean.parseBoolean(finalValue));
|
288
|
+
else if (Types.BOOLEAN.equals(expandedJsonColumn.getColumn().getType())) {
|
289
|
+
pageBuilder.setBoolean(expandedJsonColumn.getColumn(), Boolean.parseBoolean(finalValue));
|
197
290
|
}
|
198
|
-
else if (Types.DOUBLE.equals(expandedJsonColumn.getType())) {
|
199
|
-
pageBuilder.setDouble(expandedJsonColumn, Double.parseDouble(finalValue));
|
291
|
+
else if (Types.DOUBLE.equals(expandedJsonColumn.getColumn().getType())) {
|
292
|
+
pageBuilder.setDouble(expandedJsonColumn.getColumn(), Double.parseDouble(finalValue));
|
200
293
|
}
|
201
|
-
else if (Types.LONG.equals(expandedJsonColumn.getType())) {
|
202
|
-
pageBuilder.setLong(expandedJsonColumn, Long.parseLong(finalValue));
|
294
|
+
else if (Types.LONG.equals(expandedJsonColumn.getColumn().getType())) {
|
295
|
+
pageBuilder.setLong(expandedJsonColumn.getColumn(), Long.parseLong(finalValue));
|
203
296
|
}
|
204
|
-
else if (Types.TIMESTAMP.equals(expandedJsonColumn.getType())) {
|
205
|
-
|
206
|
-
|
297
|
+
else if (Types.TIMESTAMP.equals(expandedJsonColumn.getColumn().getType())) {
|
298
|
+
if (expandedJsonColumn.getTimestampParser().isPresent()) {
|
299
|
+
TimestampParser parser = expandedJsonColumn.getTimestampParser().get();
|
300
|
+
pageBuilder.setTimestamp(expandedJsonColumn.getColumn(), parser.parse(finalValue));
|
301
|
+
}
|
302
|
+
else {
|
303
|
+
throw new RuntimeException("TimestampParser is absent for column:" + expandedJsonColumn.getKey());
|
304
|
+
}
|
207
305
|
}
|
208
306
|
}
|
209
307
|
}
|
210
308
|
|
211
|
-
private String
|
309
|
+
private String convertJsonNodeAsString(Object value)
|
212
310
|
throws JsonProcessingException
|
213
311
|
{
|
214
312
|
if (value == null) {
|
215
313
|
return null;
|
216
314
|
}
|
217
315
|
else if (value instanceof List) {
|
218
|
-
return
|
316
|
+
return objectMapper.writeValueAsString(value);
|
219
317
|
}
|
220
318
|
else if (value instanceof Map) {
|
221
|
-
return
|
319
|
+
return objectMapper.writeValueAsString(value);
|
222
320
|
}
|
223
321
|
else if (value instanceof String) {
|
224
322
|
return (String) value;
|
@@ -227,5 +325,4 @@ public class FilteredPageOutput
|
|
227
325
|
return String.valueOf(value);
|
228
326
|
}
|
229
327
|
}
|
230
|
-
|
231
328
|
}
|
@@ -18,6 +18,7 @@ import org.embulk.spi.PageOutput;
|
|
18
18
|
import org.embulk.spi.PageReader;
|
19
19
|
import org.embulk.spi.PageTestUtils;
|
20
20
|
import org.embulk.spi.Schema;
|
21
|
+
import org.embulk.spi.SchemaConfigException;
|
21
22
|
import org.embulk.spi.TestPageBuilderReader.MockPageOutput;
|
22
23
|
import org.junit.Before;
|
23
24
|
import org.junit.Rule;
|
@@ -40,7 +41,9 @@ public class TestExpandJsonFilterPlugin
|
|
40
41
|
|
41
42
|
private final Schema schema = Schema.builder()
|
42
43
|
.add("_c0", STRING)
|
44
|
+
.add("_c1", STRING)
|
43
45
|
.build();
|
46
|
+
private final String c1Data = "_c1_data";
|
44
47
|
private ExpandJsonFilterPlugin expandJsonFilterPlugin;
|
45
48
|
|
46
49
|
@Before
|
@@ -89,6 +92,26 @@ public class TestExpandJsonFilterPlugin
|
|
89
92
|
config.loadConfig(PluginTask.class);
|
90
93
|
}
|
91
94
|
|
95
|
+
@Test
|
96
|
+
public void testThrowExceptionInvalidJsonColumnName()
|
97
|
+
{
|
98
|
+
String configYaml = "" +
|
99
|
+
"type: expand_json\n" +
|
100
|
+
"json_column_name: not_exist\n" +
|
101
|
+
"expanded_columns:\n" +
|
102
|
+
" - {name: _c1, type: string}";
|
103
|
+
ConfigSource config = getConfigFromYaml(configYaml);
|
104
|
+
|
105
|
+
exception.expect(SchemaConfigException.class);
|
106
|
+
expandJsonFilterPlugin.transaction(config, schema, new Control() {
|
107
|
+
@Override
|
108
|
+
public void run(TaskSource taskSource, Schema schema)
|
109
|
+
{
|
110
|
+
// do nothing
|
111
|
+
}
|
112
|
+
});
|
113
|
+
}
|
114
|
+
|
92
115
|
@Test
|
93
116
|
public void testThrowExceptionAbsentExpandedColumns()
|
94
117
|
{
|
@@ -139,7 +162,8 @@ public class TestExpandJsonFilterPlugin
|
|
139
162
|
" - {name: _j2, type: long}\n" +
|
140
163
|
" - {name: _j3, type: timestamp}\n" +
|
141
164
|
" - {name: _j4, type: double}\n" +
|
142
|
-
" - {name: _j5, type: string}\n"
|
165
|
+
" - {name: _j5, type: string}\n" +
|
166
|
+
" - {name: _c0, type: string}\n";
|
143
167
|
|
144
168
|
ConfigSource config = getConfigFromYaml(configYaml);
|
145
169
|
|
@@ -148,13 +172,15 @@ public class TestExpandJsonFilterPlugin
|
|
148
172
|
@Override
|
149
173
|
public void run(TaskSource taskSource, Schema outputSchema)
|
150
174
|
{
|
151
|
-
assertEquals(
|
175
|
+
assertEquals(7, outputSchema.getColumnCount());
|
152
176
|
|
153
177
|
Column new_j1 = outputSchema.getColumn(0);
|
154
178
|
Column new_j2 = outputSchema.getColumn(1);
|
155
179
|
Column new_j3 = outputSchema.getColumn(2);
|
156
180
|
Column new_j4 = outputSchema.getColumn(3);
|
157
181
|
Column new_j5 = outputSchema.getColumn(4);
|
182
|
+
Column new_c0 = outputSchema.getColumn(5);
|
183
|
+
Column old_c1 = outputSchema.getColumn(6);
|
158
184
|
|
159
185
|
assertEquals("_j1", new_j1.getName());
|
160
186
|
assertEquals(BOOLEAN, new_j1.getType());
|
@@ -166,6 +192,11 @@ public class TestExpandJsonFilterPlugin
|
|
166
192
|
assertEquals(DOUBLE, new_j4.getType());
|
167
193
|
assertEquals("_j5", new_j5.getName());
|
168
194
|
assertEquals(STRING, new_j5.getType());
|
195
|
+
assertEquals("_c0", new_c0.getName());
|
196
|
+
assertEquals(STRING, new_c0.getType());
|
197
|
+
assertEquals("_c1", old_c1.getName());
|
198
|
+
assertEquals(STRING, old_c1.getType());
|
199
|
+
|
169
200
|
}
|
170
201
|
});
|
171
202
|
}
|
@@ -191,7 +222,8 @@ public class TestExpandJsonFilterPlugin
|
|
191
222
|
" - {name: '_j7..book[?(@.price <= $[''_j7''][''expensive''])].author', type: string}\n" +
|
192
223
|
" - {name: '_j7..book[?(@.isbn)]', type: string}\n" +
|
193
224
|
" - {name: '_j7..book[?(@.author =~ /.*REES/i)].title', type: string}\n" +
|
194
|
-
" - {name: '_j7.store.book[2].author', type: string}\n"
|
225
|
+
" - {name: '_j7.store.book[2].author', type: string}\n" +
|
226
|
+
" - {name: _c0, type: string}\n";
|
195
227
|
|
196
228
|
ConfigSource config = getConfigFromYaml(configYaml);
|
197
229
|
|
@@ -292,12 +324,13 @@ public class TestExpandJsonFilterPlugin
|
|
292
324
|
}
|
293
325
|
*/
|
294
326
|
);
|
327
|
+
builder.put("_c0", "v12");
|
295
328
|
|
296
329
|
String data = convertToJsonString(builder.build());
|
297
330
|
|
298
331
|
for (Page page : PageTestUtils.buildPage(runtime.getBufferAllocator(),
|
299
332
|
schema,
|
300
|
-
data)) {
|
333
|
+
data, c1Data)) {
|
301
334
|
pageOutput.add(page);
|
302
335
|
}
|
303
336
|
|
@@ -323,7 +356,8 @@ public class TestExpandJsonFilterPlugin
|
|
323
356
|
pageReader.getString(outputSchema.getColumn(7)));
|
324
357
|
assertEquals("[\"Nigel Rees\",\"Herman Melville\"]",
|
325
358
|
pageReader.getString(outputSchema.getColumn(8)));
|
326
|
-
assertEquals("
|
359
|
+
assertEquals("" +
|
360
|
+
"[" +
|
327
361
|
"{" +
|
328
362
|
"\"author\":\"Herman Melville\"," +
|
329
363
|
"\"title\":\"Moby Dick\"," +
|
@@ -342,6 +376,10 @@ public class TestExpandJsonFilterPlugin
|
|
342
376
|
pageReader.getString(outputSchema.getColumn(10)));
|
343
377
|
assertEquals("Herman Melville",
|
344
378
|
pageReader.getString(outputSchema.getColumn(11)));
|
379
|
+
assertEquals("v12",
|
380
|
+
pageReader.getString(outputSchema.getColumn(12)));
|
381
|
+
assertEquals(c1Data,
|
382
|
+
pageReader.getString(outputSchema.getColumn(13)));
|
345
383
|
}
|
346
384
|
}
|
347
385
|
});
|
@@ -373,7 +411,7 @@ public class TestExpandJsonFilterPlugin
|
|
373
411
|
String data = getBrokenJsonString();
|
374
412
|
for (Page page : PageTestUtils.buildPage(runtime.getBufferAllocator(),
|
375
413
|
schema,
|
376
|
-
data)) {
|
414
|
+
data, c1Data)) {
|
377
415
|
exception.expect(InvalidJsonException.class);
|
378
416
|
exception.expectMessage("Unexpected End Of File position 12: null");
|
379
417
|
pageOutput.add(page);
|
@@ -391,5 +429,4 @@ public class TestExpandJsonFilterPlugin
|
|
391
429
|
}
|
392
430
|
});
|
393
431
|
}
|
394
|
-
|
395
432
|
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embulk-filter-expand_json
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Civitaspo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-03-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -47,9 +47,12 @@ extra_rdoc_files: []
|
|
47
47
|
files:
|
48
48
|
- .gitignore
|
49
49
|
- .travis.yml
|
50
|
+
- CHANGELOG.md
|
50
51
|
- LICENSE.txt
|
51
52
|
- README.md
|
52
53
|
- build.gradle
|
54
|
+
- config/checkstyle/checkstyle.xml
|
55
|
+
- config/checkstyle/default.xml
|
53
56
|
- example/config.yml
|
54
57
|
- example/data.tsv
|
55
58
|
- gradle/wrapper/gradle-wrapper.jar
|
@@ -60,11 +63,12 @@ files:
|
|
60
63
|
- src/main/java/org/embulk/filter/expand_json/ExpandJsonFilterPlugin.java
|
61
64
|
- src/main/java/org/embulk/filter/expand_json/FilteredPageOutput.java
|
62
65
|
- src/test/java/org/embulk/filter/expand_json/TestExpandJsonFilterPlugin.java
|
63
|
-
- classpath/
|
64
|
-
- classpath/asm-
|
65
|
-
- classpath/embulk-filter-expand_json-0.0.
|
66
|
-
- classpath/json-path-2.
|
67
|
-
- classpath/json-smart-2.
|
66
|
+
- classpath/accessors-smart-1.1.jar
|
67
|
+
- classpath/asm-5.0.3.jar
|
68
|
+
- classpath/embulk-filter-expand_json-0.0.5.jar
|
69
|
+
- classpath/json-path-2.2.0.jar
|
70
|
+
- classpath/json-smart-2.2.1.jar
|
71
|
+
- classpath/slf4j-api-1.7.16.jar
|
68
72
|
homepage: https://github.com/civitaspo/embulk-filter-expand_json
|
69
73
|
licenses:
|
70
74
|
- MIT
|