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
\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
}\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
+ int collisionCount = 1;\r
+ for(int i=1;i<objects.size();++i) {\r
+ int curObject = objects.get(i);\r
+ if(curObject == oldObject) {\r
+ ++collisionCount;\r
+ }\r
+ else {\r
+ if(collisionCount > 1) {\r
+ collisions.add(new StatementCollision(subject, predicate, oldObject, collisionCount));\r
+ collisionCount = 1;\r
+ }\r
+ oldObject = curObject;\r
+ }\r
+ }\r
+ if(collisionCount > 1)\r
+ collisions.add(new StatementCollision(subject, predicate, oldObject, collisionCount));\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