]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/scl/ontologymodule/GraphEntityType.java
Trying to wait for procedures
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / scl / ontologymodule / GraphEntityType.java
1 package org.simantics.modeling.scl.ontologymodule;
2
3 import static org.simantics.scl.compiler.elaboration.expressions.Expressions.externalConstant;
4 import gnu.trove.map.hash.THashMap;
5
6 import org.simantics.databoard.Bindings;
7 import org.simantics.db.ReadGraph;
8 import org.simantics.db.Resource;
9 import org.simantics.db.exception.DatabaseException;
10 import org.simantics.layer0.Layer0;
11 import org.simantics.scl.compiler.common.names.Name;
12 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
13 import org.simantics.scl.compiler.elaboration.expressions.EApply;
14 import org.simantics.scl.compiler.elaboration.expressions.EConstant;
15 import org.simantics.scl.compiler.elaboration.expressions.EVariable;
16 import org.simantics.scl.compiler.elaboration.expressions.Expression;
17 import org.simantics.scl.compiler.elaboration.expressions.Variable;
18 import org.simantics.scl.compiler.elaboration.java.CheckRelation;
19 import org.simantics.scl.compiler.elaboration.query.QAtom;
20 import org.simantics.scl.compiler.elaboration.query.QConjunction;
21 import org.simantics.scl.compiler.elaboration.query.Query;
22 import org.simantics.scl.compiler.elaboration.relations.SCLEntityType;
23 import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
24 import org.simantics.scl.compiler.types.Types;
25
26 public class GraphEntityType implements SCLEntityType {
27
28     Resource type;
29     THashMap<String, GraphAttribute> attributeMap = new THashMap<String, GraphAttribute>(); 
30     
31     public GraphEntityType(ReadGraph graph, Resource type) throws DatabaseException {
32         this.type = type;
33         Layer0 L0 = Layer0.getInstance(graph);
34         for(Resource stype : graph.getSupertypes(type))
35             addSupertype(graph, L0, stype);
36         addSupertype(graph, L0, type);
37         addRelation(graph, L0, L0.PartOf);
38     }
39     
40     private void addSupertype(ReadGraph graph, Layer0 L0, Resource type) throws DatabaseException {
41         for(Resource relation : graph.getObjects(type, L0.DomainOf))
42             addRelation(graph, L0, relation);
43     }
44     
45     private void addRelation(ReadGraph graph, Layer0 L0, Resource relation) throws DatabaseException {
46         String relationName = (String)graph.getRelatedValue(relation, L0.HasName, Bindings.STRING);
47         attributeMap.put(relationName, new GraphAttribute(OntologyModule.createRelation(graph, relation)));
48     }
49
50     private static final Name DB_isInstanceOf = Name.create("Simantics/DB", "isInstanceOf");
51     
52     @Override
53     public Query generateQuery(TranslationContext context, Variable base,
54             AttributeBinding[] attributeBindings) {
55         Query[] queries = new Query[attributeBindings.length+1];
56         for(int i=0;i<attributeBindings.length;++i) {
57             AttributeBinding binding = attributeBindings[i];
58             GraphAttribute attribute = (GraphAttribute)binding.attribute;
59             SCLRelation relation = attribute.relation;
60             queries[i] = new QAtom(relation, new EVariable(base), new EVariable(binding.variable));
61         }
62         queries[attributeBindings.length] = new QAtom(CheckRelation.INSTANCE,
63                 new EApply(
64                         new EConstant(context.getEnvironment().getValue(DB_isInstanceOf)),
65                         new EVariable(base),
66                         externalConstant(type, Types.RESOURCE)));
67         return new QConjunction(queries);
68     }
69
70     @Override
71     public Attribute getAttribute(String name) {
72         return attributeMap.get(name);
73     }
74     
75     public static class GraphAttribute implements Attribute {
76         SCLRelation relation;
77         Expression[] evidence;
78
79         public GraphAttribute(SCLRelation relation) {
80             this.relation = relation;
81         }
82     }
83
84 }