aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/Dnf2PQuery.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/Dnf2PQuery.java')
-rw-r--r--subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/Dnf2PQuery.java70
1 files changed, 38 insertions, 32 deletions
diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/Dnf2PQuery.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/Dnf2PQuery.java
index b511a5c7..ec880435 100644
--- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/Dnf2PQuery.java
+++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/Dnf2PQuery.java
@@ -19,11 +19,13 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.Consta
19import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall; 19import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall;
20import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; 20import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
21import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; 21import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
22import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
22import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery; 23import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery;
23import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; 24import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
24import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; 25import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
25import tools.refinery.store.query.dnf.Dnf; 26import tools.refinery.store.query.dnf.Dnf;
26import tools.refinery.store.query.dnf.DnfClause; 27import tools.refinery.store.query.dnf.DnfClause;
28import tools.refinery.store.query.dnf.SymbolicParameter;
27import tools.refinery.store.query.literal.*; 29import tools.refinery.store.query.literal.*;
28import tools.refinery.store.query.term.ConstantTerm; 30import tools.refinery.store.query.term.ConstantTerm;
29import tools.refinery.store.query.term.StatefulAggregator; 31import tools.refinery.store.query.term.StatefulAggregator;
@@ -82,15 +84,20 @@ public class Dnf2PQuery {
82 var pQuery = new RawPQuery(dnfQuery.getUniqueName()); 84 var pQuery = new RawPQuery(dnfQuery.getUniqueName());
83 pQuery.setEvaluationHints(consumeHint(dnfQuery)); 85 pQuery.setEvaluationHints(consumeHint(dnfQuery));
84 86
85 Map<Variable, PParameter> parameters = new HashMap<>(); 87 Map<SymbolicParameter, PParameter> parameters = new HashMap<>();
86 for (Variable variable : dnfQuery.getParameters()) {
87 parameters.put(variable, new PParameter(variable.getUniqueName()));
88 }
89
90 List<PParameter> parameterList = new ArrayList<>(); 88 List<PParameter> parameterList = new ArrayList<>();
91 for (var param : dnfQuery.getParameters()) { 89 for (var parameter : dnfQuery.getSymbolicParameters()) {
92 parameterList.add(parameters.get(param)); 90 var direction = switch (parameter.getDirection()) {
91 case IN_OUT -> PParameterDirection.INOUT;
92 case OUT -> PParameterDirection.OUT;
93 case IN -> throw new IllegalArgumentException("Query %s with input parameter %s is not supported"
94 .formatted(dnfQuery, parameter.getVariable()));
95 };
96 var pParameter = new PParameter(parameter.getVariable().getUniqueName(), null, null, direction);
97 parameters.put(parameter, pParameter);
98 parameterList.add(pParameter);
93 } 99 }
100
94 pQuery.setParameters(parameterList); 101 pQuery.setParameters(parameterList);
95 102
96 for (var functionalDependency : dnfQuery.getFunctionalDependencies()) { 103 for (var functionalDependency : dnfQuery.getFunctionalDependencies()) {
@@ -110,15 +117,15 @@ public class Dnf2PQuery {
110 synchronized (P_CONSTRAINT_LOCK) { 117 synchronized (P_CONSTRAINT_LOCK) {
111 for (DnfClause clause : dnfQuery.getClauses()) { 118 for (DnfClause clause : dnfQuery.getClauses()) {
112 PBody body = new PBody(pQuery); 119 PBody body = new PBody(pQuery);
113 List<ExportedParameter> symbolicParameters = new ArrayList<>(); 120 List<ExportedParameter> parameterExports = new ArrayList<>();
114 for (var param : dnfQuery.getParameters()) { 121 for (var parameter : dnfQuery.getSymbolicParameters()) {
115 PVariable pVar = body.getOrCreateVariableByName(param.getUniqueName()); 122 PVariable pVar = body.getOrCreateVariableByName(parameter.getVariable().getUniqueName());
116 symbolicParameters.add(new ExportedParameter(body, pVar, parameters.get(param))); 123 parameterExports.add(new ExportedParameter(body, pVar, parameters.get(parameter)));
117 } 124 }
118 body.setSymbolicParameters(symbolicParameters); 125 body.setSymbolicParameters(parameterExports);
119 pQuery.addBody(body); 126 pQuery.addBody(body);
120 for (Literal literal : clause.literals()) { 127 for (Literal literal : clause.literals()) {
121 translateLiteral(literal, clause, body); 128 translateLiteral(literal, body);
122 } 129 }
123 } 130 }
124 } 131 }
@@ -126,11 +133,11 @@ public class Dnf2PQuery {
126 return pQuery; 133 return pQuery;
127 } 134 }
128 135
129 private void translateLiteral(Literal literal, DnfClause clause, PBody body) { 136 private void translateLiteral(Literal literal, PBody body) {
130 if (literal instanceof EquivalenceLiteral equivalenceLiteral) { 137 if (literal instanceof EquivalenceLiteral equivalenceLiteral) {
131 translateEquivalenceLiteral(equivalenceLiteral, body); 138 translateEquivalenceLiteral(equivalenceLiteral, body);
132 } else if (literal instanceof CallLiteral callLiteral) { 139 } else if (literal instanceof CallLiteral callLiteral) {
133 translateCallLiteral(callLiteral, clause, body); 140 translateCallLiteral(callLiteral, body);
134 } else if (literal instanceof ConstantLiteral constantLiteral) { 141 } else if (literal instanceof ConstantLiteral constantLiteral) {
135 translateConstantLiteral(constantLiteral, body); 142 translateConstantLiteral(constantLiteral, body);
136 } else if (literal instanceof AssignLiteral<?> assignLiteral) { 143 } else if (literal instanceof AssignLiteral<?> assignLiteral) {
@@ -138,25 +145,25 @@ public class Dnf2PQuery {
138 } else if (literal instanceof AssumeLiteral assumeLiteral) { 145 } else if (literal instanceof AssumeLiteral assumeLiteral) {
139 translateAssumeLiteral(assumeLiteral, body); 146 translateAssumeLiteral(assumeLiteral, body);
140 } else if (literal instanceof CountLiteral countLiteral) { 147 } else if (literal instanceof CountLiteral countLiteral) {
141 translateCountLiteral(countLiteral, clause, body); 148 translateCountLiteral(countLiteral, body);
142 } else if (literal instanceof AggregationLiteral<?, ?> aggregationLiteral) { 149 } else if (literal instanceof AggregationLiteral<?, ?> aggregationLiteral) {
143 translateAggregationLiteral(aggregationLiteral, clause, body); 150 translateAggregationLiteral(aggregationLiteral, body);
144 } else { 151 } else {
145 throw new IllegalArgumentException("Unknown literal: " + literal.toString()); 152 throw new IllegalArgumentException("Unknown literal: " + literal.toString());
146 } 153 }
147 } 154 }
148 155
149 private void translateEquivalenceLiteral(EquivalenceLiteral equivalenceLiteral, PBody body) { 156 private void translateEquivalenceLiteral(EquivalenceLiteral equivalenceLiteral, PBody body) {
150 PVariable varSource = body.getOrCreateVariableByName(equivalenceLiteral.left().getUniqueName()); 157 PVariable varSource = body.getOrCreateVariableByName(equivalenceLiteral.getLeft().getUniqueName());
151 PVariable varTarget = body.getOrCreateVariableByName(equivalenceLiteral.right().getUniqueName()); 158 PVariable varTarget = body.getOrCreateVariableByName(equivalenceLiteral.getRight().getUniqueName());
152 if (equivalenceLiteral.positive()) { 159 if (equivalenceLiteral.isPositive()) {
153 new Equality(body, varSource, varTarget); 160 new Equality(body, varSource, varTarget);
154 } else { 161 } else {
155 new Inequality(body, varSource, varTarget); 162 new Inequality(body, varSource, varTarget);
156 } 163 }
157 } 164 }
158 165
159 private void translateCallLiteral(CallLiteral callLiteral, DnfClause clause, PBody body) { 166 private void translateCallLiteral(CallLiteral callLiteral, PBody body) {
160 var polarity = callLiteral.getPolarity(); 167 var polarity = callLiteral.getPolarity();
161 switch (polarity) { 168 switch (polarity) {
162 case POSITIVE -> { 169 case POSITIVE -> {
@@ -186,7 +193,7 @@ public class Dnf2PQuery {
186 new BinaryTransitiveClosure(body, substitution, pattern); 193 new BinaryTransitiveClosure(body, substitution, pattern);
187 } 194 }
188 case NEGATIVE -> { 195 case NEGATIVE -> {
189 var wrappedCall = wrapperFactory.maybeWrapConstraint(callLiteral, clause); 196 var wrappedCall = wrapperFactory.maybeWrapConstraint(callLiteral);
190 var substitution = translateSubstitution(wrappedCall.remappedArguments(), body); 197 var substitution = translateSubstitution(wrappedCall.remappedArguments(), body);
191 var pattern = wrappedCall.pattern(); 198 var pattern = wrappedCall.pattern();
192 new NegativePatternCall(body, substitution, pattern); 199 new NegativePatternCall(body, substitution, pattern);
@@ -206,13 +213,13 @@ public class Dnf2PQuery {
206 } 213 }
207 214
208 private void translateConstantLiteral(ConstantLiteral constantLiteral, PBody body) { 215 private void translateConstantLiteral(ConstantLiteral constantLiteral, PBody body) {
209 var variable = body.getOrCreateVariableByName(constantLiteral.variable().getUniqueName()); 216 var variable = body.getOrCreateVariableByName(constantLiteral.getVariable().getUniqueName());
210 new ConstantValue(body, variable, constantLiteral.nodeId()); 217 new ConstantValue(body, variable, constantLiteral.getNodeId());
211 } 218 }
212 219
213 private <T> void translateAssignLiteral(AssignLiteral<T> assignLiteral, PBody body) { 220 private <T> void translateAssignLiteral(AssignLiteral<T> assignLiteral, PBody body) {
214 var variable = body.getOrCreateVariableByName(assignLiteral.variable().getUniqueName()); 221 var variable = body.getOrCreateVariableByName(assignLiteral.getTargetVariable().getUniqueName());
215 var term = assignLiteral.term(); 222 var term = assignLiteral.getTerm();
216 if (term instanceof ConstantTerm<T> constantTerm) { 223 if (term instanceof ConstantTerm<T> constantTerm) {
217 new ConstantValue(body, variable, constantTerm.getValue()); 224 new ConstantValue(body, variable, constantTerm.getValue());
218 } else { 225 } else {
@@ -222,19 +229,18 @@ public class Dnf2PQuery {
222 } 229 }
223 230
224 private void translateAssumeLiteral(AssumeLiteral assumeLiteral, PBody body) { 231 private void translateAssumeLiteral(AssumeLiteral assumeLiteral, PBody body) {
225 var evaluator = new AssumptionEvaluator(assumeLiteral.term()); 232 var evaluator = new AssumptionEvaluator(assumeLiteral.getTerm());
226 new ExpressionEvaluation(body, evaluator, null); 233 new ExpressionEvaluation(body, evaluator, null);
227 } 234 }
228 235
229 private void translateCountLiteral(CountLiteral countLiteral, DnfClause clause, PBody body) { 236 private void translateCountLiteral(CountLiteral countLiteral, PBody body) {
230 var wrappedCall = wrapperFactory.maybeWrapConstraint(countLiteral, clause); 237 var wrappedCall = wrapperFactory.maybeWrapConstraint(countLiteral);
231 var substitution = translateSubstitution(wrappedCall.remappedArguments(), body); 238 var substitution = translateSubstitution(wrappedCall.remappedArguments(), body);
232 var resultVariable = body.getOrCreateVariableByName(countLiteral.getResultVariable().getUniqueName()); 239 var resultVariable = body.getOrCreateVariableByName(countLiteral.getResultVariable().getUniqueName());
233 new PatternMatchCounter(body, substitution, wrappedCall.pattern(), resultVariable); 240 new PatternMatchCounter(body, substitution, wrappedCall.pattern(), resultVariable);
234 } 241 }
235 242
236 private <R, T> void translateAggregationLiteral(AggregationLiteral<R, T> aggregationLiteral, DnfClause clause, 243 private <R, T> void translateAggregationLiteral(AggregationLiteral<R, T> aggregationLiteral, PBody body) {
237 PBody body) {
238 var aggregator = aggregationLiteral.getAggregator(); 244 var aggregator = aggregationLiteral.getAggregator();
239 IMultisetAggregationOperator<T, ?, R> aggregationOperator; 245 IMultisetAggregationOperator<T, ?, R> aggregationOperator;
240 if (aggregator instanceof StatelessAggregator<R, T> statelessAggregator) { 246 if (aggregator instanceof StatelessAggregator<R, T> statelessAggregator) {
@@ -244,7 +250,7 @@ public class Dnf2PQuery {
244 } else { 250 } else {
245 throw new IllegalArgumentException("Unknown aggregator: " + aggregator); 251 throw new IllegalArgumentException("Unknown aggregator: " + aggregator);
246 } 252 }
247 var wrappedCall = wrapperFactory.maybeWrapConstraint(aggregationLiteral, clause); 253 var wrappedCall = wrapperFactory.maybeWrapConstraint(aggregationLiteral);
248 var substitution = translateSubstitution(wrappedCall.remappedArguments(), body); 254 var substitution = translateSubstitution(wrappedCall.remappedArguments(), body);
249 var inputVariable = body.getOrCreateVariableByName(aggregationLiteral.getInputVariable().getUniqueName()); 255 var inputVariable = body.getOrCreateVariableByName(aggregationLiteral.getInputVariable().getUniqueName());
250 var aggregatedColumn = substitution.invertIndex().get(inputVariable); 256 var aggregatedColumn = substitution.invertIndex().get(inputVariable);