]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRQuery.java
70559d18f6f223543b4a99d9e7ba144ac9266c1e
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / CHRQuery.java
1 package org.simantics.scl.compiler.elaboration.chr;
2
3 import org.simantics.scl.compiler.elaboration.chr.plan.PostCommitOp;
4 import org.simantics.scl.compiler.elaboration.chr.plan.PreCommitOp;
5 import org.simantics.scl.compiler.elaboration.chr.planning.QueryPlanningContext;
6 import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint;
7 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
8 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
9 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
10 import org.simantics.scl.compiler.elaboration.expressions.Expression;
11 import org.simantics.scl.compiler.elaboration.expressions.Variable;
12 import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure;
13 import org.simantics.scl.compiler.elaboration.expressions.printing.ExpressionToStringVisitor;
14 import org.simantics.scl.compiler.errors.Locations;
15 import org.simantics.scl.compiler.internal.parsing.Symbol;
16 import org.simantics.scl.compiler.types.Type;
17
18 import gnu.trove.map.hash.TObjectIntHashMap;
19 import gnu.trove.set.hash.THashSet;
20 import gnu.trove.set.hash.TIntHashSet;
21
22 public class CHRQuery extends Symbol {
23     public CHRLiteral[] literals;
24
25     public CHRQuery(CHRLiteral[] literals) {
26         this.literals = literals;
27     }
28
29     public void resolve(TranslationContext context) {
30         for(CHRLiteral literal : literals)
31             literal.resolve(context);
32     }
33
34     public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {
35         for(CHRLiteral literal : literals)
36             literal.collectRefs(allRefs, refs);
37     }
38
39     public void checkType(TypingContext context) {
40         for(CHRLiteral literal : literals)
41             literal.checkType(context);
42     }
43     
44     public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {
45         for(CHRLiteral literal : literals)
46             literal.collectVars(allVars, vars);
47     }
48
49     public void forVariables(VariableProcedure procedure) {
50         for(CHRLiteral literal : literals)
51             literal.forVariables(procedure);
52     }
53
54     public void collectFreeVariables(THashSet<Variable> vars) {
55         for(CHRLiteral literal : literals)
56             literal.collectFreeVariables(vars);
57     }
58
59     public void setLocationDeep(long loc) {
60         if(location == Locations.NO_LOCATION) {
61             this.location = loc;
62             for(CHRLiteral literal : literals)
63                 literal.setLocationDeep(loc);
64         }
65     }
66     
67     public boolean createQueryPlan(QueryPlanningContext context, Expression inputFact, int activeLiteralId, CHRConstraint initConstraint) {
68         for(int i=0;i<literals.length;++i) {
69             CHRLiteral literal = literals[i];
70             if(i == activeLiteralId)
71                 context.activate(literal, inputFact, i);
72             else
73                 context.add(literal, i);
74         }
75         if(activeLiteralId == -1 && inputFact != null) {
76             context.addInitFact(initConstraint, inputFact);
77         }       
78         return context.createQueryPlan();
79     }
80     
81     public void simplify(SimplificationContext context) {
82         for(CHRLiteral literal : literals)
83             literal.simplify(context);
84     }
85
86     public void createEnforcePlan(QueryPlanningContext context, int priority) {
87         context.addPlanOp(new PreCommitOp(location));
88         for(CHRLiteral literal : literals)
89             context.claim(context, literal);
90         context.addPlanOp(new PostCommitOp(location, priority));
91     }
92     
93     public String toString() {
94         StringBuilder b = new StringBuilder();
95         ExpressionToStringVisitor visitor = new ExpressionToStringVisitor(b);
96         visitor.visit(this);
97         return b.toString();
98     }
99
100     public void collectQueryEffects(THashSet<Type> effects) {
101         for(CHRLiteral literal : literals)
102             literal.collectQueryEffects(effects);
103     }
104     
105     public void collectEnforceEffects(THashSet<Type> effects) {
106         for(CHRLiteral literal : literals)
107             literal.collectEnforceEffects(effects);
108     }
109 }