\r
import org.simantics.db.ReadGraph;\r
import org.simantics.db.Resource;\r
+import org.simantics.db.Session;\r
import org.simantics.db.Statement;\r
+import org.simantics.db.common.request.ReadRequest;\r
import org.simantics.db.common.utils.NameUtils;\r
import org.simantics.db.exception.DatabaseException;\r
import org.simantics.db.exception.DoesNotContainValueException;\r
}\r
\r
\r
+ }\r
+ \r
+ public void test(Session session) throws DatabaseException {\r
+ \r
+ comparator.setComparator(this);\r
+ \r
+ comparableResources.map(r1, r2);\r
+ \r
+ final Stack<Resource> objectsLeft = new Stack<Resource>();\r
+ final Stack<Resource> objectsRight = new Stack<Resource>();\r
+ objectsLeft.push(r1);\r
+ objectsRight.push(r2);\r
+ \r
+ final Set<Statement> unreliableLeft = new HashSet<Statement>();\r
+ final Set<Statement> unreliableRight = new HashSet<Statement>();\r
+ \r
+ while (true) {\r
+ if (objectsLeft.isEmpty())\r
+ break;\r
+ session.syncRequest(new ReadRequest() {\r
+ \r
+ @Override\r
+ public void run(ReadGraph graph) throws DatabaseException {\r
+ g = graph;\r
+ b = Layer0.getInstance(graph);\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
+ // comparison is ending, but we have still unprocessed unidentified resources left.\r
+ // These cases have longer path than one to identified objects.\r
+ processUnreliableDeep(unreliableLeft, unreliableRight, objectsLeft, objectsRight);\r
+ }\r
+ }\r
+ });\r
+ \r
+ \r
+ \r
+ }\r
+ for (Statement s : unreliableLeft) {\r
+ if (!comparableStatements.containsLeft(s))\r
+ addDeletion(s);\r
+ }\r
+ for (Statement s : unreliableRight) {\r
+ if (!comparableStatements.containsRight(s))\r
+ addAddition(s);\r
+ }\r
+ \r
+ \r
}\r
\r
private void process(Stack<Resource> objectsLeft, Stack<Resource> objectsRight, Set<Statement> unreliableLeft, Set<Statement> unreliableRight) throws DatabaseException {\r
comparableResources.contains(leftS.getPredicate(), rightS.getPredicate())) {\r
unreliableLeft.remove(leftS);\r
unreliableRight.remove(rightS);\r
- comparableStatements.map(leftS, rightS);\r
+ addComparable(leftS, rightS, false);\r
}\r
}\r
}\r
* @throws ValidationException \r
*/\r
private void compareProps(Resource r1, Resource r2) throws ServiceException, DoesNotContainValueException, ValidationException {\r
+ System.out.println("compareProps " + r1 + " " + NameUtils.getSafeName(g, r1) + " " + r2 + " " + NameUtils.getSafeName(g, r2));\r
ArrayList<Statement> ss1 = new ArrayList<Statement>();\r
ArrayList<Statement> ss2 = new ArrayList<Statement>();\r
ss1.addAll(g.getStatements(r1, b.HasProperty));\r
}\r
Statement s1 = ss1.get(i1);\r
Statement s2 = ss2.get(i2);\r
+ if (s1.isAsserted(r1) && s2.isAsserted(r2)) {\r
+ i1++;\r
+ i2++;\r
+ continue;\r
+ }\r
int c = scomp.compare(s1, s2);\r
switch (c) {\r
case 0:{\r
addComparable(s1, s2, false);\r
}\r
} else {\r
- compareProps(s1.getObject(), s2.getObject());\r
+ if (!s1.getObject().equals(s1.getSubject()) && !s2.getObject().equals(s2.getSubject()))\r
+ compareProps(s1.getObject(), s2.getObject());\r
}\r
} else {\r
addModification(s1, s2);\r