1 package org.simantics.scl.compiler.elaboration.chr;
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.chr.relations.SpecialCHRRelation;
8 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
9 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
10 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
11 import org.simantics.scl.compiler.elaboration.expressions.Expression;
12 import org.simantics.scl.compiler.elaboration.expressions.Variable;
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;
18 import gnu.trove.map.hash.TObjectIntHashMap;
19 import gnu.trove.set.hash.THashSet;
20 import gnu.trove.set.hash.TIntHashSet;
22 public class CHRQuery extends Symbol {
23 public CHRLiteral[] literals;
25 public CHRQuery(CHRLiteral[] literals) {
26 this.literals = literals;
29 public void resolve(TranslationContext context) {
30 for(CHRLiteral literal : literals)
31 literal.resolve(context);
34 public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {
35 for(CHRLiteral literal : literals)
36 literal.collectRefs(allRefs, refs);
39 public void checkType(TypingContext context) {
40 for(CHRLiteral literal : literals)
41 literal.checkType(context);
44 public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {
45 for(CHRLiteral literal : literals)
46 literal.collectVars(allVars, vars);
49 public void collectFreeVariables(THashSet<Variable> vars) {
50 for(CHRLiteral literal : literals)
51 literal.collectFreeVariables(vars);
52 for(CHRLiteral literal : literals)
53 if(literal.relation == SpecialCHRRelation.ASSIGN)
54 literal.parameters[0].removeFreeVariables(vars);
57 public void setLocationDeep(long loc) {
58 if(location == Locations.NO_LOCATION) {
60 for(CHRLiteral literal : literals)
61 literal.setLocationDeep(loc);
65 public boolean createQueryPlan(QueryPlanningContext context, Expression inputFact, int activeLiteralId, CHRConstraint initConstraint) {
66 for(int i=0;i<literals.length;++i) {
67 CHRLiteral literal = literals[i];
68 if(i == activeLiteralId)
69 context.activate(literal, inputFact, i);
71 context.add(literal, i);
73 if(activeLiteralId == -1 && inputFact != null) {
74 context.addInitFact(initConstraint, inputFact);
76 return context.createQueryPlan();
79 public void simplify(SimplificationContext context) {
80 for(CHRLiteral literal : literals)
81 literal.simplify(context);
84 public void createEnforcePlan(QueryPlanningContext context, int priority) {
85 context.addPlanOp(new PreCommitOp(location));
86 for(CHRLiteral literal : literals)
87 context.claim(context, literal);
88 context.addPlanOp(new PostCommitOp(location, priority));
91 public String toString() {
92 StringBuilder b = new StringBuilder();
93 ExpressionToStringVisitor visitor = new ExpressionToStringVisitor(b);
98 public void collectQueryEffects(THashSet<Type> effects) {
99 for(CHRLiteral literal : literals)
100 literal.collectQueryEffects(effects);
103 public void collectEnforceEffects(THashSet<Type> effects) {
104 for(CHRLiteral literal : literals)
105 literal.collectEnforceEffects(effects);