]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/planning/items/MemberPrePlanItem.java
Merge "Re-enabled Acorn transaction cancellation support for testing"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / planning / items / MemberPrePlanItem.java
1 package org.simantics.scl.compiler.elaboration.chr.planning.items;\r
2 \r
3 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
4 import org.simantics.scl.compiler.common.names.Names;\r
5 import org.simantics.scl.compiler.elaboration.chr.plan.CheckOp;\r
6 import org.simantics.scl.compiler.elaboration.chr.plan.IterateListOp;\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 \r
14 import gnu.trove.set.hash.TIntHashSet;\r
15 \r
16 public class MemberPrePlanItem extends PrePlanItem {\r
17     public Expression expression1, expression2;\r
18     public TIntHashSet variableSet1, variableSet2;\r
19 \r
20     public MemberPrePlanItem(Expression expression1, Expression expression2, TIntHashSet variableSet1, TIntHashSet variableSet2, int secondaryPriority) {\r
21         super(secondaryPriority);\r
22         this.expression1 = expression1;\r
23         this.expression2 = expression2;\r
24         this.variableSet1 = variableSet1;\r
25         this.variableSet2 = variableSet2;\r
26         updatePrimaryPriority();\r
27     }\r
28 \r
29     private void updatePrimaryPriority() {\r
30         if(variableSet2.isEmpty()) {\r
31             if(variableSet1.isEmpty())\r
32                 primaryPriority = 0;\r
33             else \r
34                 primaryPriority = 2.0;\r
35         }\r
36     }\r
37 \r
38     @Override\r
39     public void initializeListeners(QueryPlanningContext context) {\r
40         context.listen(variableSet1, this);\r
41         context.listen(variableSet2, this);\r
42     }\r
43 \r
44     @Override\r
45     public void variableSolved(QueryPlanningContext context, int variableId) {\r
46         variableSet1.remove(variableId);\r
47         variableSet2.remove(variableId);\r
48         updatePrimaryPriority();\r
49         context.priorityQueue.adjust(this);\r
50     }\r
51 \r
52     @Override\r
53     public void generate(QueryPlanningContext context) {\r
54         if(!variableSet2.isEmpty())\r
55             throw new InternalCompilerError("Unsolvable query.");\r
56         if(variableSet1.isEmpty())\r
57             context.addPlanOp(new CheckOp(location,\r
58                     new EApply(location,\r
59                             new EConstant(context.getCompilationContext().getValue(Names.Prelude_elem)),\r
60                             expression1,\r
61                             expression2)));\r
62         else\r
63             context.addPlanOp(new IterateListOp(location, ((EVariable)expression1).getVariable(), expression2));\r
64         context.bind(variableSet1);\r
65     }\r
66 }\r