1 package org.simantics.modeling.scl;
\r
3 import static org.simantics.scl.compiler.elaboration.expressions.Expressions.externalConstant;
\r
4 import gnu.trove.map.hash.THashMap;
\r
6 import org.simantics.databoard.Bindings;
\r
7 import org.simantics.db.ReadGraph;
\r
8 import org.simantics.db.Resource;
\r
9 import org.simantics.db.exception.DatabaseException;
\r
10 import org.simantics.layer0.Layer0;
\r
11 import org.simantics.scl.compiler.common.names.Name;
\r
12 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
\r
13 import org.simantics.scl.compiler.elaboration.expressions.EApply;
\r
14 import org.simantics.scl.compiler.elaboration.expressions.EConstant;
\r
15 import org.simantics.scl.compiler.elaboration.expressions.EVariable;
\r
16 import org.simantics.scl.compiler.elaboration.expressions.Expression;
\r
17 import org.simantics.scl.compiler.elaboration.expressions.Variable;
\r
18 import org.simantics.scl.compiler.elaboration.java.CheckRelation;
\r
19 import org.simantics.scl.compiler.elaboration.query.QAtom;
\r
20 import org.simantics.scl.compiler.elaboration.query.QConjunction;
\r
21 import org.simantics.scl.compiler.elaboration.query.Query;
\r
22 import org.simantics.scl.compiler.elaboration.relations.SCLEntityType;
\r
23 import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
\r
24 import org.simantics.scl.compiler.types.Types;
\r
26 public class GraphEntityType implements SCLEntityType {
\r
29 THashMap<String, GraphAttribute> attributeMap = new THashMap<String, GraphAttribute>();
\r
31 public GraphEntityType(ReadGraph graph, Resource type) throws DatabaseException {
\r
33 Layer0 L0 = Layer0.getInstance(graph);
\r
34 for(Resource stype : graph.getSupertypes(type))
\r
35 addSupertype(graph, L0, stype);
\r
36 addSupertype(graph, L0, type);
\r
37 addRelation(graph, L0, L0.PartOf);
\r
40 private void addSupertype(ReadGraph graph, Layer0 L0, Resource type) throws DatabaseException {
\r
41 for(Resource relation : graph.getObjects(type, L0.DomainOf))
\r
42 addRelation(graph, L0, relation);
\r
45 private void addRelation(ReadGraph graph, Layer0 L0, Resource relation) throws DatabaseException {
\r
46 String relationName = (String)graph.getRelatedValue(relation, L0.HasName, Bindings.STRING);
\r
47 attributeMap.put(relationName, new GraphAttribute(OntologyModule.createRelation(graph, relation)));
\r
50 private static final Name DB_isInstanceOf = Name.create("Simantics/DB", "isInstanceOf");
\r
53 public Query generateQuery(TranslationContext context, Variable base,
\r
54 AttributeBinding[] attributeBindings) {
\r
55 Query[] queries = new Query[attributeBindings.length+1];
\r
56 for(int i=0;i<attributeBindings.length;++i) {
\r
57 AttributeBinding binding = attributeBindings[i];
\r
58 GraphAttribute attribute = (GraphAttribute)binding.attribute;
\r
59 SCLRelation relation = attribute.relation;
\r
60 queries[i] = new QAtom(relation, new EVariable(base), new EVariable(binding.variable));
\r
62 queries[attributeBindings.length] = new QAtom(CheckRelation.INSTANCE,
\r
64 new EConstant(context.getEnvironment().getValue(DB_isInstanceOf)),
\r
65 new EVariable(base),
\r
66 externalConstant(type, Types.RESOURCE)));
\r
67 return new QConjunction(queries);
\r
71 public Attribute getAttribute(String name) {
\r
72 return attributeMap.get(name);
\r
75 public static class GraphAttribute implements Attribute {
\r
76 SCLRelation relation;
\r
77 Expression[] evidence;
\r
79 public GraphAttribute(SCLRelation relation) {
\r
80 this.relation = relation;
\r