]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/procedures/MergeEqualResources.java
17ebec994908180caf0f0f8468745b45ff4f98bd
[simantics/platform.git] / bundles / org.simantics.graph.compiler / src / org / simantics / graph / compiler / internal / procedures / MergeEqualResources.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.TIntIntHashMap;\r
5 \r
6 import org.simantics.graph.query.Paths;\r
7 import org.simantics.graph.store.GraphStore;\r
8 import org.simantics.graph.store.IdentityStore;\r
9 \r
10 public class MergeEqualResources implements Runnable {\r
11 \r
12         GraphStore store;\r
13         Paths paths;\r
14                 \r
15         public MergeEqualResources(Paths paths, GraphStore store) {\r
16             this.paths = paths;\r
17                 this.store = store;\r
18         }\r
19 \r
20         @Override\r
21         public void run() {\r
22                 IdentityStore identities = store.identities;\r
23                 if(identities.contains(paths.Equals)) {\r
24                         int equalsId = identities.pathToId(paths.Equals);\r
25                         identities.removeIdentity(equalsId);\r
26                         TIntArrayList rel = store.statements.extractRelation(equalsId);\r
27                         for(int i=0;i<rel.size();i+=2)\r
28                                 identities.unify(rel.get(i), rel.get(i+1));\r
29                 }\r
30                 \r
31                 TIntIntHashMap map = identities.extractUnifications();\r
32                 do {\r
33                         store.map(map);                 \r
34                         map = identities.extractUnifications();\r
35                 } while(!map.isEmpty());\r
36         }       \r
37 \r
38 }\r