1 package org.simantics.scl.compiler.elaboration.chr;
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;
18 import gnu.trove.map.hash.TObjectIntHashMap;
19 import gnu.trove.set.hash.TIntHashSet;
21 public class CHRQuery extends Symbol {
22 public CHRLiteral[] literals;
24 public CHRQuery(long location, CHRLiteral[] literals) {
25 this.literals = literals;
26 this.location = location;
29 public void resolve(TranslationContext context) {
30 for(CHRLiteral literal : literals)
31 literal.resolve(context);
34 public void checkType(TypingContext context) {
35 for(CHRLiteral literal : literals)
36 literal.checkType(context);
39 public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {
40 for(CHRLiteral literal : literals)
41 literal.collectVars(allVars, vars);
44 public void setLocationDeep(long loc) {
45 if(location == Locations.NO_LOCATION) {
47 for(CHRLiteral literal : literals)
48 literal.setLocationDeep(loc);
52 public boolean createQueryPlan(QueryPlanningContext context, Expression inputFact, int activeLiteralId, CHRConstraint initConstraint) {
54 for(int i=0;i<literals.length;++i) {
55 CHRLiteral literal = literals[i];
56 if(i == activeLiteralId)
57 context.activate(literal, inputFact, i);
59 context.add(literal, i);
61 if(activeLiteralId == -1 && inputFact != null) {
62 context.addInitFact(initConstraint, inputFact);
64 return context.createQueryPlan();
65 } catch(Exception e) {
66 throw InternalCompilerError.injectLocation(location, e);
70 public void simplify(SimplificationContext context) {
71 for(CHRLiteral literal : literals)
72 literal.simplify(context);
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));
82 public String toString() {
83 StringBuilder b = new StringBuilder();
84 ExpressionToStringVisitor visitor = new ExpressionToStringVisitor(b);
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);