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