1 package org.simantics.modeling.scl;
\r
3 import org.simantics.db.Resource;
\r
4 import org.simantics.scl.compiler.common.names.Name;
\r
5 import org.simantics.scl.compiler.elaboration.expressions.EApply;
\r
6 import org.simantics.scl.compiler.elaboration.expressions.EExternalConstant;
\r
7 import org.simantics.scl.compiler.elaboration.expressions.EVariable;
\r
8 import org.simantics.scl.compiler.elaboration.expressions.Expression;
\r
9 import org.simantics.scl.compiler.elaboration.expressions.Variable;
\r
10 import org.simantics.scl.compiler.elaboration.query.compilation.EnforcingContext;
\r
11 import org.simantics.scl.compiler.elaboration.query.compilation.QueryCompilationContext;
\r
12 import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
\r
13 import org.simantics.scl.compiler.errors.Locations;
\r
14 import org.simantics.scl.compiler.types.TVar;
\r
15 import org.simantics.scl.compiler.types.Type;
\r
16 import org.simantics.scl.compiler.types.Types;
\r
18 public class GraphRelation implements SCLRelation {
\r
21 double relationSelectivity;
\r
22 Resource inverseRelation;
\r
23 double inverseRelationSelectivity;
\r
25 public GraphRelation(Resource relation, double relationSelectivity,
\r
26 Resource inverseRelation, double inverseRelationSelectivity) {
\r
27 this.relation = relation;
\r
28 this.relationSelectivity = relationSelectivity;
\r
29 this.inverseRelation = inverseRelation;
\r
30 this.inverseRelationSelectivity = inverseRelationSelectivity;
\r
34 public TVar[] getTypeVariables() {
\r
35 return TVar.EMPTY_ARRAY;
\r
38 private static final Type[] PARAMETER_TYPES = new Type[] { Types.RESOURCE, Types.RESOURCE };
\r
41 public Type[] getParameterTypes() {
\r
42 return PARAMETER_TYPES;
\r
46 public double getSelectivity(int boundVariables) {
\r
47 switch(boundVariables) {
\r
48 case FF: return Double.POSITIVE_INFINITY;
\r
49 case BF: return relationSelectivity;
\r
50 case FB: return inverseRelation == null ? Double.POSITIVE_INFINITY : inverseRelationSelectivity;
\r
51 case BB: return 0.1;
\r
52 default: throw new IllegalArgumentException();
\r
57 public int getRequiredVariablesMask() {
\r
58 return inverseRelation == null ? BF : FF;
\r
61 private static final Name GET_OBJECTS = Name.create("Simantics/DB", "#");
\r
62 private static final Name HAS_STATEMENT = Name.create("Simantics/DB", "existsStatement3");
\r
65 public void generate(long location, QueryCompilationContext context,
\r
66 Type[] typeParameters, Variable[] parameters, int boundVariables) {
\r
67 switch(boundVariables) {
\r
69 context.iterateList(parameters[1], new EApply(
\r
70 Locations.NO_LOCATION,
\r
72 context.getTypingContext().getConstant(GET_OBJECTS),
\r
73 new EVariable(parameters[0]),
\r
74 new EExternalConstant(relation, Types.RESOURCE)
\r
78 if(inverseRelation == null)
\r
79 throw new IllegalArgumentException();
\r
80 context.iterateList(parameters[0], new EApply(
\r
81 Locations.NO_LOCATION,
\r
83 context.getTypingContext().getConstant(GET_OBJECTS),
\r
84 new EVariable(parameters[1]),
\r
85 new EExternalConstant(inverseRelation, Types.RESOURCE)
\r
90 inverseRelation == null || relationSelectivity <= inverseRelationSelectivity
\r
92 Locations.NO_LOCATION,
\r
94 context.getTypingContext().getConstant(HAS_STATEMENT),
\r
96 new EVariable(parameters[0]),
\r
97 new EExternalConstant(relation, Types.RESOURCE),
\r
98 new EVariable(parameters[1])
\r
102 Locations.NO_LOCATION,
\r
104 context.getTypingContext().getConstant(HAS_STATEMENT),
\r
106 new EVariable(parameters[1]),
\r
107 new EExternalConstant(inverseRelation, Types.RESOURCE),
\r
108 new EVariable(parameters[0])
\r
112 default: throw new IllegalArgumentException();
\r
116 private static final Name CLAIM = Name.create("Simantics/DB", "claim");
\r
119 public Expression generateEnforce(long location, EnforcingContext context,
\r
120 Type[] typeParameters, Variable[] parameters) {
\r
122 Locations.NO_LOCATION,
\r
124 context.getTypingContext().getConstant(CLAIM),
\r
125 new EVariable(parameters[0]),
\r
126 new EExternalConstant(relation, Types.RESOURCE),
\r
127 new EVariable(parameters[1])
\r
132 public int getPhase() {
\r