diff options
Diffstat (limited to 'subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/psystem/rewriters/VariableMappingExpressionEvaluatorWrapper.java')
-rw-r--r-- | subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/psystem/rewriters/VariableMappingExpressionEvaluatorWrapper.java | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/psystem/rewriters/VariableMappingExpressionEvaluatorWrapper.java b/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/psystem/rewriters/VariableMappingExpressionEvaluatorWrapper.java new file mode 100644 index 00000000..10337979 --- /dev/null +++ b/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/psystem/rewriters/VariableMappingExpressionEvaluatorWrapper.java | |||
@@ -0,0 +1,88 @@ | |||
1 | /******************************************************************************* | ||
2 | * Copyright (c) 2010-2016, Grill Balázs, IncQuery Labs Ltd. | ||
3 | * This program and the accompanying materials are made available under the | ||
4 | * terms of the Eclipse Public License v. 2.0 which is available at | ||
5 | * http://www.eclipse.org/legal/epl-v20.html. | ||
6 | * | ||
7 | * SPDX-License-Identifier: EPL-2.0 | ||
8 | *******************************************************************************/ | ||
9 | package tools.refinery.viatra.runtime.matchers.psystem.rewriters; | ||
10 | |||
11 | import java.util.HashMap; | ||
12 | import java.util.LinkedHashMap; | ||
13 | import java.util.Map; | ||
14 | |||
15 | import tools.refinery.viatra.runtime.matchers.psystem.IExpressionEvaluator; | ||
16 | import tools.refinery.viatra.runtime.matchers.psystem.IValueProvider; | ||
17 | import tools.refinery.viatra.runtime.matchers.psystem.PVariable; | ||
18 | import tools.refinery.viatra.runtime.matchers.util.Preconditions; | ||
19 | |||
20 | /** | ||
21 | * A wrapper for {@link IExpressionEvaluator} which is capable of correctly mapping variable names used by the | ||
22 | * expression. | ||
23 | * | ||
24 | * @author Grill Balázs | ||
25 | * | ||
26 | */ | ||
27 | class VariableMappingExpressionEvaluatorWrapper implements IExpressionEvaluator { | ||
28 | |||
29 | private final IExpressionEvaluator wrapped; | ||
30 | private final Map<String, String> variableMapping; | ||
31 | |||
32 | public VariableMappingExpressionEvaluatorWrapper(IExpressionEvaluator wrapped, | ||
33 | Map<PVariable, PVariable> variableMapping) { | ||
34 | |||
35 | // Support to rewrap an already wrapped expression. | ||
36 | boolean rewrap = wrapped instanceof VariableMappingExpressionEvaluatorWrapper; | ||
37 | this.wrapped = rewrap ? ((VariableMappingExpressionEvaluatorWrapper)wrapped).wrapped : wrapped; | ||
38 | |||
39 | // Instead of just saving the reference of the mapping, save the actual (trimmed) state of the mapping as it | ||
40 | // may change during copying (especially during flattening). A LinkedHashMap is used to retain ordering of | ||
41 | // original parameter names iterator. | ||
42 | this.variableMapping = new LinkedHashMap<>(); | ||
43 | |||
44 | // Index map by variable names | ||
45 | Map<String, PVariable> names = new HashMap<>(); | ||
46 | for (PVariable originalVar : variableMapping.keySet()) { | ||
47 | names.put(originalVar.getName(), originalVar); | ||
48 | } | ||
49 | |||
50 | // In case of rewrapping, current names are contained by the previous mapping | ||
51 | Map<String, String> previousMapping = null; | ||
52 | if (rewrap){ | ||
53 | previousMapping = ((VariableMappingExpressionEvaluatorWrapper)wrapped).variableMapping; | ||
54 | } | ||
55 | |||
56 | // Populate mapping | ||
57 | for (String inputParameterName : this.wrapped.getInputParameterNames()) { | ||
58 | String parameterName = rewrap ? previousMapping.get(inputParameterName) : inputParameterName; | ||
59 | Preconditions.checkArgument(parameterName != null); | ||
60 | PVariable original = names.get(parameterName); | ||
61 | Preconditions.checkArgument(original != null); | ||
62 | PVariable mapped = variableMapping.get(original); | ||
63 | if (mapped != null){ | ||
64 | this.variableMapping.put(inputParameterName, mapped.getName()); | ||
65 | } | ||
66 | } | ||
67 | } | ||
68 | |||
69 | @Override | ||
70 | public String getShortDescription() { | ||
71 | return wrapped.getShortDescription(); | ||
72 | } | ||
73 | |||
74 | @Override | ||
75 | public Iterable<String> getInputParameterNames() { | ||
76 | return variableMapping.values(); | ||
77 | } | ||
78 | |||
79 | @Override | ||
80 | public Object evaluateExpression(final IValueProvider provider) throws Exception { | ||
81 | return wrapped.evaluateExpression(variableName -> { | ||
82 | String mappedVariableName = variableMapping.get(variableName); | ||
83 | Preconditions.checkArgument(mappedVariableName != null, "Could not find variable %s", variableName); | ||
84 | return provider.getValue(mappedVariableName); | ||
85 | }); | ||
86 | } | ||
87 | |||
88 | } | ||