Skip to content

Commit 56e59e6

Browse files
committed
Optimize record transformer options. (#207)
Extract option building out of the record loop. NOTE: Incidentally introduces options to conditionals (just came naturally and simplified the implementation a little).
1 parent 7df9a55 commit 56e59e6

File tree

2 files changed

+58
-23
lines changed

2 files changed

+58
-23
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,21 @@ Expression:
1616
;
1717

1818
Unless:
19-
'unless' name = QualifiedName '(' ( params += (QualifiedName|STRING) ( ',' params += (QualifiedName|STRING) )* )? ')'
19+
'unless' name = QualifiedName '(' ( params += (QualifiedName|STRING) ( ',' params += (QualifiedName|STRING) )* ','? )? ( options = Options )? ')'
2020
elements += Expression*
2121
'end'
2222
;
2323

2424
If:
25-
'if' name = QualifiedName '(' ( params += (QualifiedName|STRING) ( ',' params += (QualifiedName|STRING) )* )? ')'
25+
'if' name = QualifiedName '(' ( params += (QualifiedName|STRING) ( ',' params += (QualifiedName|STRING) )* ','? )? ( options = Options )? ')'
2626
elements += Expression*
2727
elseIf = ElsIf?
2828
else = Else?
2929
'end'
3030
;
3131

3232
ElsIf:
33-
'elsif' name = QualifiedName '(' ( params += (QualifiedName|STRING) ( ',' params += (QualifiedName|STRING) )* )? ')'
33+
'elsif' name = QualifiedName '(' ( params += (QualifiedName|STRING) ( ',' params += (QualifiedName|STRING) )* ','? )? ( options = Options )? ')'
3434
elements += Expression*
3535
;
3636

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

Lines changed: 55 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,14 @@
3838
import org.slf4j.Logger;
3939
import org.slf4j.LoggerFactory;
4040

41+
import java.util.ArrayList;
4142
import java.util.LinkedHashMap;
4243
import java.util.LinkedList;
4344
import java.util.List;
4445
import java.util.Map;
4546
import java.util.function.Consumer;
4647
import java.util.function.Function;
4748
import java.util.function.Supplier;
48-
import java.util.stream.Collectors;
4949

5050
/**
5151
* Transform a record using a {@link Fix}.
@@ -72,17 +72,20 @@ private RecordTransformer(final Metafix metafix, final List<Expression> expressi
7272
vars = metafix.getVars();
7373

7474
expressions.forEach(e -> {
75+
final List<String> params = e.getParams();
76+
final Map<String, String> options = options(e.getOptions());
77+
7578
if (e instanceof Do) {
76-
processDo((Do) e);
79+
processDo((Do) e, params, options);
7780
}
7881
else if (e instanceof If) {
79-
processIf((If) e);
82+
processIf((If) e, params, options);
8083
}
8184
else if (e instanceof Unless) {
82-
processUnless((Unless) e);
85+
processUnless((Unless) e, params, options);
8386
}
8487
else if (e instanceof MethodCall) {
85-
processFunction((MethodCall) e);
88+
processFunction((MethodCall) e, params, options);
8689
}
8790
else {
8891
throw new FixProcessException(executionExceptionMessage(e));
@@ -100,16 +103,16 @@ public void transform(final Record record) {
100103
});
101104
}
102105

103-
private void processDo(final Do expression) {
106+
private void processDo(final Do expression, final List<String> params, final Map<String, String> options) {
104107
processFix(() -> executionExceptionMessage(expression), () -> {
105108
final FixContext context = getInstance(expression.getName(), FixContext.class, FixBind::valueOf);
106109
final RecordTransformer recordTransformer = new RecordTransformer(metafix, expression.getElements());
107110

108-
return record -> context.execute(metafix, record, params(expression.getParams()), options(expression.getOptions()), recordTransformer);
111+
return record -> context.execute(metafix, record, resolveParams(params), resolveOptions(options), recordTransformer);
109112
});
110113
}
111114

112-
private void processIf(final If ifExpression) {
115+
private void processIf(final If ifExpression, final List<String> ifParams, final Map<String, String> ifOptions) {
113116
final ElsIf elseIfExpression = ifExpression.getElseIf();
114117
final Else elseExpression = ifExpression.getElse();
115118

@@ -118,21 +121,37 @@ private void processIf(final If ifExpression) {
118121

119122
processFix(() -> executionExceptionMessage(ifExpression, ifExpression.eResource()), () -> {
120123
final FixPredicate ifPredicate = getInstance(ifExpression.getName(), FixPredicate.class, FixConditional::valueOf);
121-
final FixPredicate elseIfPredicate = elseIfExpression != null ? getInstance(elseIfExpression.getName(), FixPredicate.class, FixConditional::valueOf) : null;
122-
123124
final RecordTransformer ifTransformer = new RecordTransformer(metafix, ifExpression.getElements());
124-
final RecordTransformer elseIfTransformer = elseIfExpression != null ? new RecordTransformer(metafix, elseIfExpression.getElements()) : null;
125+
126+
final FixPredicate elseIfPredicate;
127+
final List<String> elseIfParams;
128+
final Map<String, String> elseIfOptions;
129+
final RecordTransformer elseIfTransformer;
130+
131+
if (elseIfExpression != null) {
132+
elseIfPredicate = getInstance(elseIfExpression.getName(), FixPredicate.class, FixConditional::valueOf);
133+
elseIfParams = elseIfExpression.getParams();
134+
elseIfOptions = options(elseIfExpression.getOptions());
135+
elseIfTransformer = new RecordTransformer(metafix, elseIfExpression.getElements());
136+
}
137+
else {
138+
elseIfPredicate = null;
139+
elseIfParams = null;
140+
elseIfOptions = null;
141+
elseIfTransformer = null;
142+
}
143+
125144
final RecordTransformer elseTransformer = elseExpression != null ? new RecordTransformer(metafix, elseExpression.getElements()) : null;
126145

127146
return record -> {
128-
if (ifPredicate.test(metafix, record, params(ifExpression.getParams()), options(null))) { // TODO: options
147+
if (ifPredicate.test(metafix, record, resolveParams(ifParams), resolveOptions(ifOptions))) {
129148
ifTransformer.transform(record);
130149
}
131150
else {
132151
if (elseIfExpression != null) {
133152
currentMessageSupplier = elseIfMessageSupplier;
134153

135-
if (elseIfPredicate.test(metafix, record, params(elseIfExpression.getParams()), options(null))) { // TODO: options
154+
if (elseIfPredicate.test(metafix, record, resolveParams(elseIfParams), resolveOptions(elseIfOptions))) {
136155
elseIfTransformer.transform(record);
137156
return;
138157
}
@@ -147,23 +166,23 @@ private void processIf(final If ifExpression) {
147166
});
148167
}
149168

150-
private void processUnless(final Unless expression) {
169+
private void processUnless(final Unless expression, final List<String> params, final Map<String, String> options) {
151170
processFix(() -> executionExceptionMessage(expression, expression.eResource()), () -> {
152171
final FixPredicate predicate = getInstance(expression.getName(), FixPredicate.class, FixConditional::valueOf);
153172
final RecordTransformer recordTransformer = new RecordTransformer(metafix, expression.getElements());
154173

155174
return record -> {
156-
if (!predicate.test(metafix, record, params(expression.getParams()), options(null))) { // TODO: options
175+
if (!predicate.test(metafix, record, resolveParams(params), resolveOptions(options))) {
157176
recordTransformer.transform(record);
158177
}
159178
};
160179
});
161180
}
162181

163-
private void processFunction(final MethodCall expression) {
182+
private void processFunction(final MethodCall expression, final List<String> params, final Map<String, String> options) {
164183
processFix(() -> executionExceptionMessage(expression), () -> {
165184
final FixFunction function = getInstance(expression.getName(), FixFunction.class, FixMethod::valueOf);
166-
return record -> function.apply(metafix, record, params(expression.getParams()), options(expression.getOptions()));
185+
return record -> function.apply(metafix, record, resolveParams(params), resolveOptions(options));
167186
});
168187
}
169188

@@ -223,8 +242,14 @@ private String resolveVars(final String value) {
223242
return value == null ? null : StringUtil.format(value, Metafix.VAR_START, Metafix.VAR_END, false, vars);
224243
}
225244

226-
private List<String> params(final List<String> params) {
227-
return params.stream().map(this::resolveVars).collect(Collectors.toList());
245+
private List<String> resolveParams(final List<String> params) {
246+
final List<String> list = new ArrayList<>(params.size());
247+
248+
for (final String entry : params) {
249+
list.add(resolveVars(entry));
250+
}
251+
252+
return list;
228253
}
229254

230255
private Map<String, String> options(final Options options) {
@@ -235,11 +260,21 @@ private Map<String, String> options(final Options options) {
235260
final List<String> values = options.getValues();
236261

237262
for (int i = 0; i < keys.size(); i += 1) {
238-
map.put(resolveVars(keys.get(i)), resolveVars(values.get(i)));
263+
map.put(keys.get(i), values.get(i));
239264
}
240265
}
241266

242267
return map;
243268
}
244269

270+
private Map<String, String> resolveOptions(final Map<String, String> options) {
271+
final Map<String, String> map = new LinkedHashMap<>(options.size());
272+
273+
for (final Map.Entry<String, String> entry : options.entrySet()) {
274+
map.put(resolveVars(entry.getKey()), resolveVars(entry.getValue()));
275+
}
276+
277+
return map;
278+
}
279+
245280
}

0 commit comments

Comments
 (0)