From 3515a9bc7a43e907c178285dd04ac36daa55e9a5 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Tue, 19 Mar 2019 09:25:58 +0100
Subject: [PATCH] miriam data comparator implemented

---
 .../model/map/MiriamDataComparator.java       | 40 +++++++++++++++++
 .../map/reaction/ReactionComparator.java      | 27 +++++------
 .../model/map/species/ElementComparator.java  | 45 ++++---------------
 .../map/reaction/ReactionComparatorTest.java  | 14 ++++++
 4 files changed, 73 insertions(+), 53 deletions(-)
 create mode 100644 model/src/main/java/lcsb/mapviewer/model/map/MiriamDataComparator.java

diff --git a/model/src/main/java/lcsb/mapviewer/model/map/MiriamDataComparator.java b/model/src/main/java/lcsb/mapviewer/model/map/MiriamDataComparator.java
new file mode 100644
index 0000000000..d4a5240ea1
--- /dev/null
+++ b/model/src/main/java/lcsb/mapviewer/model/map/MiriamDataComparator.java
@@ -0,0 +1,40 @@
+package lcsb.mapviewer.model.map;
+
+import lcsb.mapviewer.common.Comparator;
+import lcsb.mapviewer.common.comparator.StringComparator;
+
+/**
+ * Comparator of {@link MiriamData} object.
+ * 
+ * @author Piotr Gawron
+ *
+ */
+public class MiriamDataComparator extends Comparator<MiriamData> {
+
+  /**
+   * Default constructor.
+   */
+  public MiriamDataComparator() {
+    super(MiriamData.class);
+  }
+
+  @Override
+  protected int internalCompare(MiriamData arg0, MiriamData arg1) {
+    StringComparator stringComparator = new StringComparator();
+    if (stringComparator.compare(arg0.getResource(), arg1.getResource()) != 0) {
+      return stringComparator.compare(arg0.getResource(), arg1.getResource());
+    }
+    if (arg0.getDataType() != arg1.getDataType()) {
+      return -1;
+    }
+    if (arg0.getRelationType() != arg1.getRelationType()) {
+      return -1;
+    }
+    if (arg0.getAnnotator() != arg1.getAnnotator()) {
+      return -1;
+    }
+
+    return 0;
+  }
+
+}
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/reaction/ReactionComparator.java b/model/src/main/java/lcsb/mapviewer/model/map/reaction/ReactionComparator.java
index 2bb9e00ea2..91900fa4e9 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/reaction/ReactionComparator.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/reaction/ReactionComparator.java
@@ -10,10 +10,12 @@ import lcsb.mapviewer.common.Configuration;
 import lcsb.mapviewer.common.comparator.BooleanComparator;
 import lcsb.mapviewer.common.comparator.DoubleComparator;
 import lcsb.mapviewer.common.comparator.IntegerComparator;
+import lcsb.mapviewer.common.comparator.SetComparator;
 import lcsb.mapviewer.common.comparator.StringComparator;
 import lcsb.mapviewer.common.comparator.StringListComparator;
 import lcsb.mapviewer.common.comparator.StringSetComparator;
 import lcsb.mapviewer.model.map.MiriamData;
+import lcsb.mapviewer.model.map.MiriamDataComparator;
 import lcsb.mapviewer.model.map.kinetics.SbmlKineticsComparator;
 
 /**
@@ -129,23 +131,14 @@ public class ReactionComparator extends Comparator<Reaction> {
       return stringListComparator.compare(arg0.getSynonyms(), arg1.getSynonyms());
     }
 
-    Set<String> hashCode1 = new HashSet<String>();
-    Set<String> hashCode2 = new HashSet<String>();
+    SetComparator<MiriamData> miriamDataSetComparator = new SetComparator<>(new MiriamDataComparator());
 
-    for (MiriamData md : arg0.getMiriamData()) {
-      String hash = md.getRelationType() + "  " + md.getDataType() + "  " + md.getResource();
-      hashCode1.add(hash);
-    }
-
-    for (MiriamData md : arg1.getMiriamData()) {
-      String hash = md.getRelationType() + "  " + md.getDataType() + "  " + md.getResource();
-      hashCode2.add(hash);
-    }
-
-    StringSetComparator stringSetComparator = new StringSetComparator();
-    if (stringSetComparator.compare(hashCode1, hashCode2) != 0) {
-      logger.debug("Miriam dataset different");
-      return stringSetComparator.compare(hashCode1, hashCode2);
+    int status = miriamDataSetComparator.compare(arg0.getMiriamData(), arg1.getMiriamData());
+    if (status != 0) {
+      logger.debug("miriam data different");
+      logger.debug(arg0.getMiriamData());
+      logger.debug(arg1.getMiriamData());
+      return status;
     }
 
     if (arg0.getNodes().size() != arg1.getNodes().size()) {
@@ -155,7 +148,7 @@ public class ReactionComparator extends Comparator<Reaction> {
 
     for (int i = 0; i < arg0.getNodes().size(); i++) {
       AbstractNode node0 = arg0.getNodes().get(i);
-      int status = -1;
+      status = -1;
       for (int j = 0; j < arg1.getNodes().size(); j++) {
         int tmpStatus = aNodeComparator.compare(node0, arg1.getNodes().get(j));
         if (tmpStatus == 0) {
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java b/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java
index aef04ac56d..e02724a703 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java
@@ -1,18 +1,16 @@
 package lcsb.mapviewer.model.map.species;
 
-import java.util.HashSet;
-import java.util.Set;
-
 import org.apache.log4j.Logger;
 
 import lcsb.mapviewer.common.Comparator;
 import lcsb.mapviewer.common.Configuration;
 import lcsb.mapviewer.common.comparator.ColorComparator;
 import lcsb.mapviewer.common.comparator.DoubleComparator;
+import lcsb.mapviewer.common.comparator.SetComparator;
 import lcsb.mapviewer.common.comparator.StringComparator;
 import lcsb.mapviewer.common.comparator.StringListComparator;
-import lcsb.mapviewer.common.comparator.StringSetComparator;
 import lcsb.mapviewer.model.map.MiriamData;
+import lcsb.mapviewer.model.map.MiriamDataComparator;
 import lcsb.mapviewer.model.map.compartment.CompartmentComparator;
 import lcsb.mapviewer.model.map.model.ElementSubmodelConnectionComparator;
 
@@ -149,7 +147,6 @@ public class ElementComparator extends Comparator<Element> {
       return stringComparator.compare(arg0.getFormula(), arg1.getFormula());
     }
 
-    StringSetComparator stringSetComparator = new StringSetComparator();
     StringListComparator stringListComparator = new StringListComparator();
 
     if (stringListComparator.compare(arg0.getSynonyms(), arg1.getSynonyms()) != 0) {
@@ -162,38 +159,14 @@ public class ElementComparator extends Comparator<Element> {
       return stringListComparator.compare(arg0.getFormerSymbols(), arg1.getFormerSymbols());
     }
 
-    Set<String> hashCode1 = new HashSet<>();
-    Set<String> hashCode2 = new HashSet<>();
-
-    if (arg0.getMiriamData().size() != arg1.getMiriamData().size()) {
-      logger.debug(
-          "different number of annotations: " + arg0.getMiriamData().size() + ", " + arg1.getMiriamData().size());
-      return ((Integer) arg0.getMiriamData().size()).compareTo(arg1.getMiriamData().size());
-    }
-
-    for (MiriamData md : arg0.getMiriamData()) {
-      String hash = md.getRelationType() + "  " + md.getDataType() + "  " + md.getResource();
-      hashCode1.add(hash);
-    }
-
-    for (MiriamData md : arg1.getMiriamData()) {
-      String hash = md.getRelationType() + "  " + md.getDataType() + "  " + md.getResource();
-      hashCode2.add(hash);
-    }
-
-    if (stringSetComparator.compare(hashCode1, hashCode2) != 0) {
-      logger.debug("different annotations: ");
-      logger.debug("A:");
-      for (String string : hashCode1) {
-        logger.debug("|" + string + "|");
-      }
-      logger.debug("B:");
-      for (String string : hashCode2) {
-        logger.debug("|" + string + "|");
-      }
-      logger.debug("--");
-      return stringSetComparator.compare(hashCode1, hashCode2);
+    SetComparator<MiriamData> miriamDataSetComparator = new SetComparator<>(new MiriamDataComparator());
 
+    status = miriamDataSetComparator.compare(arg0.getMiriamData(), arg1.getMiriamData());
+    if (status != 0) {
+      logger.debug("miriam data different");
+      logger.debug(arg0.getMiriamData());
+      logger.debug(arg1.getMiriamData());
+      return status;
     }
 
     return 0;
diff --git a/model/src/test/java/lcsb/mapviewer/model/map/reaction/ReactionComparatorTest.java b/model/src/test/java/lcsb/mapviewer/model/map/reaction/ReactionComparatorTest.java
index 271edc6538..689f253e07 100644
--- a/model/src/test/java/lcsb/mapviewer/model/map/reaction/ReactionComparatorTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/map/reaction/ReactionComparatorTest.java
@@ -295,4 +295,18 @@ public class ReactionComparatorTest {
     assertTrue(comparator.compare(reaction1, reaction2) != 0);
     assertTrue(comparator.compare(reaction2, reaction1) != 0);
   }
+
+  @Test
+  public void testDifferentMiriamData() {
+    Reaction reaction1 = createReaction();
+    Reaction reaction2 = createReaction();
+
+    reaction1.addMiriamData(new MiriamData(MiriamType.HGNC, "SNCA"));
+    assertTrue(comparator.compare(reaction1, reaction2) != 0);
+    assertTrue(comparator.compare(reaction2, reaction1) != 0);
+
+    reaction2.addMiriamData(new MiriamData(MiriamType.HGNC, "SNCA"));
+    assertEquals(0, comparator.compare(reaction1, reaction2));
+    assertEquals(0, comparator.compare(reaction2, reaction1));
+  }
 }
-- 
GitLab