strong.add(r);\r
}\r
\r
+ public void addStrong(Collection<Resource> rels) {\r
+ strong.addAll(rels);\r
+ }\r
+ \r
public void clearRels() {\r
traversed.clear();\r
tested.clear();\r
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
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
}\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
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
return new GraphChanges(r1,r2,changes1,changes2,modifications,comparableResources);\r
}\r
\r
- private List<Statement> filterAsserted(Resource r, Collection<Statement> in) throws ServiceException {\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
if (!s.isAsserted(r))\r
}\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
}\r
}\r
js++;\r
- \r
}\r
}\r
\r
\r
i2 += same2;\r
}\r
- \r
}\r
}\r
\r
}\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
Statement s2 = ss2.get(i2+off2);\r
\r
if (objectsLeft != null) {\r
- \r
- objectsLeft.add(s1.getObject());\r
- objectsRight.add(s2.getObject());\r
- \r
+ 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
ss1.addAll(g.getStatements(r1, b.HasProperty));\r
ss2.addAll(g.getStatements(r2, b.HasProperty));\r
sortStatement(ss1, ss2);\r
-// Collections.sort(ss1, scomp);\r
-// Collections.sort(ss2, scomp);\r
\r
int i1 = 0; \r
int i2 = 0;\r
Statement s2 = ss2.get(i2);\r
int c = scomp.compare(s1, s2);\r
switch (c) {\r
- case 0:{\r
- boolean b1 = g.hasValue(s1.getObject());\r
- boolean b2 = g.hasValue(s2.getObject());\r
- if (b1 == b2) {\r
- if (b1) {\r
- Object v1 = g.getValue(s1.getObject());\r
- Object v2 = g.getValue(s2.getObject());\r
- 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
+ case 0:{\r
+ boolean b1 = g.hasValue(s1.getObject());\r
+ boolean b2 = g.hasValue(s2.getObject());\r
+ if (b1 == b2) {\r
+ if (b1) {\r
+ Object v1 = g.getValue(s1.getObject());\r
+ Object v2 = g.getValue(s2.getObject());\r
+ boolean eq = compareValue(v1, v2);\r
+ if (!eq) {\r
+ addModification(s1, s2);\r
+ addComparable(s1, s2, false);\r
+ }\r
+ } else {\r
+ compareProps(s1.getObject(), s2.getObject());\r
}\r
} else {\r
- compareProps(s1.getObject(), s2.getObject());\r
+ addModification(s1, s2);\r
+ addComparable(s1, s2, false);\r
}\r
- } else {\r
- addModification(s1, s2);\r
- comparableStatements.map(s1, s2);\r
- comparableResources.map(s1.getObject(),s2.getObject());\r
+ i1++;\r
+ i2++;\r
+ break;\r
+ }\r
+ case -1:{\r
+ System.out.println("Compare Prop diff1s " + printStatement(g,s1));\r
+ addDeletion(s1);\r
+ i1++;\r
+ break;\r
+ }\r
+ \r
+ case 1:{\r
+ System.out.println("Compare Prop diff2s " + printStatement(g,s2));\r
+ addAddition(s2);\r
+ i2++;\r
+ break;\r
}\r
- i1++;\r
- i2++;\r
- break;\r
- }\r
- case -1:{\r
- System.out.println("Compare Prop diff1s " + printStatement(g,s1));\r
- addDeletion(s1);\r
- i1++;\r
- break;\r
- }\r
- \r
- case 1:{\r
- System.out.println("Compare Prop diff2s " + printStatement(g,s2));\r
- addAddition(s2);\r
- i2++;\r
- break;\r
- }\r
}\r
- \r
- \r
+\r
}\r
\r
ss1.clear();\r
\r
}\r
\r
- \r
public static boolean compareValue(Object v1, Object v2) {\r
if (v1 instanceof Object[] && v2 instanceof Object[])\r
return Arrays.deepEquals((Object[])v1, (Object[])v2);\r
}\r
\r
\r
- \r
public class PredicateComparator implements Comparator<Statement> {\r
@Override\r
public int compare(Statement o1, Statement o2) {\r
}\r
}\r
\r
-\r
- \r
public class ResComparator implements Comparator<Resource> {\r
@Override\r
public int compare(Resource o1, Resource o2) {\r
return 0;\r
}\r
}\r
- \r
- \r
+\r
}\r