Skip to content

Commit 269d207

Browse files
committed
Add list_as() Fix bind. (#267)
1 parent 9ee2194 commit 269d207

File tree

3 files changed

+69
-0
lines changed

3 files changed

+69
-0
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,10 @@ do list(path: "<sourceField>", "var": "<variableName>")
678678
end
679679
```
680680

681+
#### `do list_as`
682+
683+
TODO
684+
681685
#### `do once`
682686

683687
Executes the statements only once (when the bind is first encountered), not repeatedly for each record.

metafix/src/main/java/org/metafacture/metafix/FixBind.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,34 @@ public void execute(final Metafix metafix, final Record record, final List<Strin
6060
}
6161
},
6262

63+
list_as {
64+
@Override
65+
public void execute(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options, final RecordTransformer recordTransformer) {
66+
final Map<String, Value.Array> lists = new HashMap<>();
67+
options.forEach((k, v) -> Value.asList(record.get(v), a -> lists.put(k, a)));
68+
69+
final int size = lists.values().stream().mapToInt(a -> a.size()).max().orElse(0);
70+
for (int i = 0; i < size; ++i) {
71+
final int index = i;
72+
73+
lists.forEach((k, v) -> {
74+
final Value value = index < v.size() ? v.get(index) : null;
75+
76+
if (value != null) {
77+
record.put(k, v.get(index));
78+
}
79+
else {
80+
record.remove(k);
81+
}
82+
});
83+
84+
recordTransformer.transform(record);
85+
}
86+
87+
lists.keySet().forEach(record::remove);
88+
}
89+
},
90+
6391
once {
6492
private final Map<Metafix, Set<String>> executed = new HashMap<>();
6593

metafix/src/test/java/org/metafacture/metafix/MetafixBindTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,43 @@ public void shouldPerformComplexOperationWithPathWildcard() {
744744
);
745745
}
746746

747+
@Test
748+
public void shouldDoListAs() {
749+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
750+
"set_array('sourceOrga[]')",
751+
"do list_as(orgId: 'ccm:university[]', orgName: 'ccm:university_DISPLAYNAME[]')",
752+
" copy_field(orgId, 'sourceOrga[].$append.id')",
753+
" copy_field(orgName, 'sourceOrga[].$last.name')",
754+
"end"
755+
),
756+
i -> {
757+
i.startRecord("1");
758+
i.startEntity("ccm:university[]");
759+
i.literal("1", "https://ror.org/0304hq317");
760+
i.endEntity();
761+
i.startEntity("ccm:university_DISPLAYNAME[]");
762+
i.literal("1", "Gottfried Wilhelm Leibniz Universität Hannover");
763+
i.endEntity();
764+
i.endRecord();
765+
},
766+
(o, f) -> {
767+
o.get().startRecord("1");
768+
o.get().startEntity("ccm:university[]");
769+
o.get().literal("1", "https://ror.org/0304hq317");
770+
o.get().endEntity();
771+
o.get().startEntity("ccm:university_DISPLAYNAME[]");
772+
o.get().literal("1", "Gottfried Wilhelm Leibniz Universität Hannover");
773+
o.get().endEntity();
774+
o.get().startEntity("sourceOrga[]");
775+
o.get().startEntity("1");
776+
o.get().literal("id", "https://ror.org/0304hq317");
777+
o.get().literal("name", "Gottfried Wilhelm Leibniz Universität Hannover");
778+
f.apply(2).endEntity();
779+
o.get().endRecord();
780+
}
781+
);
782+
}
783+
747784
@Test
748785
public void shouldExecuteOnlyOnce() {
749786
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(

0 commit comments

Comments
 (0)