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.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
14 import gnu.trove.set.hash.TIntHashSet;
\r
16 public class MemberPrePlanItem extends PrePlanItem {
\r
17 public Expression expression1, expression2;
\r
18 public TIntHashSet variableSet1, variableSet2;
\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
29 private void updatePrimaryPriority() {
\r
30 if(variableSet2.isEmpty()) {
\r
31 if(variableSet1.isEmpty())
\r
32 primaryPriority = 0;
\r
34 primaryPriority = 2.0;
\r
39 public void initializeListeners(QueryPlanningContext context) {
\r
40 context.listen(variableSet1, this);
\r
41 context.listen(variableSet2, this);
\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
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
63 context.addPlanOp(new IterateListOp(location, ((EVariable)expression1).getVariable(), expression2));
\r
64 context.bind(variableSet1);
\r