Skip to content

Commit 89c9c05

Browse files
authored
Merge pull request #236 from metafacture/164-implementMultipleElsifStatements
Implement multiple `elsif` statements in `if` conditional.
2 parents f257f31 + 448b96a commit 89c9c05

File tree

5 files changed

+91
-25
lines changed

5 files changed

+91
-25
lines changed

metafix/src/main/java/org/metafacture/metafix/Fix.xtext

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Unless:
2424
If:
2525
'if' name = QualifiedName '(' ( params += (QualifiedName|STRING) ( ',' params += (QualifiedName|STRING) )* ','? )? ( options = Options )? ')'
2626
elements += Expression*
27-
elseIf = ElsIf?
27+
elseIf += ElsIf*
2828
else = Else?
2929
'end'
3030
;

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

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import java.util.function.Consumer;
4646
import java.util.function.Function;
4747
import java.util.function.Supplier;
48+
import java.util.stream.Collectors;
4849

4950
/**
5051
* Transform a record using a {@link Fix}.
@@ -112,33 +113,20 @@ private void processDo(final Do expression, final Params params, final Options o
112113
}
113114

114115
private void processIf(final If ifExpression, final Params ifParams, final Options ifOptions) {
115-
final ElsIf elseIfExpression = ifExpression.getElseIf();
116+
final List<ElsIf> elseIfExpressions = ifExpression.getElseIf();
116117
final Else elseExpression = ifExpression.getElse();
117118

118-
final Supplier<String> elseIfMessageSupplier = () -> executionExceptionMessage(elseIfExpression, elseIfExpression.eResource());
119+
final List<Supplier<String>> elseIfMessageSuppliers = mapList(elseIfExpressions, e -> () -> executionExceptionMessage(e, e.eResource()));
119120
final Supplier<String> elseMessageSupplier = () -> executionExceptionMessage(elseExpression, elseExpression.eResource());
120121

121122
processFix(() -> executionExceptionMessage(ifExpression, ifExpression.eResource()), () -> {
122123
final FixPredicate ifPredicate = getInstance(ifExpression.getName(), FixPredicate.class, FixConditional::valueOf);
123124
final RecordTransformer ifTransformer = new RecordTransformer(metafix, ifExpression.getElements());
124125

125-
final FixPredicate elseIfPredicate;
126-
final Params elseIfParams;
127-
final Options elseIfOptions;
128-
final RecordTransformer elseIfTransformer;
129-
130-
if (elseIfExpression != null) {
131-
elseIfPredicate = getInstance(elseIfExpression.getName(), FixPredicate.class, FixConditional::valueOf);
132-
elseIfParams = new Params(elseIfExpression.getParams(), vars);
133-
elseIfOptions = new Options(elseIfExpression.getOptions(), vars);
134-
elseIfTransformer = new RecordTransformer(metafix, elseIfExpression.getElements());
135-
}
136-
else {
137-
elseIfPredicate = null;
138-
elseIfParams = null;
139-
elseIfOptions = null;
140-
elseIfTransformer = null;
141-
}
126+
final List<FixPredicate> elseIfPredicates = mapList(elseIfExpressions, e -> getInstance(e.getName(), FixPredicate.class, FixConditional::valueOf));
127+
final List<Params> elseIfParamsList = mapList(elseIfExpressions, e -> new Params(e.getParams(), vars));
128+
final List<Options> elseIfOptionsList = mapList(elseIfExpressions, e -> new Options(e.getOptions(), vars));
129+
final List<RecordTransformer> elseIfTransformers = mapList(elseIfExpressions, e -> new RecordTransformer(metafix, e.getElements()));
142130

143131
final RecordTransformer elseTransformer = elseExpression != null ? new RecordTransformer(metafix, elseExpression.getElements()) : null;
144132

@@ -147,8 +135,15 @@ private void processIf(final If ifExpression, final Params ifParams, final Optio
147135
ifTransformer.transform(record);
148136
}
149137
else {
150-
if (elseIfExpression != null) {
151-
currentMessageSupplier = elseIfMessageSupplier;
138+
for (int i = 0; i < elseIfExpressions.size(); ++i) {
139+
currentMessageSupplier = elseIfMessageSuppliers.get(i);
140+
141+
final ElsIf elseIfExpression = elseIfExpressions.get(i);
142+
143+
final FixPredicate elseIfPredicate = elseIfPredicates.get(i);
144+
final Params elseIfParams = elseIfParamsList.get(i);
145+
final Options elseIfOptions = elseIfOptionsList.get(i);
146+
final RecordTransformer elseIfTransformer = elseIfTransformers.get(i);
152147

153148
if (elseIfPredicate.test(metafix, record, elseIfParams.resolve(), elseIfOptions.resolve())) {
154149
elseIfTransformer.transform(record);
@@ -189,6 +184,10 @@ private <T> T getInstance(final String name, final Class<T> baseType, final Func
189184
return name.contains(".") ? ReflectionUtil.loadClass(name, baseType).newInstance() : enumFunction.apply(name);
190185
}
191186

187+
private <T, R> List<R> mapList(final List<T> list, final Function<T, R> function) {
188+
return list.stream().map(function).collect(Collectors.toList());
189+
}
190+
192191
private void processFix(final Supplier<String> messageSupplier, final Supplier<Consumer<Record>> consumerSupplier) {
193192
currentMessageSupplier = messageSupplier;
194193

metafix/src/main/java/org/metafacture/metafix/interpreter/FixInterpreter.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import org.slf4j.Logger;
1515
import org.slf4j.LoggerFactory;
1616

17+
import java.util.List;
18+
1719
public class FixInterpreter extends XbaseInterpreter {
1820

1921
private static final Logger LOG = LoggerFactory.getLogger(FixInterpreter.class);
@@ -50,8 +52,8 @@ private void process(final Expression expression) { // checkstyle-disable-line C
5052
process(element);
5153
}
5254

53-
final ElsIf elseIfExpression = ifExpression.getElseIf();
54-
if (elseIfExpression != null) {
55+
final List<ElsIf> elseIfExpressions = ifExpression.getElseIf();
56+
for (final ElsIf elseIfExpression : elseIfExpressions) {
5557
LOG.debug("else if: " + elseIfExpression);
5658

5759
for (final Expression element : elseIfExpression.getElements()) {

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

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,72 @@ public void ifAnyMatchElsif() {
538538
});
539539
}
540540

541+
@Test
542+
public void ifAnyMatchMultipleElsif() {
543+
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
544+
"if any_match('name', '.*University.*')",
545+
" add_field('type', 'Organization')",
546+
"elsif any_match('name', 'Mary')",
547+
" add_field('type', 'Person1')",
548+
"elsif any_match('name', 'Max')",
549+
" add_field('type', 'Person2')",
550+
"elsif any_match('name', '[^ ]* [^ ]*')",
551+
" add_field('type', 'Person')",
552+
"else",
553+
" add_field('type', 'Unknown')",
554+
"end"),
555+
i -> {
556+
i.startRecord("1");
557+
i.literal("name", "Mary Power");
558+
i.literal("name", "Max Power");
559+
i.endRecord();
560+
561+
i.startRecord("2");
562+
i.literal("name", "Some University");
563+
i.endRecord();
564+
565+
i.startRecord("3");
566+
i.literal("name", "Filibandrina");
567+
i.endRecord();
568+
569+
i.startRecord("4");
570+
i.literal("name", "Mary");
571+
i.literal("name", "Max Power");
572+
i.endRecord();
573+
574+
i.startRecord("5");
575+
i.literal("name", "Max");
576+
i.endRecord();
577+
}, o -> {
578+
o.get().startRecord("1");
579+
o.get().literal("name", "Mary Power");
580+
o.get().literal("name", "Max Power");
581+
o.get().literal("type", "Person");
582+
o.get().endRecord();
583+
584+
o.get().startRecord("2");
585+
o.get().literal("name", "Some University");
586+
o.get().literal("type", "Organization");
587+
o.get().endRecord();
588+
589+
o.get().startRecord("3");
590+
o.get().literal("name", "Filibandrina");
591+
o.get().literal("type", "Unknown");
592+
o.get().endRecord();
593+
594+
o.get().startRecord("4");
595+
o.get().literal("name", "Mary");
596+
o.get().literal("name", "Max Power");
597+
o.get().literal("type", "Person1");
598+
o.get().endRecord();
599+
600+
o.get().startRecord("5");
601+
o.get().literal("name", "Max");
602+
o.get().literal("type", "Person2");
603+
o.get().endRecord();
604+
});
605+
}
606+
541607
private void shouldEqualAny(final String path) {
542608
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
543609
"if any_equal('" + path + "', 'University')",

metafix/src/test/resources/org/metafacture/metafix/integration/conditional/fromJson/toJson/ifWithMultipleElsifAndElse/todo.txt

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

0 commit comments

Comments
 (0)