]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.interop/src/org/simantics/interop/test/GraphComparator.java
Prevent random matches when objects have the same difference value.
[simantics/interop.git] / org.simantics.interop / src / org / simantics / interop / test / GraphComparator.java
index d24509395633f7471114302a9815d2a66ed108eb..0c5aecc993bed308043f23d19ec997daa979bded 100644 (file)
@@ -455,7 +455,7 @@ public class GraphComparator {
                                                                // compare objects (unreliable result is interpreted as positive match)
 
                                                                int comp = comparator.compare(g, left.get(i).getObject(), similarLeft.get(j).getObject(), true);
-                                                               if (comp >= 0 && comp < Integer.MAX_VALUE) {
+                                                               if (comp >= 0 && comp < ResourceComparator.NO_MATCH) {
                                                                        useL[i] = true;
                                                                        useSL[j] = true;
                                                                        break;
@@ -695,14 +695,14 @@ public class GraphComparator {
                
        }
        
-       private boolean hasMatchingPaths(Set<Path> leftPaths, Set<Path> rightPaths) {
+       private boolean hasMatchingPaths(Set<Path> leftPaths, Set<Path> rightPaths) throws DatabaseException {
                if (leftPaths.size() != rightPaths.size())
                        return false;
                BijectionMap<Path,Path> map = getMatchingPaths(leftPaths, rightPaths);
                return map.size() == leftPaths.size();
        }
        
-       private BijectionMap<Path,Path> getMatchingPaths(Set<Path> leftPaths, Set<Path> rightPaths) {
+       private BijectionMap<Path,Path> getMatchingPaths(Set<Path> leftPaths, Set<Path> rightPaths) throws DatabaseException {
                BijectionMap<Path,Path> map = new BijectionMap<Path, Path>();
                for (Path leftPath : leftPaths) {
                        for (Path rightPath : rightPaths) {
@@ -723,6 +723,10 @@ public class GraphComparator {
                                                        match = false;
                                                        break;
                                                }
+                                               if (comparator.compare(g, sl.getObject(), sr.getObject()) == ResourceComparator.NO_MATCH) {
+                                                       match = false;
+                                                       break;
+                                               }
                                        }
                                        if (match) {
                                                map.map(leftPath, rightPath);
@@ -790,6 +794,14 @@ public class GraphComparator {
                return new GraphChanges(r1,r2,changes1,changes2,modifications,comparableResources);
        }
        
+       public List<Statement> getChanges1() {
+               return changes1;
+       }
+       
+       public List<Statement> getChanges2() {
+               return changes2;
+       }
+       
        private void addComparable(Statement left, Statement right) throws DatabaseException {
                addComparable(left.getObject(), right.getObject());
                comparableStatements.map(left, right);
@@ -826,7 +838,7 @@ public class GraphComparator {
                                out.add(s);
                        else {
                                boolean has = false;
-                               if (i > 1 && in.get(i-1).getPredicate().equals(s.getPredicate()))
+                               if (i > 0 && in.get(i-1).getPredicate().equals(s.getPredicate()))
                                        has = true;
                                else if (i < in.size()-1 && in.get(i+1).getPredicate().equals(s.getPredicate()))
                                        has = true;
@@ -834,11 +846,6 @@ public class GraphComparator {
                                        out.add(s);
                        }
                        
-               }
-               for (Statement s : in) {
-                       if (!s.isAsserted(r))
-                               out.add(s);
-                       
                }
                return out;
        }
@@ -1076,7 +1083,7 @@ public class GraphComparator {
                for (int i = 0; i < used2.length; i++) {
                        used2[i] = false;
                }
-               
+                               
                // left, right, difference
                List<List<Integer>> differences = new ArrayList<List<Integer>>();
                for (int i1 = off1; i1 < off1 + len1; i1++) {
@@ -1108,41 +1115,12 @@ public class GraphComparator {
                
                Integer[] pris = priorities.getKeys(new Integer[]{});
                Arrays.sort(pris);
+               boolean matchFail = priorityMatching(ss1, off1, len1, ss2, off2, len2, pris, differences, priorities, used1, used2, objectsLeft, objectsRight, false);
+               if (matchFail) 
+                       matchFail = priorityMatching(ss1, off1, len1, ss2, off2, len2, pris, differences, priorities, used1, used2, objectsLeft, objectsRight, objectsLeft == null);
                
                for (Integer pri : pris) {
-                       if (pri == Integer.MAX_VALUE) {
-
-                       } else if (pri == 0) {
-                               
-                       } else {
-                               List<Integer> i1s = priorities.getValues(pri);
-                               for (Integer i1 : i1s) {
-                                       if (used1[i1])
-                                               continue;
-                                       List<Integer> i2diff = differences.get(i1);
-                                       for (int i2 = 0; i2 < i2diff.size(); i2++) {
-                                               if (i2diff.get(i2) == pri) {
-                                                       if (used2[i2])
-                                                               continue;
-                                                       used1[i1] = true;
-                                                       used2[i2] = true;
-                                                       Statement s1  = ss1.get(i1+off1);
-                                                       Statement s2  = ss2.get(i2+off2);
-                                                       
-                                                       if (objectsLeft != null) {
-                                                               objectsLeft.add(s1.getObject());
-                                                               objectsRight.add(s2.getObject());
-                                                       } 
-                                                       addComparable(s1, s2);
-                                                       break;
-                                               }
-                                       }
-                               }
-                       }
-               }
-               
-               for (Integer pri : pris) {
-                       if (pri != 0)
+                       if (pri != 0 && !matchFail && unreliableLeft == null)
                                continue;
                        Set<Statement> s1s = new HashSet<Statement>();
                        Set<Statement> s2s = new HashSet<Statement>();
@@ -1190,7 +1168,51 @@ public class GraphComparator {
                }
        }
        
-       
+       private boolean priorityMatching(List<Statement> ss1, int off1, int len1, List<Statement> ss2, int off2, int len2, Integer[] pris, List<List<Integer>> differences, MapList<Integer, Integer> priorities, boolean used1[],boolean used2[], Collection<Resource> objectsLeft, Collection<Resource> objectsRight, boolean force) throws DatabaseException {
+               boolean matchFail = false;
+               for (Integer pri : pris) {
+                       if (pri == Integer.MAX_VALUE) {
+
+                       } else if (pri == 0) {
+                               
+                       } else {
+                               List<Integer> i1s = priorities.getValues(pri);
+                               
+                               for (Integer i1 : i1s) {
+                                       if (used1[i1])
+                                               continue;
+                                       List<Integer> i2diff = differences.get(i1);
+                                       List<Integer> matches = new ArrayList<Integer>();
+                                       for (int i2 = 0; i2 < i2diff.size(); i2++) {
+                                               if (i2diff.get(i2) == pri) { 
+                                                       if (used2[i2])
+                                                               continue;
+                                                       matches.add(i2);
+                                               }
+                                       }
+                                       if (matches.size() == 1 || (force && matches.size() > 1)) {
+                                               int i2 = matches.get(0);
+                                               used1[i1] = true;
+                                               used2[i2] = true;
+                                               Statement s1  = ss1.get(i1+off1);
+                                               Statement s2  = ss2.get(i2+off2);
+                                               
+                                               if (objectsLeft != null) {
+                                                       objectsLeft.add(s1.getObject());
+                                                       objectsRight.add(s2.getObject());
+                                               } 
+                                               addComparable(s1, s2);
+                                       } else if (matches.size() > 1) {
+                                               matchFail = true;
+                                       }
+                               }
+                               if (matchFail)
+                                       break;
+                       }
+               }
+               return matchFail;
+       }
+
        
        /**
         * compares properties, assumes functional relations
@@ -1265,7 +1287,10 @@ public class GraphComparator {
                                                        }
                                                } else {
                                                        // Non literal properties.
-                                                       if (comparator.compare(g, s1.getObject(), s2.getObject()) != ResourceComparator.NO_MATCH) {
+                                                       int comp = comparator.compare(g, s1.getObject(), s2.getObject());
+                                                       if (comp == ResourceComparator.NO_MATCH) {
+                                                               addModification(r1,s1,r2,s2);
+                                                       } else if (comp != ResourceComparator.EXACT_MATCH) {
                                                                if (!s1.getObject().equals(s1.getSubject()) && !s2.getObject().equals(s2.getSubject())) {
                                                                        if (!a1 && !a2) {
                                                                                // compare props matches objects, so we can call that only for non asserted statements
@@ -1279,7 +1304,7 @@ public class GraphComparator {
                                                                        addModification(r1,s1,r2,s2);
                                                                }
                                                        } else {
-                                                               addModification(r1,s1,r2,s2);
+                                                               // Exact match, nothing to do.
                                                        }
                                                }
                                        } else {
@@ -1291,14 +1316,18 @@ public class GraphComparator {
                                }
                                case -1:{
                                        if (DEBUG) System.out.println("Compare Prop diff1s " + printStatement(g,s1));
-                                       addDeletion(s1);
+                                       // Use modification, since deletions do not support asserted statements
+                                       addModification(r1,s1,r2,null);
+                                       //addDeletion(s1);
                                        i1++;
                                        break;
                                }
                                        
                                case 1:{
                                        if (DEBUG) System.out.println("Compare Prop diff2s " + printStatement(g,s2));
-                                       addAddition(s2);
+                                       // Use modification, since additions do not support asserted statements
+                                       addModification(r1,null,r2,s2);
+                                       //addAddition(s2);
                                        i2++;
                                        break;
                                }