aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language/src/main/java/tools/refinery/language/expressions/CompositeTermInterpreter.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/language/src/main/java/tools/refinery/language/expressions/CompositeTermInterpreter.java')
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/expressions/CompositeTermInterpreter.java99
1 files changed, 99 insertions, 0 deletions
diff --git a/subprojects/language/src/main/java/tools/refinery/language/expressions/CompositeTermInterpreter.java b/subprojects/language/src/main/java/tools/refinery/language/expressions/CompositeTermInterpreter.java
new file mode 100644
index 00000000..b337e5dd
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/expressions/CompositeTermInterpreter.java
@@ -0,0 +1,99 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.expressions;
7
8import tools.refinery.language.model.problem.BinaryOp;
9import tools.refinery.language.model.problem.UnaryOp;
10import tools.refinery.language.typesystem.AggregatorName;
11import tools.refinery.language.typesystem.DataExprType;
12
13import java.util.List;
14import java.util.Optional;
15
16public class CompositeTermInterpreter implements TermInterpreter {
17 private final List<TermInterpreter> interpreters;
18
19 public CompositeTermInterpreter(List<TermInterpreter> interpreters) {
20 this.interpreters = interpreters;
21 }
22
23 @Override
24 public Optional<DataExprType> getNegationType(DataExprType type) {
25 for (var interpreter : interpreters) {
26 var result = interpreter.getNegationType(type);
27 if (result.isPresent()) {
28 return result;
29 }
30 }
31 return Optional.empty();
32 }
33
34 @Override
35 public Optional<DataExprType> getUnaryOperationType(UnaryOp op, DataExprType type) {
36 for (var interpreter : interpreters) {
37 var result = interpreter.getUnaryOperationType(op, type);
38 if (result.isPresent()) {
39 return result;
40 }
41 }
42 return Optional.empty();
43 }
44
45 @Override
46 public boolean isComparisonSupported(DataExprType type) {
47 for (var interpreter : interpreters) {
48 var result = interpreter.isComparisonSupported(type);
49 if (result) {
50 return true;
51 }
52 }
53 return false;
54 }
55
56 @Override
57 public boolean isRangeSupported(DataExprType type) {
58 for (var interpreter : interpreters) {
59 var result = interpreter.isRangeSupported(type);
60 if (result) {
61 return true;
62 }
63 }
64 return false;
65 }
66
67 @Override
68 public Optional<DataExprType> getBinaryOperationType(BinaryOp op, DataExprType leftType, DataExprType rightType) {
69 for (var interpreter : interpreters) {
70 var result = interpreter.getBinaryOperationType(op, leftType, rightType);
71 if (result.isPresent()) {
72 return result;
73 }
74 }
75 return Optional.empty();
76 }
77
78 @Override
79 public boolean isCastSupported(DataExprType fromType, DataExprType toType) {
80 for (var interpreter : interpreters) {
81 var result = interpreter.isCastSupported(fromType, toType);
82 if (result) {
83 return true;
84 }
85 }
86 return false;
87 }
88
89 @Override
90 public Optional<DataExprType> getAggregationType(AggregatorName aggregator, DataExprType type) {
91 for (var interpreter : interpreters) {
92 var result = interpreter.getAggregationType(aggregator, type);
93 if (result.isPresent()) {
94 return result;
95 }
96 }
97 return Optional.empty();
98 }
99}