X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.interop%2Fsrc%2Forg%2Fsimantics%2Finterop%2Ftest%2FTypeComparator.java;h=2ea03d38f8d12ce0e4519b8b5a2328e906d084e1;hb=37acf1273cdf0be148b22625db2baa15a4077d0b;hp=fc0268ec6372a4258d05ea43c902a0b52ebc43b6;hpb=4399a40e11996b9a373f522af995a19a05493dd3;p=simantics%2Finterop.git diff --git a/org.simantics.interop/src/org/simantics/interop/test/TypeComparator.java b/org.simantics.interop/src/org/simantics/interop/test/TypeComparator.java index fc0268e..2ea03d3 100644 --- a/org.simantics.interop/src/org/simantics/interop/test/TypeComparator.java +++ b/org.simantics.interop/src/org/simantics/interop/test/TypeComparator.java @@ -1,147 +1,171 @@ -package org.simantics.interop.test; - -import java.util.ArrayList; -import java.util.Comparator; - -import org.simantics.db.ReadGraph; -import org.simantics.db.Resource; -import org.simantics.db.Statement; -import org.simantics.db.exception.DatabaseException; -import org.simantics.db.exception.DoesNotContainValueException; -import org.simantics.db.exception.ManyObjectsForFunctionalRelationException; -import org.simantics.db.exception.ServiceException; -import org.simantics.db.exception.ValidationException; -import org.simantics.layer0.Layer0; - -/** - * Object comparator that uses type of objects to check if objects are comparable. - * - * Difference value is amount of properties that have different values. - * - * @author Marko Luukkainen - * - */ -public class TypeComparator extends ObjectComparator { - - - ArrayList rs1 = new ArrayList(); - ArrayList rs2 = new ArrayList(); - - @Override - public int compare(ReadGraph g, Resource o1, Resource o2) throws DatabaseException{ - if (!compareType(g,o1, o2)) { - return (Integer.MAX_VALUE); - } - return propsDiffCount(g,o1, o2); - } - - protected boolean compareType(ReadGraph g,Resource r1, Resource r2) throws ServiceException, ManyObjectsForFunctionalRelationException { - Layer0 l0 = Layer0.getInstance(g); - rs1.addAll(g.getObjects(r1, l0.InstanceOf)); - rs2.addAll(g.getObjects(r2, l0.InstanceOf)); - if (rs1.size() != rs2.size()) { - rs1.clear(); - rs2.clear(); - return false; - } - Comparator rcomp = getComparator().getResourceComparator(); - getComparator().sortResource(rs1, rs2); - - for (int i = 0; i < rs1.size(); i++) { - int c = rcomp.compare(rs1.get(i), rs2.get(i)); - if (c != 0) { - rs1.clear(); - rs2.clear(); - return false; - } - } - - rs1.clear(); - rs2.clear(); - - return true; - } - - protected int propsDiffCount(ReadGraph g, Resource r1, Resource r2) throws ServiceException, DoesNotContainValueException, ValidationException { - Layer0 l0 = Layer0.getInstance(g); - ArrayList ss1 = new ArrayList(); - ArrayList ss2 = new ArrayList(); - ss1.addAll(g.getStatements(r1, l0.HasProperty)); - ss2.addAll(g.getStatements(r2, l0.HasProperty)); - - Comparator scomp = getComparator().getStatementComparator(); - - getComparator().sortStatement(ss1, ss2); - - int count = 0; - - int i1 = 0; - int i2 = 0; - - while (true) { - if (i1 >= ss1.size()) { - if (i2 >= ss2.size()) - break; - else { - while (i2 < ss2.size()) { - count++; - i2++; - } - break; - } - } else if (i2 >= ss2.size()) { - while (i1 < ss1.size()) { - count++; - i1++; - } - break; - } - Statement s1 = ss1.get(i1); - Statement s2 = ss2.get(i2); - int c = scomp.compare(s1, s2); - switch (c) { - case 0:{ - boolean b1 = g.hasValue(s1.getObject()); - boolean b2 = g.hasValue(s2.getObject()); - if (b1 == b2) { - if (b1) { - Object v1 = g.getValue(s1.getObject()); - Object v2 = g.getValue(s2.getObject()); - boolean eq = GraphComparator.compareValue(v1, v2); - - if (!eq) { - count++; - } - //System.out.println("Prop count values " + v1 + " " + v2); - } else { - count += propsDiffCount(g,s1.getObject(), s2.getObject()); - } - } else { - //System.out.println("Props count structural vs literal"); - count++; - } - i1++; - i2++; - break; - } - case -1:{ - count++; - i1++; - break; - } - - case 1:{ - count++; - i2++; - break; - } - } - - } - - ss1.clear(); - ss2.clear(); - return count; - } - -} +package org.simantics.interop.test; + +import java.util.ArrayList; +import java.util.Comparator; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.Statement; +import org.simantics.db.exception.DatabaseException; +import org.simantics.layer0.Layer0; + +/** + * Object comparator that uses type of objects to check if objects are comparable. + * + * Difference value is amount of properties that have different values. If objects have no properties, the result is 0 (unreliable). + * + * + * @author Marko Luukkainen + * + */ +public class TypeComparator extends ResourceComparator { + + + ArrayList rs1 = new ArrayList(); + ArrayList rs2 = new ArrayList(); + + @Override + public int compare(ReadGraph g, Resource o1, Resource o2, boolean local) throws DatabaseException { + if (o1.equals(o2)) { + return EXACT_MATCH; + } + return compare(g, o1, o2); + } + + @Override + public int compare(ReadGraph g, Resource o1, Resource o2) throws DatabaseException{ + if (!compareType(g,o1, o2)) { + return NO_MATCH; + } + return propsDiffCount(g,o1, o2); + } + + protected boolean compareType(ReadGraph g,Resource r1, Resource r2) throws DatabaseException { + Layer0 l0 = Layer0.getInstance(g); + rs1.addAll(g.getObjects(r1, l0.InstanceOf)); + rs2.addAll(g.getObjects(r2, l0.InstanceOf)); + if (rs1.size() != rs2.size()) { + rs1.clear(); + rs2.clear(); + return false; + } + Comparator rcomp = getComparator().getResourceComparator(); + getComparator().sortResource(rs1, rs2); + + for (int i = 0; i < rs1.size(); i++) { + int c = rcomp.compare(rs1.get(i), rs2.get(i)); + if (c != 0) { + rs1.clear(); + rs2.clear(); + return false; + } + } + if (rs1.size() == 1) { + // Check for enumeration type. Without this enumeration instances could be mixed together. + if (g.hasStatement(rs1.get(0), l0.Enumeration, rs1.get(0))) { + if (!r1.equals(r2)) { + rs1.clear(); + rs2.clear(); + return false; + } + } + } + + rs1.clear(); + rs2.clear(); + + return true; + } + + protected int propsDiffCount(ReadGraph g, Resource r1, Resource r2) throws DatabaseException { + Layer0 l0 = Layer0.getInstance(g); + ArrayList ss1 = new ArrayList(); + ArrayList ss2 = new ArrayList(); + ss1.addAll(g.getStatements(r1, l0.HasProperty)); + ss2.addAll(g.getStatements(r2, l0.HasProperty)); + + if (ss1.size() == 0 && ss2.size() == 0) + return 0; + + Comparator scomp = getComparator().getStatementComparator(); + + getComparator().sortStatement(ss1, ss2); + + int count = 1; + + int i1 = 0; + int i2 = 0; + + while (true) { + if (i1 >= ss1.size()) { + if (i2 >= ss2.size()) + break; + else { + while (i2 < ss2.size()) { + count++; + i2++; + } + break; + } + } else if (i2 >= ss2.size()) { + while (i1 < ss1.size()) { + count++; + i1++; + } + break; + } + Statement s1 = ss1.get(i1); + Statement s2 = ss2.get(i2); + if (s1.isAsserted(r1) && s2.isAsserted(r2)) { + i1++; + i2++; + continue; + } + int c = scomp.compare(s1, s2); + switch (c) { + case 0:{ + boolean b1 = g.hasValue(s1.getObject()); + boolean b2 = g.hasValue(s2.getObject()); + if (b1 == b2) { + if (b1) { +// Object v1 = g.getValue(s1.getObject()); +// Object v2 = g.getValue(s2.getObject()); +// boolean eq = GraphComparator.compareValue(v1, v2); + boolean eq = GraphComparator.compareValue(g, l0 , s1.getObject(), s2.getObject()); + + if (!eq) { + count++; + } + //System.out.println("Prop count values " + v1 + " " + v2); + } else { + count += propsDiffCount(g,s1.getObject(), s2.getObject()); + } + } else { + //System.out.println("Props count structural vs literal"); + count++; + } + i1++; + i2++; + break; + } + case -1:{ + count++; + i1++; + break; + } + + case 1:{ + count++; + i2++; + break; + } + } + + } + + ss1.clear(); + ss2.clear(); + return count; + } + +}