Make SQLEntry id an Object rather than int

Since the Spanner implementation uses String UUID for the primary
key, the SQLEntry id needs to accept both String and int values.

This change adapts the compareTo, equals, and hashCode methods as
well.

The previous hashCode method was not really hashing the value, so
I have updated that to use Objects.hashCode and removed the now-
unnecessary testHashCode() test.

The only change to the SQLClient is to use getObject instead of
getInt.

Change-Id: Id9e48ee897263012275d14ae7b5aa0952f11f43f
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLClient.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLClient.java
index 0949935..2056e71 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLClient.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLClient.java
@@ -195,10 +195,11 @@
       while (rs.next()) {
         entries.add(
             new SQLEntry(
+                databaseDialect,
                 rs.getString(PROJECT_ENTRY),
                 rs.getTimestamp(DATE_ENTRY),
                 rs.getString(EVENT_ENTRY),
-                rs.getInt(PRIMARY_ENTRY)));
+                rs.getObject(PRIMARY_ENTRY)));
       }
       return entries;
     }
@@ -211,10 +212,11 @@
       while (rs.next()) {
         SQLEntry entry =
             new SQLEntry(
+                databaseDialect,
                 rs.getString(PROJECT_ENTRY),
                 rs.getTimestamp(DATE_ENTRY),
                 rs.getString(EVENT_ENTRY),
-                rs.getInt(PRIMARY_ENTRY));
+                rs.getObject(PRIMARY_ENTRY));
         result.put(rs.getString(PROJECT_ENTRY), entry);
       }
       return result;
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLEntry.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLEntry.java
index 1ae9228..38bc8bc 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLEntry.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLEntry.java
@@ -15,21 +15,27 @@
 package com.ericsson.gerrit.plugins.eventslog.sql;
 
 import java.sql.Timestamp;
+import java.util.Objects;
 
 class SQLEntry implements Comparable<SQLEntry> {
-  private static final int SEED = 31;
+  private SQLDialect dialect;
   private String name;
   private Timestamp timestamp;
   private String event;
-  private int id;
+  private Object id;
 
-  SQLEntry(String name, Timestamp timestamp, String event, int id) {
+  SQLEntry(SQLDialect dialect, String name, Timestamp timestamp, String event, Object id) {
+    this.dialect = dialect;
     this.name = name;
     this.timestamp = timestamp;
     this.event = event;
     this.id = id;
   }
 
+  public SQLDialect getDialect() {
+    return dialect;
+  }
+
   public String getName() {
     return name;
   }
@@ -44,22 +50,25 @@
 
   @Override
   public int compareTo(SQLEntry o) {
-    return Integer.compare(this.id, o.id);
+    switch (dialect) {
+      case SPANNER:
+        return timestamp.compareTo(o.timestamp);
+      default:
+        return Integer.compare((int) id, (int) o.id);
+    }
   }
 
   @Override
   public boolean equals(Object o) {
-    if (o == null) {
-      return false;
+    if (o instanceof SQLEntry) {
+      SQLEntry other = (SQLEntry) o;
+      return Objects.equals(id, other.id);
     }
-    if (this.getClass() != o.getClass()) {
-      return false;
-    }
-    return this.id == ((SQLEntry) o).id;
+    return false;
   }
 
   @Override
   public int hashCode() {
-    return SEED + id;
+    return Objects.hash(id);
   }
 }
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLEntryTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLEntryTest.java
index 3fd3217..2fe12da 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLEntryTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLEntryTest.java
@@ -28,21 +28,38 @@
   private SQLEntry entry2;
   private SQLEntry entry3;
   private SQLEntry entry4;
+  private SQLEntry entry5;
+  private SQLEntry entry6;
+  private SQLEntry entry7;
 
   @Before
   public void setUp() {
     Timestamp timestamp = new Timestamp(NOW);
-    entry1 = new SQLEntry("name1", timestamp, "event1", Integer.MAX_VALUE);
-    entry2 = new SQLEntry("name2", timestamp, "event2", Integer.MIN_VALUE);
-    entry3 = new SQLEntry("name3", timestamp, "event3", 0);
-    entry4 = new SQLEntry("name4", timestamp, "event4", Integer.MAX_VALUE);
-  }
-
-  @Test
-  public void testHashCode() throws Exception {
-    assertThat(entry1.hashCode()).isEqualTo(-2147483618);
-    assertThat(entry2.hashCode()).isEqualTo(-2147483617);
-    assertThat(entry3.hashCode()).isEqualTo(31);
+    entry1 = new SQLEntry(SQLDialect.H2, "name1", timestamp, "event1", Integer.MAX_VALUE);
+    entry2 = new SQLEntry(SQLDialect.H2, "name2", timestamp, "event2", Integer.MIN_VALUE);
+    entry3 = new SQLEntry(SQLDialect.H2, "name3", timestamp, "event3", 0);
+    entry4 = new SQLEntry(SQLDialect.H2, "name4", timestamp, "event4", Integer.MAX_VALUE);
+    entry5 =
+        new SQLEntry(
+            SQLDialect.SPANNER,
+            "name5",
+            timestamp,
+            "event1",
+            "b54e6b86-7686-4c3e-a4e4-8edd60ae328e");
+    entry6 =
+        new SQLEntry(
+            SQLDialect.SPANNER,
+            "name6",
+            timestamp,
+            "event2",
+            "0ebc1d7f-5888-45d8-8cd1-244eda611a38");
+    entry7 =
+        new SQLEntry(
+            SQLDialect.SPANNER,
+            "name7",
+            timestamp,
+            "event2",
+            "0ebc1d7f-5888-45d8-8cd1-244eda611a38");
   }
 
   @Test
@@ -73,5 +90,8 @@
     assertThat(entry1.equals("String object")).isFalse();
     assertThat(entry1.equals(entry2)).isFalse();
     assertThat(entry1.equals(entry4)).isTrue();
+    assertThat(entry4.equals(entry5)).isFalse();
+    assertThat(entry5.equals(entry6)).isFalse();
+    assertThat(entry6.equals(entry7)).isTrue();
   }
 }