embulk-filter-column 0.6.0.pre4 → 0.6.0.pre5
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 123d41cdcecc136bceb265c9d77f40719717955e
|
4
|
+
data.tar.gz: 250eef3285efb754089b9b6de2fe181721d960a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e7a8e33c7c8bbe68701174b3533dd4d568324280ee74c35a1187aadcf4eff77ce0f74c790e5c4295d972cd59bea08063e8444d39336e86698e4f927b575371e
|
7
|
+
data.tar.gz: 5bd87c09fa8528e632171e67594a2326e2a00514e7083b57eb9d72a4c6f6ae23628ff14c01f877b9d6819c27d0f08f524690a4534dc2039a33f75379ae947347
|
data/build.gradle
CHANGED
@@ -7,6 +7,7 @@ import io.github.medjed.jsonpathcompiler.expressions.path.PathCompiler;
|
|
7
7
|
import io.github.medjed.jsonpathcompiler.expressions.path.PathToken;
|
8
8
|
import io.github.medjed.jsonpathcompiler.expressions.path.RootPathToken;
|
9
9
|
import io.github.medjed.jsonpathcompiler.expressions.path.PropertyPathToken;
|
10
|
+
import io.github.medjed.jsonpathcompiler.expressions.path.WildcardPathToken;
|
10
11
|
import org.embulk.config.ConfigException;
|
11
12
|
import org.embulk.spi.type.Type;
|
12
13
|
import org.msgpack.value.StringValue;
|
@@ -32,6 +33,8 @@ public class JsonColumn
|
|
32
33
|
private StringValue srcParentPathValue = null;
|
33
34
|
private Value srcTailNameValue = null;
|
34
35
|
|
36
|
+
public static int WILDCARD_INDEX = -1;
|
37
|
+
|
35
38
|
public JsonColumn(String path, Type type)
|
36
39
|
{
|
37
40
|
this(path, type, null, null);
|
@@ -97,6 +100,9 @@ public class JsonColumn
|
|
97
100
|
JsonPathUtil.assertSupportedArrayPathToken(arrayIndexOperation, path);
|
98
101
|
return arrayIndexOperation.indexes().get(0).longValue();
|
99
102
|
}
|
103
|
+
else if (tail instanceof WildcardPathToken) {
|
104
|
+
return new Long(WILDCARD_INDEX);
|
105
|
+
}
|
100
106
|
else {
|
101
107
|
return null;
|
102
108
|
}
|
@@ -5,6 +5,7 @@ import io.github.medjed.jsonpathcompiler.expressions.Path;
|
|
5
5
|
import io.github.medjed.jsonpathcompiler.expressions.path.ArrayPathToken;
|
6
6
|
import io.github.medjed.jsonpathcompiler.expressions.path.PathCompiler;
|
7
7
|
import io.github.medjed.jsonpathcompiler.expressions.path.PathToken;
|
8
|
+
import io.github.medjed.jsonpathcompiler.expressions.path.WildcardPathToken;
|
8
9
|
import org.embulk.config.ConfigException;
|
9
10
|
import org.embulk.filter.column.ColumnFilterPlugin.ColumnConfig;
|
10
11
|
import org.embulk.filter.column.ColumnFilterPlugin.PluginTask;
|
@@ -286,7 +287,7 @@ public class JsonVisitor
|
|
286
287
|
partialPath.append(parts.getPathFragment());
|
287
288
|
PathToken next = parts.next();
|
288
289
|
JsonColumn jsonColumn;
|
289
|
-
if (next instanceof ArrayPathToken) {
|
290
|
+
if (next instanceof ArrayPathToken || next instanceof WildcardPathToken) {
|
290
291
|
jsonColumn = new JsonColumn(partialPath.toString(), Types.JSON, ValueFactory.newArray(new Value[0], false));
|
291
292
|
}
|
292
293
|
else {
|
@@ -337,15 +338,26 @@ public class JsonVisitor
|
|
337
338
|
else if (this.jsonColumns.containsKey(rootPath)) {
|
338
339
|
for (JsonColumn jsonColumn : this.jsonColumns.get(rootPath).values()) {
|
339
340
|
int src = jsonColumn.getSrcTailIndex().intValue();
|
340
|
-
|
341
|
-
|
342
|
-
|
341
|
+
if (src == JsonColumn.WILDCARD_INDEX) {
|
342
|
+
for (int i = 0; i < size; i++) {
|
343
|
+
Value v = arrayValue.get(i);
|
344
|
+
if (v == null) {
|
345
|
+
v = jsonColumn.getDefaultValue();
|
346
|
+
}
|
347
|
+
String newPath = jsonColumn.getPath();
|
348
|
+
Value visited = visit(newPath, v);
|
349
|
+
newValue.add(j++, visited == null ? ValueFactory.newNil() : visited);
|
350
|
+
}
|
351
|
+
}
|
352
|
+
else {
|
353
|
+
Value v = (src < arrayValue.size() ? arrayValue.get(src) : null);
|
354
|
+
if (v == null) {
|
355
|
+
v = jsonColumn.getDefaultValue();
|
356
|
+
}
|
357
|
+
String newPath = jsonColumn.getPath();
|
358
|
+
Value visited = visit(newPath, v);
|
359
|
+
newValue.add(j++, visited == null ? ValueFactory.newNil() : visited);
|
343
360
|
}
|
344
|
-
String newPath = jsonColumn.getPath();
|
345
|
-
Value visited = visit(newPath, v);
|
346
|
-
// int i = jsonColumn.getTailIndex().intValue();
|
347
|
-
// index is shifted, so j++ is used.
|
348
|
-
newValue.add(j++, visited == null ? ValueFactory.newNil() : visited);
|
349
361
|
}
|
350
362
|
}
|
351
363
|
else {
|
@@ -358,7 +370,7 @@ public class JsonVisitor
|
|
358
370
|
if (this.jsonAddColumns.containsKey(rootPath)) {
|
359
371
|
for (JsonColumn jsonColumn : this.jsonAddColumns.get(rootPath).values()) {
|
360
372
|
int i = jsonColumn.getTailIndex().intValue();
|
361
|
-
if (i < size) {
|
373
|
+
if (i == JsonColumn.WILDCARD_INDEX || i < size) {
|
362
374
|
// index for add_columns must be larger than size
|
363
375
|
// just skip because we can not raise ConfigException beforehand for flexible JSON
|
364
376
|
continue;
|
@@ -384,23 +384,26 @@ public class TestJsonVisitor
|
|
384
384
|
"type: column",
|
385
385
|
"drop_columns:",
|
386
386
|
" - {name: \"$.json1.k1[0].k1\"}",
|
387
|
-
" - {name: \"$.json1.k2[*]\"}"
|
387
|
+
" - {name: \"$.json1.k2[*]\"}", // ending with [*] is allowed for drop_columns, but not for others
|
388
|
+
" - {name: \"$.json1.k3[*].k1\"}");
|
388
389
|
Schema inputSchema = Schema.builder()
|
389
390
|
.add("json1", JSON)
|
390
391
|
.add("json2", JSON)
|
391
392
|
.build();
|
392
393
|
JsonVisitor subject = jsonVisitor(task, inputSchema);
|
393
394
|
|
394
|
-
// {"k1":[{"k1":"v"}
|
395
|
+
// {"k1":[{"k1":"v"}],"k2":["v","v"],"k3":[{"k3":"v"}]}
|
395
396
|
Value k1 = ValueFactory.newString("k1");
|
396
397
|
Value k2 = ValueFactory.newString("k2");
|
398
|
+
Value k3 = ValueFactory.newString("k3");
|
397
399
|
Value v = ValueFactory.newString("v");
|
398
400
|
Value map = ValueFactory.newMap(
|
399
401
|
k1, ValueFactory.newArray(ValueFactory.newMap(k1, v)),
|
400
|
-
k2, ValueFactory.newArray(v, v)
|
402
|
+
k2, ValueFactory.newArray(v, v),
|
403
|
+
k3, ValueFactory.newArray(ValueFactory.newMap(k1, v)));
|
401
404
|
|
402
405
|
MapValue visited = subject.visit("$['json1']", map).asMapValue();
|
403
|
-
assertEquals("{\"k1\":[{}],\"k2\":[]}", visited.toString());
|
406
|
+
assertEquals("{\"k1\":[{}],\"k2\":[],\"k3\":[{}]}", visited.toString());
|
404
407
|
}
|
405
408
|
|
406
409
|
@Test
|
@@ -410,23 +413,27 @@ public class TestJsonVisitor
|
|
410
413
|
"type: column",
|
411
414
|
"add_columns:",
|
412
415
|
" - {name: \"$.json1.k1[1]\", src: \"$.json1.k1[0]\"}",
|
413
|
-
" - {name: \"$.json1.k3[
|
416
|
+
" - {name: \"$.json1.k3[*].k2\", type: string, default: v}",
|
417
|
+
" - {name: \"$.json1.k4[*].k1\", type: string, default: v}",
|
418
|
+
" - {name: \"$.json1.k5[0].k1\", type: string, default: v}");
|
414
419
|
Schema inputSchema = Schema.builder()
|
415
420
|
.add("json1", JSON)
|
416
421
|
.add("json2", JSON)
|
417
422
|
.build();
|
418
423
|
JsonVisitor subject = jsonVisitor(task, inputSchema);
|
419
424
|
|
420
|
-
// {"k1":[{"k1":"v"}],"k2":["v","v"]}
|
425
|
+
// {"k1":[{"k1":"v"}],"k2":["v","v"],"k3":[{"k1":"v"}]}
|
421
426
|
Value k1 = ValueFactory.newString("k1");
|
422
427
|
Value k2 = ValueFactory.newString("k2");
|
428
|
+
Value k3 = ValueFactory.newString("k3");
|
423
429
|
Value v = ValueFactory.newString("v");
|
424
430
|
Value map = ValueFactory.newMap(
|
425
431
|
k1, ValueFactory.newArray(ValueFactory.newMap(k1, v)),
|
426
|
-
k2, ValueFactory.newArray(v, v)
|
432
|
+
k2, ValueFactory.newArray(v, v),
|
433
|
+
k3, ValueFactory.newArray(ValueFactory.newMap(k1, v)));
|
427
434
|
|
428
435
|
MapValue visited = subject.visit("$['json1']", map).asMapValue();
|
429
|
-
assertEquals("{\"k1\":[{\"k1\":\"v\"},{\"k1\":\"v\"}],\"k2\":[\"v\",\"v\"],\"k3\":[{\"
|
436
|
+
assertEquals("{\"k1\":[{\"k1\":\"v\"},{\"k1\":\"v\"}],\"k2\":[\"v\",\"v\"],\"k3\":[{\"k1\":\"v\",\"k2\":\"v\"}],\"k4\":[],\"k5\":[{\"k1\":\"v\"}]}", visited.toString());
|
430
437
|
}
|
431
438
|
|
432
439
|
@Test
|
@@ -437,23 +444,27 @@ public class TestJsonVisitor
|
|
437
444
|
"columns:",
|
438
445
|
" - {name: \"$.json1.k1[1]\", src: \"$.json1.k1[0]\"}",
|
439
446
|
" - {name: \"$.json1.k2[0]\"}",
|
440
|
-
" - {name: \"$.json1.k3[
|
447
|
+
" - {name: \"$.json1.k3[*].k1\"}",
|
448
|
+
" - {name: \"$.json1.k4[*].k1\", type: string, default: v}",
|
449
|
+
" - {name: \"$.json1.k5[0].k1\", type: string, default: v}");
|
441
450
|
Schema inputSchema = Schema.builder()
|
442
451
|
.add("json1", JSON)
|
443
452
|
.add("json2", JSON)
|
444
453
|
.build();
|
445
454
|
JsonVisitor subject = jsonVisitor(task, inputSchema);
|
446
455
|
|
447
|
-
// {"k1":[{"k1":"v"},"v"],"k2":["v","v"]}
|
456
|
+
// {"k1":[{"k1":"v"},"v"],"k2":["v","v"],"k3":[{"k1":"v","k2":"v"}]}
|
448
457
|
Value k1 = ValueFactory.newString("k1");
|
449
458
|
Value k2 = ValueFactory.newString("k2");
|
459
|
+
Value k3 = ValueFactory.newString("k3");
|
450
460
|
Value v = ValueFactory.newString("v");
|
451
461
|
Value map = ValueFactory.newMap(
|
452
462
|
k1, ValueFactory.newArray(ValueFactory.newMap(k1, v), v),
|
453
|
-
k2, ValueFactory.newArray(v, v)
|
463
|
+
k2, ValueFactory.newArray(v, v),
|
464
|
+
k3, ValueFactory.newArray(ValueFactory.newMap(k1, v, k2, v)));
|
454
465
|
|
455
466
|
MapValue visited = subject.visit("$['json1']", map).asMapValue();
|
456
|
-
assertEquals("{\"k1\":[{\"k1\":\"v\"}],\"k2\":[\"v\"],\"k3\":[{\"
|
467
|
+
assertEquals("{\"k1\":[{\"k1\":\"v\"}],\"k2\":[\"v\"],\"k3\":[{\"k1\":\"v\"}],\"k4\":[],\"k5\":[{\"k1\":\"v\"}]}", visited.toString());
|
457
468
|
}
|
458
469
|
|
459
470
|
@Test
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embulk-filter-column
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.0.
|
4
|
+
version: 0.6.0.pre5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Naotoshi Seo
|
@@ -82,7 +82,7 @@ files:
|
|
82
82
|
- classpath/accessors-smart-1.1.jar
|
83
83
|
- classpath/asm-5.0.3.jar
|
84
84
|
- classpath/commons-lang3-3.4.jar
|
85
|
-
- classpath/embulk-filter-column-0.6.0.
|
85
|
+
- classpath/embulk-filter-column-0.6.0.pre5.jar
|
86
86
|
- classpath/json-smart-2.2.1.jar
|
87
87
|
- classpath/JsonPathCompiler-0.0.12.jar
|
88
88
|
- classpath/slf4j-api-1.7.21.jar
|