]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/procedures/ConvertPreValues.java
ca1588ff079993835939446c3f7ba50ef1f729d9
[simantics/platform.git] / bundles / org.simantics.graph.compiler / src / org / simantics / graph / compiler / internal / procedures / ConvertPreValues.java
1 package org.simantics.graph.compiler.internal.procedures;\r
2 \r
3 import gnu.trove.list.array.TIntArrayList;\r
4 import gnu.trove.map.hash.TIntObjectHashMap;\r
5 \r
6 import java.util.Collection;\r
7 \r
8 import org.simantics.databoard.Bindings;\r
9 import org.simantics.databoard.binding.Binding;\r
10 import org.simantics.databoard.type.Datatype;\r
11 import org.simantics.graph.compiler.internal.store.PreValueStore;\r
12 import org.simantics.graph.query.IDataTypeQuery;\r
13 import org.simantics.graph.query.IGraph;\r
14 import org.simantics.graph.query.Paths;\r
15 import org.simantics.graph.store.GraphStore;\r
16 import org.simantics.graph.store.StatementStore;\r
17 import org.simantics.graph.store.ValueStore;\r
18 import org.simantics.ltk.Problem;\r
19 \r
20 public class ConvertPreValues implements Runnable {\r
21 \r
22         IGraph cg;\r
23         GraphStore store;\r
24         Collection<Problem> problems;\r
25         \r
26         public ConvertPreValues(IGraph cg, GraphStore store,\r
27                         Collection<Problem> problems) {\r
28                 this.cg = cg;\r
29                 this.store = store;\r
30                 this.problems = problems;\r
31         }\r
32 \r
33         @Override\r
34         public void run() {\r
35                 PreValueStore preValues = store.getStore(PreValueStore.class);\r
36                 preValues.convertPreValues(store.values, new IDataTypeQuery() { \r
37                         \r
38                     Paths paths = cg.getPaths();\r
39                         StatementStore statements = store.statements;\r
40                         ValueStore values = store.values;\r
41                         int HasDatatype = store.identities.createPathToId(paths.HasDatatype);\r
42                         int InstanceOf = store.identities.createPathToId(paths.InstanceOf);\r
43                         \r
44                         @Override\r
45                         public Binding getDataType(int id) {\r
46                                 TIntArrayList objects = statements.getObjects(id, HasDatatype);\r
47                                 if(objects.isEmpty()) {\r
48                                         objects = statements.getObjects(id, InstanceOf);\r
49                                         for(int i=0;i<objects.size();++i) {\r
50                                                 int type = objects.getQuick(i);\r
51                                                 Binding binding = getDatatypeForType(type);\r
52                                                 if(binding != null)\r
53                                                         return binding;\r
54                                         }\r
55                                         return null;\r
56                                 }\r
57                                 else {\r
58                                         Datatype dt = values.getDatatypeValue(objects.getQuick(0));\r
59                                         if(dt == null)\r
60                                                 return null;\r
61                                         else\r
62                                                 return Bindings.getBinding(dt);\r
63                                 }                               \r
64                         }\r
65 \r
66                         TIntObjectHashMap<Binding> typeBindingCache = new TIntObjectHashMap<Binding>();\r
67                         private Binding getDatatypeForType(int type) {\r
68                                 if(typeBindingCache.containsKey(type))\r
69                                         return typeBindingCache.get(type);\r
70                                 else {\r
71                                         Datatype dt = cg.getAssertedDatatype(store.idToRes(type));\r
72                                         Binding binding = dt == null ? null : Bindings.getBinding(dt);\r
73                                         typeBindingCache.put(type, binding);\r
74                                         return binding;\r
75                                 }                               \r
76                         }\r
77                 }, problems);\r
78         }       \r
79 \r
80 }\r