]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/compilation/RelationConstraint.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / query / compilation / RelationConstraint.java
1 package org.simantics.scl.compiler.elaboration.query.compilation;
2
3 import org.simantics.scl.compiler.elaboration.expressions.EVariable;
4 import org.simantics.scl.compiler.elaboration.expressions.Variable;
5 import org.simantics.scl.compiler.elaboration.query.QAtom;
6
7 public class RelationConstraint extends QueryConstraint {
8
9     // static
10     QAtom atom;
11     
12     int[] optionalVariableByParameter;
13     Variable[] parameters;
14
15     long requiredVariablesMask;
16     
17     public RelationConstraint(int[] variables, Variable[] parameters, QAtom atom, int[] optionalVariableByParameter,
18             long requiredVariablesMask) {
19         super(variables);
20         this.atom = atom;
21         this.parameters = parameters;
22         this.optionalVariableByParameter = optionalVariableByParameter;
23         this.requiredVariablesMask = requiredVariablesMask;
24     }
25
26     @Override
27     public boolean canBeSolvedFrom(long boundVariables) {
28         return getSolutionBranching(boundVariables) != Double.POSITIVE_INFINITY;
29     }
30     
31     @Override
32     public double getSolutionBranching(long boundVariables) {
33         if( (boundVariables&requiredVariablesMask) != requiredVariablesMask )
34             return Double.POSITIVE_INFINITY;        
35         return atom.relation.getSelectivity(getLocalBoundVariables(boundVariables));
36     }
37     
38     @Override
39     public double getSolutionCost(long boundVariables) {
40         return 1.0;
41     }
42     
43     @Override
44     public void generate(QueryCompilationContext context) {
45         atom.relation.generate(atom.location, 
46                 context, atom.typeParameters,
47                 parameters, getLocalBoundVariables(finalBoundVariables));
48         for(int i=atom.parameters.length-1;i>=0;--i)
49             if(optionalVariableByParameter[i] < 0 && !(atom.parameters[i] instanceof EVariable))
50                 context.let(parameters[i], atom.parameters[i]);
51     }
52     
53     private int getLocalBoundVariables(long boundVariables) {
54         int localBoundVariables = 0;
55         for(int i=0;i<optionalVariableByParameter.length;++i) {
56             int v = optionalVariableByParameter[i]; 
57             if(v < 0 || ((boundVariables >> v)&1) != 0)
58                 localBoundVariables |= 1 << i;
59         }
60         return localBoundVariables;
61     }
62     
63     @Override
64     public String toString() {
65         return atom.toString();
66     }
67 }