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++) {
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>();
}
}
-
+ 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