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.VariableProcedure;
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 import org.simantics.scl.compiler.types.Type;
19 import gnu.trove.map.hash.TObjectIntHashMap;
20 import gnu.trove.set.hash.THashSet;
21 import gnu.trove.set.hash.TIntHashSet;
23 public class CHRQuery extends Symbol {
24 public CHRLiteral[] literals;
26 public CHRQuery(CHRLiteral[] literals) {
27 this.literals = literals;
30 public void resolve(TranslationContext context) {
31 for(CHRLiteral literal : literals)
32 literal.resolve(context);
35 public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {
36 for(CHRLiteral literal : literals)
37 literal.collectRefs(allRefs, refs);
40 public void checkType(TypingContext context) {
41 for(CHRLiteral literal : literals)
42 literal.checkType(context);
45 public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {
46 for(CHRLiteral literal : literals)
47 literal.collectVars(allVars, vars);
50 public void forVariables(VariableProcedure procedure) {
51 for(CHRLiteral literal : literals)
52 literal.forVariables(procedure);
55 public void collectFreeVariables(THashSet<Variable> vars) {
56 for(CHRLiteral literal : literals)
57 literal.collectFreeVariables(vars);
58 for(CHRLiteral literal : literals)
59 if(literal.relation == SpecialCHRRelation.ASSIGN)
60 literal.parameters[0].removeFreeVariables(vars);
63 public void setLocationDeep(long loc) {
64 if(location == Locations.NO_LOCATION) {
66 for(CHRLiteral literal : literals)
67 literal.setLocationDeep(loc);
71 public boolean createQueryPlan(QueryPlanningContext context, Expression inputFact, int activeLiteralId, CHRConstraint initConstraint) {
72 for(int i=0;i<literals.length;++i) {
73 CHRLiteral literal = literals[i];
74 if(i == activeLiteralId)
75 context.activate(literal, inputFact, i);
77 context.add(literal, i);
79 if(activeLiteralId == -1 && inputFact != null) {
80 context.addInitFact(initConstraint, inputFact);
82 return context.createQueryPlan();
85 public void simplify(SimplificationContext context) {
86 for(CHRLiteral literal : literals)
87 literal.simplify(context);
90 public void createEnforcePlan(QueryPlanningContext context, int priority) {
91 context.addPlanOp(new PreCommitOp(location));
92 for(CHRLiteral literal : literals)
93 context.claim(context, literal);
94 context.addPlanOp(new PostCommitOp(location, priority));
97 public String toString() {
98 StringBuilder b = new StringBuilder();
99 ExpressionToStringVisitor visitor = new ExpressionToStringVisitor(b);
104 public void collectQueryEffects(THashSet<Type> effects) {
105 for(CHRLiteral literal : literals)
106 literal.collectQueryEffects(effects);
109 public void collectEnforceEffects(THashSet<Type> effects) {
110 for(CHRLiteral literal : literals)
111 literal.collectEnforceEffects(effects);