]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.graph/src/org/simantics/graph/store/StatementStore.java
Check statement collisions
[simantics/platform.git] / bundles / org.simantics.graph / src / org / simantics / graph / store / StatementStore.java
index 96b6b1c725ee61a073ac2b7cebf949ff94def4bc..cc82975c8191fe2cd980c9eaf3963fa47e49939c 100644 (file)
@@ -1,5 +1,7 @@
 package org.simantics.graph.store;\r
 \r
+import java.util.ArrayList;\r
+\r
 import gnu.trove.list.array.TIntArrayList;\r
 import gnu.trove.map.hash.TIntIntHashMap;\r
 import gnu.trove.map.hash.TIntObjectHashMap;\r
@@ -10,7 +12,7 @@ import gnu.trove.set.hash.TIntHashSet;
 \r
 /**\r
  * Statement store indexes a set of statements. \r
- * @author Hannu Niemistö\r
+ * @author Hannu Niemist\r
  */\r
 public class StatementStore implements IStore {\r
        \r
@@ -287,5 +289,54 @@ public class StatementStore implements IStore {
                        }\r
                });\r
                return statements.toArray();\r
+       }\r
+\r
+       private static class CollisionSubjectProcedure implements TIntObjectProcedure<TIntObjectHashMap<TIntArrayList>> {\r
+           CollisionPredicateProcedure predicateProcedure;\r
+\r
+           public CollisionSubjectProcedure(CollisionPredicateProcedure predicateProcedure) {\r
+               this.predicateProcedure = predicateProcedure;\r
+           }\r
+\r
+           @Override\r
+           public boolean execute(int subject, TIntObjectHashMap<TIntArrayList> predicateObjectMap) {\r
+               predicateProcedure.subject = subject;\r
+               predicateObjectMap.forEachEntry(predicateProcedure);\r
+               return true;\r
+           }\r
+\r
+       }\r
+\r
+       private static class CollisionPredicateProcedure implements TIntObjectProcedure<TIntArrayList> {\r
+        ArrayList<StatementCollision> collisions;\r
+           int subject;\r
+           \r
+           public CollisionPredicateProcedure(ArrayList<StatementCollision> collisions) {\r
+            this.collisions = collisions;\r
+        }\r
+           \r
+        @Override\r
+           public boolean execute(int predicate, TIntArrayList objects) {\r
+               if(objects.size() > 1) {\r
+                   objects.sort();\r
+                   int oldObject = objects.get(0); \r
+                   for(int i=1;i<objects.size();++i) {\r
+                       int curObject = objects.get(i);\r
+                       if(curObject == oldObject)\r
+                           collisions.add(new StatementCollision(subject, predicate, curObject));\r
+                       oldObject = curObject;\r
+                   }\r
+               }\r
+               return true;\r
+           }\r
+\r
+       }\r
+\r
+       public ArrayList<StatementCollision> getCollisions() {\r
+           ArrayList<StatementCollision> collisions = new ArrayList<StatementCollision>();\r
+           CollisionPredicateProcedure predicateProcedure = new CollisionPredicateProcedure(collisions);\r
+           CollisionSubjectProcedure subjectProcedure = new CollisionSubjectProcedure(predicateProcedure);\r
+           statements.forEachEntry(subjectProcedure);\r
+           return collisions;\r
        }       \r
 }\r