]> gerrit.simantics Code Review - simantics/interop.git/commitdiff
Comparator failed to process some of the statements when subject and object were...
authorluukkainen <luukkainen@ac1ea38d-2e2b-0410-8846-a27921b304fc>
Mon, 24 Oct 2011 11:30:56 +0000 (11:30 +0000)
committerMarko Luukkainen <marko.luukkainen@vtt.fi>
Thu, 2 Feb 2017 09:22:17 +0000 (11:22 +0200)
git-svn-id: https://www.simantics.org/svn/simantics/interoperability/trunk@22927 ac1ea38d-2e2b-0410-8846-a27921b304fc

org.simantics.interop/src/org/simantics/interop/test/GraphComparator.java

index 8fd1ae40ed5dc3c32f6893dfd7900a3fe9eb1315..82b7bfbb2a136177db43fcc08a5dbb3faf20b817 100644 (file)
@@ -187,8 +187,11 @@ public class GraphComparator {
                        if (objectsLeft.isEmpty())\r
                                break;\r
                        \r
+                       \r
                        // process compares objects that are identified and searches for more resources to process. \r
                        process(objectsLeft, objectsRight, unreliableLeft, unreliableRight);\r
+                       // process unreliable handles cases where unidentified statements subject and object have been identified \r
+                       processUnreliable(unreliableLeft, unreliableRight);\r
                        // process unreliable handles cases where unidentified resources have path of length one to identified resource\r
                        processUnreliable(unreliableLeft, unreliableRight,objectsLeft,objectsRight);\r
                        if (objectsLeft.isEmpty() && unreliableLeft.size() > 0 && unreliableRight.size() > 0) {\r
@@ -217,11 +220,17 @@ public class GraphComparator {
                while (!objectsLeft.isEmpty()) {\r
                        Resource r1 = objectsLeft.pop();\r
                        Resource r2 = objectsRight.pop();\r
+                       \r
+                       if (r1.equals(r2))\r
+                               continue;\r
                \r
                        if (comparableResources.contains(r1, r2)) {\r
                                //System.out.println("already tested " + NameUtils.getSafeName(g, r1) + " " + NameUtils.getSafeName(g, r2));\r
                                continue;\r
                        }\r
+                       if (comparableResources.containsLeft(r1) || comparableResources.containsRight(r2)) {\r
+                               throw new DatabaseException("Comparator error: Trying to map " + r1 + " to " + r2 + " while mappings " + r1 + " to " + comparableResources.getRight(r1) + " and " + comparableResources.getLeft(r2) + " to " + r2 + " exist.");\r
+                       }\r
                        comparableResources.map(r1, r2);\r
                        \r
                        //System.out.println("test " + NameUtils.getSafeName(g, r1) + " " + NameUtils.getSafeName(g, r2));\r
@@ -254,6 +263,50 @@ public class GraphComparator {
                        }\r
                }\r
        }\r
+       \r
+       private void processUnreliable(Set<Statement> unreliableLeft, Set<Statement> unreliableRight) {\r
+               MapList<Resource,Statement> subjectLeft = new MapList<Resource, Statement>();\r
+               MapList<Resource,Statement> subjectRight = new MapList<Resource, Statement>();\r
+               MapList<Resource,Statement> objectLeft = new MapList<Resource, Statement>();\r
+               MapList<Resource,Statement> objectRight = new MapList<Resource, Statement>();\r
+               \r
+               for (Statement s : unreliableLeft) {\r
+                       subjectLeft.add(s.getSubject(),s);\r
+                       objectLeft.add(s.getObject(),s);\r
+               }\r
+               for (Statement s : unreliableRight) {\r
+                       subjectRight.add(s.getSubject(),s);\r
+                       objectRight.add(s.getObject(),s);\r
+               }\r
+               \r
+               for (Resource left : subjectLeft.getKeys()) {\r
+                       if (!comparableResources.containsLeft(left))\r
+                               continue;\r
+                       Resource right = comparableResources.getRight(left);\r
+                       for (Statement leftS : subjectLeft.getValues(left)) {\r
+                               Resource leftO = leftS.getObject();\r
+                               if (!comparableResources.containsLeft(leftO)) \r
+                                       continue;\r
+                               if (!unreliableLeft.contains(leftS))\r
+                                       continue;\r
+                               Resource rightO = comparableResources.getRight(leftO);\r
+                               for (Statement rightS : subjectRight.getValues(right)) {\r
+                                       if (!rightS.getObject().equals(rightO))\r
+                                               continue;\r
+                                       if (!unreliableRight.contains(rightS))\r
+                                               continue;\r
+                                       if (leftS.getPredicate().equals(rightS.getPredicate()) ||\r
+                                               comparableResources.contains(leftS.getPredicate(), rightS.getPredicate())) {\r
+                                               unreliableLeft.remove(leftS);\r
+                                               unreliableRight.remove(rightS);\r
+                                               comparableStatements.map(leftS, rightS);\r
+                                       }\r
+                               }\r
+                       }\r
+                       \r
+               }\r
+       }\r
+       \r
        private void processUnreliable(Set<Statement> unreliableLeft, Set<Statement> unreliableRight, Stack<Resource> objectsLeft, Stack<Resource> objectsRight) {\r
                MapList<Resource,Statement> subjectLeft = new MapList<Resource, Statement>();\r
                MapList<Resource,Statement> subjectRight = new MapList<Resource, Statement>();\r
@@ -354,9 +407,11 @@ public class GraphComparator {
                                objectsRight.add(or);\r
                                for (int l = 0; l < left.size(); l++) {\r
                                        int r = indices.first[l];\r
-                                       comparableStatements.map(left.get(l), right.get(r));\r
-                                       unreliableLeft.remove(left.get(l));\r
-                                       unreliableRight.remove(right.get(r));\r
+                                       Statement sl = left.get(l);\r
+                                       Statement sr = right.get(r);\r
+                                       addComparable(sl, sr, true);\r
+                                       unreliableLeft.remove(sl);\r
+                                       unreliableRight.remove(sr);\r
                                }\r
                                \r
                        }\r
@@ -490,6 +545,13 @@ public class GraphComparator {
                return new GraphChanges(r1,r2,changes1,changes2,modifications,comparableResources);\r
        }\r
        \r
+       private void addComparable(Statement left, Statement right, boolean process) {\r
+               comparableStatements.map(left, right);\r
+               if (!process) {\r
+                       comparableResources.map(left.getObject(), right.getObject());\r
+               }\r
+       }\r
+       \r
        public List<Statement> filterAsserted(Resource r, Collection<Statement> in) throws ServiceException {\r
                List<Statement> out = new ArrayList<Statement>();\r
                for (Statement s : in) {\r
@@ -499,7 +561,7 @@ public class GraphComparator {
                }\r
                return out;\r
        }\r
-       \r
+\r
        private String printStatement(ReadGraph graph, Statement s) throws ValidationException, ServiceException {\r
                return NameUtils.getSafeName(graph, s.getSubject()) + " " + NameUtils.getSafeName(graph, s.getPredicate()) + " " + NameUtils.getSafeName(graph, s.getObject());\r
        }\r
@@ -702,6 +764,8 @@ public class GraphComparator {
        }\r
 \r
        private int compareObject(Resource o1, Resource o2) throws DatabaseException {\r
+               if (o1.equals(o2))\r
+                       return -1;\r
                if (comparableResources.contains(o1, o2))\r
                        return (-1);\r
                if (comparableResources.containsLeft(o1))\r
@@ -778,8 +842,7 @@ public class GraphComparator {
                                                                objectsLeft.add(s1.getObject());\r
                                                                objectsRight.add(s2.getObject());\r
                                                        } \r
-                                                       comparableStatements.map(s1, s2);\r
-                                                       //comparableResources.map(s1.getObject(), s2.getObject());\r
+                                                       addComparable(s1, s2, true);\r
                                                        break;\r
                                                }\r
                                        }\r
@@ -890,16 +953,14 @@ public class GraphComparator {
                                                        boolean eq = compareValue(v1, v2);\r
                                                        if (!eq) {\r
                                                                addModification(s1, s2);\r
-                                                               comparableStatements.map(s1, s2);\r
-                                                               comparableResources.map(s1.getObject(),s2.getObject());\r
+                                                               addComparable(s1, s2, false);\r
                                                        }\r
                                                } else {\r
                                                        compareProps(s1.getObject(), s2.getObject());\r
                                                }\r
                                        } else {\r
                                                addModification(s1, s2);\r
-                                               comparableStatements.map(s1, s2);\r
-                                               comparableResources.map(s1.getObject(),s2.getObject());\r
+                                               addComparable(s1, s2, false);\r
                                        }\r
                                        i1++;\r
                                        i2++;\r