Skip to content

Commit e044f86

Browse files
committed
Add flatten() Fix function. (#122)
1 parent bec6763 commit e044f86

File tree

5 files changed

+173
-1
lines changed

5 files changed

+173
-1
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,14 @@ Only keeps field values that match the regular expression pattern.
457457
filter("<sourceField>", "<regexp>")
458458
```
459459

460+
##### `flatten`
461+
462+
Flattens a nested array field.
463+
464+
```perl
465+
flatten("<sourceField>")
466+
```
467+
460468
##### `index`
461469

462470
Returns the index position of a substring in a field and replaces the field value with this number.

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,14 @@ public void apply(final Metafix metafix, final Record record, final List<String>
389389
);
390390
}
391391
},
392+
flatten {
393+
@Override
394+
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
395+
record.transform(params.get(0), (m, c) -> m
396+
.ifArray(a -> c.accept(newArray(flatten(a.stream()))))
397+
);
398+
}
399+
},
392400
index {
393401
@Override
394402
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {

metafix/src/main/java/org/metafacture/metafix/api/FixFunction.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,11 @@ default Stream<Value> unique(final Stream<Value> stream) {
5555
return stream.filter(set::add);
5656
}
5757

58+
default Stream<Value> flatten(final Stream<Value> stream) {
59+
return stream.flatMap(v -> v.extractType((m, c) -> m
60+
.ifArray(a -> c.accept(flatten(a.stream())))
61+
.orElse(w -> c.accept(Stream.of(w)))
62+
));
63+
}
64+
5865
}

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

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,6 +1109,156 @@ public void shouldFilterArrayObjectValues() {
11091109
);
11101110
}
11111111

1112+
@Test
1113+
public void shouldFlattenFlatArray() {
1114+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
1115+
"flatten('flat')"
1116+
),
1117+
i -> {
1118+
i.startRecord("1");
1119+
i.literal("flat", "1");
1120+
i.literal("flat", "2");
1121+
i.literal("flat", "3");
1122+
i.endRecord();
1123+
},
1124+
o -> {
1125+
o.get().startRecord("1");
1126+
o.get().literal("flat", "1");
1127+
o.get().literal("flat", "2");
1128+
o.get().literal("flat", "3");
1129+
o.get().endRecord();
1130+
}
1131+
);
1132+
}
1133+
1134+
@Test
1135+
public void shouldFlattenFlatHash() {
1136+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
1137+
"flatten('flat')"
1138+
),
1139+
i -> {
1140+
i.startRecord("1");
1141+
i.startEntity("flat");
1142+
i.literal("a", "1");
1143+
i.literal("a", "2");
1144+
i.literal("a", "3");
1145+
i.endEntity();
1146+
i.endRecord();
1147+
},
1148+
o -> {
1149+
o.get().startRecord("1");
1150+
o.get().startEntity("flat");
1151+
o.get().literal("a", "1");
1152+
o.get().literal("a", "2");
1153+
o.get().literal("a", "3");
1154+
o.get().endEntity();
1155+
o.get().endRecord();
1156+
}
1157+
);
1158+
}
1159+
1160+
@Test
1161+
public void shouldFlattenFlatString() {
1162+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
1163+
"flatten('flat')"
1164+
),
1165+
i -> {
1166+
i.startRecord("1");
1167+
i.literal("flat", "1");
1168+
i.endRecord();
1169+
},
1170+
o -> {
1171+
o.get().startRecord("1");
1172+
o.get().literal("flat", "1");
1173+
o.get().endRecord();
1174+
}
1175+
);
1176+
}
1177+
1178+
@Test
1179+
public void shouldFlattenNestedArray() {
1180+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
1181+
"flatten('deep[]')"
1182+
),
1183+
i -> {
1184+
i.startRecord("1");
1185+
i.startEntity("deep[]");
1186+
i.literal("1", "1");
1187+
i.startEntity("2[]");
1188+
i.literal("1", "2");
1189+
i.literal("2", "3");
1190+
i.endEntity();
1191+
i.startEntity("3[]");
1192+
i.startEntity("1[]");
1193+
i.literal("1", "4");
1194+
i.literal("2", "5");
1195+
i.endEntity();
1196+
i.literal("2", "6");
1197+
i.endEntity();
1198+
i.literal("4", "7");
1199+
i.endEntity();
1200+
i.endRecord();
1201+
},
1202+
o -> {
1203+
o.get().startRecord("1");
1204+
o.get().startEntity("deep[]");
1205+
o.get().literal("1", "1");
1206+
o.get().literal("2", "2");
1207+
o.get().literal("3", "3");
1208+
o.get().literal("4", "4");
1209+
o.get().literal("5", "5");
1210+
o.get().literal("6", "6");
1211+
o.get().literal("7", "7");
1212+
o.get().endEntity();
1213+
o.get().endRecord();
1214+
}
1215+
);
1216+
}
1217+
1218+
@Test
1219+
public void shouldFlattenNestedArrayWithHashes() {
1220+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
1221+
"flatten('deep[]')"
1222+
),
1223+
i -> {
1224+
i.startRecord("1");
1225+
i.startEntity("deep[]");
1226+
i.literal("1", "1");
1227+
i.startEntity("2");
1228+
i.literal("a", "2");
1229+
i.literal("a", "3");
1230+
i.endEntity();
1231+
i.startEntity("3[]");
1232+
i.startEntity("1");
1233+
i.literal("a", "4");
1234+
i.literal("a", "5");
1235+
i.endEntity();
1236+
i.literal("2", "6");
1237+
i.endEntity();
1238+
i.literal("4", "7");
1239+
i.endEntity();
1240+
i.endRecord();
1241+
},
1242+
o -> {
1243+
o.get().startRecord("1");
1244+
o.get().startEntity("deep[]");
1245+
o.get().literal("1", "1");
1246+
o.get().startEntity("2");
1247+
o.get().literal("a", "2");
1248+
o.get().literal("a", "3");
1249+
o.get().endEntity();
1250+
o.get().startEntity("3");
1251+
o.get().literal("a", "4");
1252+
o.get().literal("a", "5");
1253+
o.get().endEntity();
1254+
o.get().literal("4", "6");
1255+
o.get().literal("5", "7");
1256+
o.get().endEntity();
1257+
o.get().endRecord();
1258+
}
1259+
);
1260+
}
1261+
11121262
@Test
11131263
public void shouldGetFirstIndexOfSubstring() {
11141264
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(

metafix/src/test/resources/org/metafacture/metafix/integration/method/fromJson/toJson/flatten/todo.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)