Add SqlDialect method to drop an index

Only MySQL has a custom implementation of this.

At this point it is easiest to only add a drop method, not an add
method. There are multiple ways add could be implemented, e.g.
automatically creating indexes when scanning over @Query fields.
However, this change is primarily to help Gerrit Code Review migrate
away from gwtorm, for which dropping indexes is more germane.

Change-Id: I2eacad107d8f6e78c77f43f30ca22a62d3a65f02
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectMySQL.java b/src/main/java/com/google/gwtorm/schema/sql/DialectMySQL.java
index c4cb7e1..521a88f 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectMySQL.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectMySQL.java
@@ -96,6 +96,11 @@
   }
 
   @Override
+  protected String getDropIndexSql(String tableName, String name) {
+    return "DROP INDEX " + name + " ON " + tableName;
+  }
+
+  @Override
   protected String getNextSequenceValueSql(final String seqname) {
     return seqname;
   }
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlDialect.java b/src/main/java/com/google/gwtorm/schema/sql/SqlDialect.java
index 164edda..de48b7c 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlDialect.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlDialect.java
@@ -382,6 +382,23 @@
   public abstract void renameColumn(StatementExecutor e, String tableName,
       String fromColumn, ColumnModel col) throws OrmException;
 
+  /**
+   * Drop one index from a table.
+   *
+   * @param e statement to use to execute the SQL command(s).
+   * @param tableName table to rename the index in.
+   * @param name index name.
+   * @throws OrmException the index could not be renamed.
+   */
+  public void dropIndex(StatementExecutor e, String tableName, String name)
+      throws OrmException {
+    e.execute(getDropIndexSql(tableName, name));
+  }
+
+  protected String getDropIndexSql(String tableName, String name) {
+    return "DROP INDEX " + name;
+  }
+
   protected abstract String getNextSequenceValueSql(String seqname);
 
   /**
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectH2Test.java b/src/test/java/com/google/gwtorm/schema/sql/DialectH2Test.java
index 8e86e1f..a94f641 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectH2Test.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectH2Test.java
@@ -132,6 +132,10 @@
     assertEquals(2, s.size());
     assertTrue(s.contains("foo_primary_ind"));
     assertTrue(s.contains("foo_second_ind"));
+
+    dialect.dropIndex(executor, "foo", "foo_primary_ind");
+    dialect.dropIndex(executor, "foo", "foo_second_ind");
+    assertEquals(Collections.emptySet(), dialect.listIndexes(db, "foo"));
   }
 
   @Test
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectMaxDBTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectMaxDBTest.java
index 7b21d10..97937b2 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectMaxDBTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectMaxDBTest.java
@@ -39,6 +39,7 @@
 
 import java.sql.DriverManager;
 import java.sql.SQLException;
+import java.util.Collections;
 import java.util.Properties;
 import java.util.Set;
 
@@ -156,6 +157,10 @@
     assertEquals(2, s.size());
     assertTrue(s.contains("foo_primary_ind"));
     assertTrue(s.contains("foo_second_ind"));
+
+    dialect.dropIndex(executor, "foo", "foo_primary_ind");
+    dialect.dropIndex(executor, "foo", "foo_second_ind");
+    assertEquals(Collections.emptySet(), dialect.listIndexes(db, "foo"));
   }
 
   @Test
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectMySQLTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectMySQLTest.java
index 46f1ec4..032bb33 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectMySQLTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectMySQLTest.java
@@ -149,6 +149,10 @@
     assertEquals(2, s.size());
     assertTrue(s.contains("foo_primary_ind"));
     assertTrue(s.contains("foo_second_ind"));
+
+    dialect.dropIndex(executor, "foo", "foo_primary_ind");
+    dialect.dropIndex(executor, "foo", "foo_second_ind");
+    assertEquals(Collections.emptySet(), dialect.listIndexes(db, "foo"));
   }
 
   @Test
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectOracleSQLTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectOracleSQLTest.java
index 431503d..8bb00ce 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectOracleSQLTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectOracleSQLTest.java
@@ -151,6 +151,10 @@
     assertEquals(2, s.size());
     assertTrue(s.contains("foo_primary_ind"));
     assertTrue(s.contains("foo_second_ind"));
+
+    dialect.dropIndex(executor, "foo", "foo_primary_ind");
+    dialect.dropIndex(executor, "foo", "foo_second_ind");
+    assertEquals(Collections.emptySet(), dialect.listIndexes(db, "foo"));
   }
 
   @Test
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectPostgreSQLTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectPostgreSQLTest.java
index fc6b0a9..cbdc050 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectPostgreSQLTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectPostgreSQLTest.java
@@ -148,6 +148,10 @@
     assertEquals(2, s.size());
     assertTrue(s.contains("foo_primary_ind"));
     assertTrue(s.contains("foo_second_ind"));
+
+    dialect.dropIndex(executor, "foo", "foo_primary_ind");
+    dialect.dropIndex(executor, "foo", "foo_second_ind");
+    assertEquals(Collections.emptySet(), dialect.listIndexes(db, "foo"));
   }
 
   @Test