X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.interop%2Fsrc%2Forg%2Fsimantics%2Finterop%2Ftest%2FGraphComparator.java;h=4fb9cf24e88e9f2b8078c5e3036019445aec2a8d;hb=e3c798bead3fe4882b2181b5c04b2dad06f1d71b;hp=e529fbbed7cc50481dae1771fc54b0731f001f05;hpb=65dc4008773b79bd9672956204512fb87edb4f23;p=simantics%2Finterop.git diff --git a/org.simantics.interop/src/org/simantics/interop/test/GraphComparator.java b/org.simantics.interop/src/org/simantics/interop/test/GraphComparator.java index e529fbb..4fb9cf2 100644 --- a/org.simantics.interop/src/org/simantics/interop/test/GraphComparator.java +++ b/org.simantics.interop/src/org/simantics/interop/test/GraphComparator.java @@ -68,25 +68,45 @@ public class GraphComparator { private ObjectComparator comparator; + private Comparator scomp = new PredicateComparator(); + private Comparator rcomp = new ResourceComparator(); + // runtime attributes private ReadGraph g; private Layer0 b; - public GraphComparator() { - comparator = new TypeComparator(); + public GraphComparator(Resource r1, Resource r2) { + this.r1 = r1; + this.r2 = r2; + comparator = new TypeComparator(); } - public GraphComparator(ObjectComparator comparator) { - this.comparator = comparator; + public GraphComparator(Resource r1, Resource r2, ObjectComparator comparator) { + this.r1 = r1; + this.r2 = r2; + this.comparator = comparator; } ArrayList ss1 = new ArrayList(); ArrayList ss2 = new ArrayList(); - Comparator scomp = new PredicateComparator(); - Comparator rcomp = new ResourceComparator(); - + + public Comparator getResourceComparator() { + return rcomp; + } + + public Comparator getStatementComparator() { + return scomp; + } + + public Resource getR1() { + return r1; + } + + public Resource getR2() { + return r2; + } public void addTraversed(Resource rel) { traversed.add(rel); @@ -120,24 +140,25 @@ public class GraphComparator { nonTested.addAll(rels); } + public void addComparableResources(Resource r1, Resource r2) { + comparableResources.map(r1, r2); + } + + public void addComparableResources(BijectionMap matching) { + comparableResources.addAll(matching); + } + public void clearRels() { traversed.clear(); tested.clear(); + nonTraversed.clear(); + nonTested.clear(); } - public void test(ReadGraph g, Resource r1, Resource r2) throws DatabaseException { + public void test(ReadGraph g) throws DatabaseException { this.g = g; this.b = Layer0.getInstance(g); - - this.r1 = r1; - this.r2 = r2; - changes1Set.clear(); - changes2Set.clear(); - modificationsSet.clear(); - changes1.clear(); - changes2.clear(); - modifications.clear(); - comparableResources.clear(); + comparator.setComparator(this); Stack stack1 = new Stack(); Stack stack2 = new Stack(); @@ -149,16 +170,16 @@ public class GraphComparator { List ss2 = new ArrayList(); while (!stack1.isEmpty()) { - r1 = stack1.pop(); - r2 = stack2.pop(); + Resource r1 = stack1.pop(); + Resource r2 = stack2.pop(); if (comparableResources.contains(r1, r2)) { - System.out.println("already tested " + NameUtils.getSafeName(g, r1) + " " + NameUtils.getSafeName(g, r2)); + //System.out.println("already tested " + NameUtils.getSafeName(g, r1) + " " + NameUtils.getSafeName(g, r2)); continue; } comparableResources.map(r1, r2); - System.out.println("test " + NameUtils.getSafeName(g, r1) + " " + NameUtils.getSafeName(g, r2)); + //System.out.println("test " + NameUtils.getSafeName(g, r1) + " " + NameUtils.getSafeName(g, r2)); compareProps(r1, r2); for (Resource rel : tested) { @@ -195,7 +216,7 @@ public class GraphComparator { } public GraphChanges getChanges() { - return new GraphChanges(r1,r2,changes1,changes2,modifications); + return new GraphChanges(r1,r2,changes1,changes2,modifications,comparableResources); } private List filterAsserted(Resource r, Collection in) throws ServiceException { @@ -263,9 +284,85 @@ public class GraphComparator { } } + public void sortStatement(List list1, List list2) { + Collections.sort(list1,scomp); + Collections.sort(list2,scomp); + + List sorted1 = new ArrayList(list1.size()); + List sorted2 = new ArrayList(list2.size()); + sorted1.addAll(list1); + sorted2.addAll(list2); + + int ss1 = 0; + int ss2 = 0; + for (int i = 0; i < list1.size(); ) { + Statement s1 = list1.get(i); + int same1 = sameRel(list1, i); + for (int j = 0; j < list2.size(); j++) { + Statement s2 = list2.get(j); + if (scomp.compare(s1, s2) == 0) { + int same2 = sameRel(list2, j); + copy(sorted1,ss1,list1,i,same1); + ss1 += same1; + copy(sorted2,ss2,list2,j,same2); + ss2 += same2; + break; + } + } + i+= same1; + } + if (ss1 < sorted1.size()) { + for (Statement s : list1) { + if (!sorted1.contains(s)) { + sorted1.set(ss1,s); + ss1++; + } + } + } + if (ss2 < sorted2.size()) { + for (Statement s : list2) { + if (!sorted2.contains(s)) { + sorted2.set(ss2,s); + ss2++; + } + } + } + + list1.clear(); + list2.clear(); + list1.addAll(sorted1); + list2.addAll(sorted2); + } + + public void copy(List to, int toIndex, List from, int fromIndex, int amount) { + for (int i = 0; i < amount; i++) { + to.set(toIndex + i, from.get(fromIndex+ i)); + } + } + + public void sortResource(List list1, List list2) { + Collections.sort(list1,rcomp); + int js = 0; + for (int i = 0; i < list1.size(); i++) { + Resource s1 = list1.get(i); + for (int j = js; j < list2.size(); j++) { + Resource s2 = list2.get(j); + if (rcomp.compare(s1, s2) == 0) { + Resource t = list2.get(js); + list2.set(js, s2); + list2.set(j, t); + break; + } + } + js++; + + } + } + private void compareStatements(List ss1, List ss2, Stack stack1, Stack stack2) throws DatabaseException { - Collections.sort(ss1, scomp); - Collections.sort(ss2, scomp); + sortStatement(ss1, ss2); +// Collections.sort(ss1, scomp); +// Collections.sort(ss2, scomp); int i1 = 0; int i2 = 0; @@ -276,7 +373,7 @@ public class GraphComparator { break; } else { while (i2 < ss2.size()) { - System.out.println("Compare Statement diff2 " + printStatement(g,ss2.get(i2))); + System.out.println("Compare Statements diff2 " + printStatement(g,ss2.get(i2))); addAddition(ss2.get(i2)); i2++; @@ -285,7 +382,7 @@ public class GraphComparator { } } else if (i2 >= ss2.size()) { while (i1 < ss1.size()) { - System.out.println("Compare Statement diff1 " + printStatement(g,ss1.get(i1))); + System.out.println("Compare Statements diff1 " + printStatement(g,ss1.get(i1))); addDeletion(ss1.get(i1)); i1++; } @@ -300,13 +397,13 @@ public class GraphComparator { i2+=same2; } else if (c < 0) { for (int i = 0; i < same1; i++) { - System.out.println("Compare Statement diff1 " + printStatement(g,ss1.get(i+i1))); + System.out.println("Compare Statements diff1 " + printStatement(g,ss1.get(i+i1))); addDeletion(ss1.get(i+i1)); } i1 += same1; } else { for (int i = 0; i < same2; i++) { - System.out.println("Compare Statement diff2 " + printStatement(g,ss2.get(i+i2))); + System.out.println("Compare Statements diff2 " + printStatement(g,ss2.get(i+i2))); addAddition(ss2.get(i+i2)); } @@ -442,8 +539,9 @@ public class GraphComparator { ArrayList ss2 = new ArrayList(); ss1.addAll(g.getStatements(r1, b.HasProperty)); ss2.addAll(g.getStatements(r2, b.HasProperty)); - Collections.sort(ss1, scomp); - Collections.sort(ss2, scomp); + sortStatement(ss1, ss2); +// Collections.sort(ss1, scomp); +// Collections.sort(ss2, scomp); int i1 = 0; int i2 = 0; @@ -542,9 +640,11 @@ public class GraphComparator { - public static class PredicateComparator implements Comparator { + public class PredicateComparator implements Comparator { @Override public int compare(Statement o1, Statement o2) { + if (comparableResources.contains(o1.getPredicate(), o2.getPredicate())) + return 0; if (o1.getPredicate().getResourceId() < o2.getPredicate().getResourceId()) return -1; if (o1.getPredicate().getResourceId() > o2.getPredicate().getResourceId()) @@ -574,9 +674,11 @@ public class GraphComparator { - public static class ResourceComparator implements Comparator { + public class ResourceComparator implements Comparator { @Override public int compare(Resource o1, Resource o2) { + if (comparableResources.contains(o1, o2)) + return 0; if (o1.getResourceId() < o2.getResourceId()) return -1; if (o1.getResourceId() > o2.getResourceId())