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.ReplaceContext;
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;
17 import gnu.trove.map.hash.TObjectIntHashMap;
18 import gnu.trove.set.hash.TIntHashSet;
20 public class CHRQuery extends Symbol {
21 public CHRLiteral[] literals;
23 public CHRQuery(CHRLiteral[] literals) {
24 this.literals = literals;
27 public void resolve(TranslationContext context) {
28 for(CHRLiteral literal : literals)
29 literal.resolve(context);
32 public void checkType(TypingContext context) {
33 for(CHRLiteral literal : literals)
34 literal.checkType(context);
37 public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {
38 for(CHRLiteral literal : literals)
39 literal.collectVars(allVars, vars);
42 public void setLocationDeep(long loc) {
43 if(location == Locations.NO_LOCATION) {
45 for(CHRLiteral literal : literals)
46 literal.setLocationDeep(loc);
50 public boolean createQueryPlan(QueryPlanningContext context, Expression inputFact, int activeLiteralId, CHRConstraint initConstraint) {
51 for(int i=0;i<literals.length;++i) {
52 CHRLiteral literal = literals[i];
53 if(i == activeLiteralId)
54 context.activate(literal, inputFact, i);
56 context.add(literal, i);
58 if(activeLiteralId == -1 && inputFact != null) {
59 context.addInitFact(initConstraint, inputFact);
61 return context.createQueryPlan();
64 public void simplify(SimplificationContext context) {
65 for(CHRLiteral literal : literals)
66 literal.simplify(context);
69 public void createEnforcePlan(QueryPlanningContext context, int priority) {
70 context.addPlanOp(new PreCommitOp(location));
71 for(CHRLiteral literal : literals)
72 context.claim(context, literal);
73 context.addPlanOp(new PostCommitOp(location, priority));
76 public String toString() {
77 StringBuilder b = new StringBuilder();
78 ExpressionToStringVisitor visitor = new ExpressionToStringVisitor(b);
83 public CHRQuery replace(ReplaceContext context) {
84 CHRLiteral[] newLiterals = new CHRLiteral[literals.length];
85 for(int i=0;i<literals.length;++i)
86 newLiterals[i] = literals[i].replace(context);
87 return new CHRQuery(newLiterals);