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.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;
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 forVariables(VariableProcedure procedure) {
50 for(CHRLiteral literal : literals)
51 literal.forVariables(procedure);
54 public void collectFreeVariables(THashSet<Variable> vars) {
55 for(CHRLiteral literal : literals)
56 literal.collectFreeVariables(vars);
59 public void setLocationDeep(long loc) {
60 if(location == Locations.NO_LOCATION) {
62 for(CHRLiteral literal : literals)
63 literal.setLocationDeep(loc);
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);
73 context.add(literal, i);
75 if(activeLiteralId == -1 && inputFact != null) {
76 context.addInitFact(initConstraint, inputFact);
78 return context.createQueryPlan();
81 public void simplify(SimplificationContext context) {
82 for(CHRLiteral literal : literals)
83 literal.simplify(context);
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));
93 public String toString() {
94 StringBuilder b = new StringBuilder();
95 ExpressionToStringVisitor visitor = new ExpressionToStringVisitor(b);
100 public void collectQueryEffects(THashSet<Type> effects) {
101 for(CHRLiteral literal : literals)
102 literal.collectQueryEffects(effects);
105 public void collectEnforceEffects(THashSet<Type> effects) {
106 for(CHRLiteral literal : literals)
107 literal.collectEnforceEffects(effects);