diff options
Diffstat (limited to 'subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/psystem/basicdeferred/PatternCallBasedDeferred.java')
-rw-r--r-- | subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/psystem/basicdeferred/PatternCallBasedDeferred.java | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/psystem/basicdeferred/PatternCallBasedDeferred.java b/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/psystem/basicdeferred/PatternCallBasedDeferred.java new file mode 100644 index 00000000..93eeffec --- /dev/null +++ b/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/psystem/basicdeferred/PatternCallBasedDeferred.java | |||
@@ -0,0 +1,118 @@ | |||
1 | /******************************************************************************* | ||
2 | * Copyright (c) 2004-2010 Gabor Bergmann and Daniel Varro | ||
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 | |||
10 | package tools.refinery.viatra.runtime.matchers.psystem.basicdeferred; | ||
11 | |||
12 | import java.util.Collections; | ||
13 | import java.util.HashSet; | ||
14 | import java.util.Set; | ||
15 | |||
16 | import tools.refinery.viatra.runtime.matchers.planning.QueryProcessingException; | ||
17 | import tools.refinery.viatra.runtime.matchers.psystem.IQueryReference; | ||
18 | import tools.refinery.viatra.runtime.matchers.psystem.PBody; | ||
19 | import tools.refinery.viatra.runtime.matchers.psystem.PConstraint; | ||
20 | import tools.refinery.viatra.runtime.matchers.psystem.PVariable; | ||
21 | import tools.refinery.viatra.runtime.matchers.psystem.VariableDeferredPConstraint; | ||
22 | import tools.refinery.viatra.runtime.matchers.psystem.queries.PQuery; | ||
23 | import tools.refinery.viatra.runtime.matchers.tuple.Tuple; | ||
24 | |||
25 | /** | ||
26 | * @author Gabor Bergmann | ||
27 | * | ||
28 | */ | ||
29 | public abstract class PatternCallBasedDeferred extends VariableDeferredPConstraint implements IQueryReference { | ||
30 | |||
31 | protected Tuple actualParametersTuple; | ||
32 | |||
33 | protected abstract void doDoReplaceVariables(PVariable obsolete, PVariable replacement); | ||
34 | |||
35 | protected abstract Set<PVariable> getCandidateQuantifiedVariables(); | ||
36 | |||
37 | protected PQuery query; | ||
38 | private Set<PVariable> deferringVariables; | ||
39 | |||
40 | public PatternCallBasedDeferred(PBody pBody, Tuple actualParametersTuple, | ||
41 | PQuery pattern, Set<PVariable> additionalAffectedVariables) { | ||
42 | super(pBody, union(actualParametersTuple.<PVariable> getDistinctElements(), additionalAffectedVariables)); | ||
43 | this.actualParametersTuple = actualParametersTuple; | ||
44 | this.query = pattern; | ||
45 | } | ||
46 | |||
47 | public PatternCallBasedDeferred(PBody pBody, Tuple actualParametersTuple, | ||
48 | PQuery pattern) { | ||
49 | this(pBody, actualParametersTuple, pattern, Collections.<PVariable> emptySet()); | ||
50 | } | ||
51 | |||
52 | private static Set<PVariable> union(Set<PVariable> a, Set<PVariable> b) { | ||
53 | Set<PVariable> result = new HashSet<PVariable>(); | ||
54 | result.addAll(a); | ||
55 | result.addAll(b); | ||
56 | return result; | ||
57 | } | ||
58 | |||
59 | @Override | ||
60 | public Set<PVariable> getDeferringVariables() { | ||
61 | if (deferringVariables == null) { | ||
62 | deferringVariables = new HashSet<PVariable>(); | ||
63 | for (PVariable var : getCandidateQuantifiedVariables()) { | ||
64 | if (var.isDeducable()) | ||
65 | deferringVariables.add(var); | ||
66 | } | ||
67 | } | ||
68 | return deferringVariables; | ||
69 | } | ||
70 | |||
71 | @Override | ||
72 | public void checkSanity() { | ||
73 | super.checkSanity(); | ||
74 | for (Object obj : this.actualParametersTuple.getDistinctElements()) { | ||
75 | PVariable var = (PVariable) obj; | ||
76 | if (!getDeferringVariables().contains(var)) { | ||
77 | // so this is a free variable of the NAC / aggregation? | ||
78 | for (PConstraint pConstraint : var.getReferringConstraints()) { | ||
79 | if (pConstraint != this | ||
80 | && !(pConstraint instanceof Equality && ((Equality) pConstraint).isMoot())) | ||
81 | throw new QueryProcessingException ( | ||
82 | "Variable {1} of constraint {2} is not a positively determined part of the pattern, yet it is also affected by {3}.", | ||
83 | new String[] { var.toString(), this.toString(), pConstraint.toString() }, | ||
84 | "Read-only variable can not be deduced", null); | ||
85 | } | ||
86 | } | ||
87 | } | ||
88 | |||
89 | } | ||
90 | |||
91 | // public SubPlan getSidePlan(IOperationCompiler compiler) throws QueryPlannerException { | ||
92 | // SubPlan sidePlan = compiler.patternCallPlan(actualParametersTuple, query); | ||
93 | // sidePlan = BuildHelper.enforceVariableCoincidences(compiler, sidePlan); | ||
94 | // return sidePlan; | ||
95 | // } | ||
96 | |||
97 | @Override | ||
98 | protected void doReplaceVariable(PVariable obsolete, PVariable replacement) { | ||
99 | if (deferringVariables != null) { | ||
100 | // FAIL instead of hopeless attempt to fix | ||
101 | // if (deferringVariables.remove(obsolete)) deferringVariables.add(replacement); | ||
102 | throw new IllegalStateException("Cannot replace variables on " + this | ||
103 | + " when deferring variables have already been identified."); | ||
104 | } | ||
105 | actualParametersTuple = actualParametersTuple.replaceAll(obsolete, replacement); | ||
106 | doDoReplaceVariables(obsolete, replacement); | ||
107 | } | ||
108 | |||
109 | public Tuple getActualParametersTuple() { | ||
110 | return actualParametersTuple; | ||
111 | } | ||
112 | |||
113 | @Override | ||
114 | public PQuery getReferredQuery() { | ||
115 | return query; | ||
116 | } | ||
117 | |||
118 | } | ||