1 package org.simantics.scl.compiler.elaboration.chr.planning.items;
\r
3 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
\r
4 import org.simantics.scl.compiler.elaboration.chr.plan.AssignOp;
\r
5 import org.simantics.scl.compiler.elaboration.chr.plan.CheckOp;
\r
6 import org.simantics.scl.compiler.elaboration.chr.plan.MatchOp;
\r
7 import org.simantics.scl.compiler.elaboration.chr.planning.PrePlanItem;
\r
8 import org.simantics.scl.compiler.elaboration.chr.planning.QueryPlanningContext;
\r
9 import org.simantics.scl.compiler.elaboration.expressions.EApply;
\r
10 import org.simantics.scl.compiler.elaboration.expressions.EConstant;
\r
11 import org.simantics.scl.compiler.elaboration.expressions.EVariable;
\r
12 import org.simantics.scl.compiler.elaboration.expressions.Expression;
\r
13 import org.simantics.scl.compiler.elaboration.expressions.Variable;
\r
14 import org.simantics.scl.compiler.elaboration.java.Builtins;
\r
16 import gnu.trove.set.hash.TIntHashSet;
\r
18 public class EqualsPrePlanItem extends PrePlanItem {
\r
19 public Expression expression1, expression2;
\r
20 public TIntHashSet variableSet1, variableSet2;
\r
22 public EqualsPrePlanItem(Expression expression1, Expression expression2, TIntHashSet variableSet1, TIntHashSet variableSet2, int secondaryPriority) {
\r
23 super(secondaryPriority);
\r
24 this.expression1 = expression1;
\r
25 this.expression2 = expression2;
\r
26 this.variableSet1 = variableSet1;
\r
27 this.variableSet2 = variableSet2;
\r
28 updatePrimaryPriority();
\r
31 private void updatePrimaryPriority() {
\r
32 if(variableSet2.isEmpty()) {
\r
33 if(variableSet1.isEmpty())
\r
34 primaryPriority = 0;
\r
36 primaryPriority = 1;
\r
39 if(variableSet1.isEmpty() && expression2.isPattern(0))
\r
40 primaryPriority = 0.0;
\r
45 public void initializeListeners(QueryPlanningContext context) {
\r
46 context.listen(variableSet1, this);
\r
47 context.listen(variableSet2, this);
\r
51 public void variableSolved(QueryPlanningContext context, int variableId) {
\r
52 variableSet1.remove(variableId);
\r
53 variableSet2.remove(variableId);
\r
54 updatePrimaryPriority();
\r
55 context.priorityQueue.adjust(this);
\r
59 public void generate(QueryPlanningContext context) {
\r
60 if(variableSet1.isEmpty() && variableSet2.isEmpty()) {
\r
61 context.addPlanOp(new CheckOp(location, new EApply(location, new EConstant(Builtins.EQUALS, expression1.getType()), expression1, expression2)));
\r
63 else if(variableSet2.isEmpty()) {
\r
64 Variable variable = ((EVariable)expression1).getVariable();
\r
65 context.addPlanOp(new AssignOp(location, variable, expression2));
\r
66 context.bind(variableSet1);
\r
68 else if(variableSet1.isEmpty()) {
\r
69 if(expression2 instanceof EVariable) {
\r
70 Variable variable = ((EVariable)expression2).getVariable();
\r
71 context.addPlanOp(new AssignOp(location, variable, expression1));
\r
74 context.addPlanOp(new MatchOp(location, expression1, expression2));
\r
76 context.bind(variableSet2);
\r
79 throw new InternalCompilerError("Unsolvable query.");
\r