1 package org.simantics.scl.compiler.elaboration.query.compilation;
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;
7 public class RelationConstraint extends QueryConstraint {
12 int[] optionalVariableByParameter;
13 Variable[] parameters;
15 long requiredVariablesMask;
17 public RelationConstraint(int[] variables, Variable[] parameters, QAtom atom, int[] optionalVariableByParameter,
18 long requiredVariablesMask) {
21 this.parameters = parameters;
22 this.optionalVariableByParameter = optionalVariableByParameter;
23 this.requiredVariablesMask = requiredVariablesMask;
27 public boolean canBeSolvedFrom(long boundVariables) {
28 return getSolutionBranching(boundVariables) != Double.POSITIVE_INFINITY;
32 public double getSolutionBranching(long boundVariables) {
33 if( (boundVariables&requiredVariablesMask) != requiredVariablesMask )
34 return Double.POSITIVE_INFINITY;
35 return atom.relation.getSelectivity(getLocalBoundVariables(boundVariables));
39 public double getSolutionCost(long boundVariables) {
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]);
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;
60 return localBoundVariables;
64 public String toString() {
65 return atom.toString();