diff options
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.java | 70 |
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 | |||
19 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall; | 19 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall; |
20 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; | 20 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; |
21 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; | 21 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; |
22 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; | ||
22 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery; | 23 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery; |
23 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; | 24 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; |
24 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; | 25 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; |
25 | import tools.refinery.store.query.dnf.Dnf; | 26 | import tools.refinery.store.query.dnf.Dnf; |
26 | import tools.refinery.store.query.dnf.DnfClause; | 27 | import tools.refinery.store.query.dnf.DnfClause; |
28 | import tools.refinery.store.query.dnf.SymbolicParameter; | ||
27 | import tools.refinery.store.query.literal.*; | 29 | import tools.refinery.store.query.literal.*; |
28 | import tools.refinery.store.query.term.ConstantTerm; | 30 | import tools.refinery.store.query.term.ConstantTerm; |
29 | import tools.refinery.store.query.term.StatefulAggregator; | 31 | import 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); |