From 8211ce7ae3a2beeb7cc1789cfe2e0784d390fae9 Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Thu, 21 Sep 2017 11:05:16 +0100
Subject: [PATCH] Add some simple indexes to the DB.

---
 .../briarproject/bramble/db/JdbcDatabase.java | 44 ++++++++++++++++++-
 1 file changed, 43 insertions(+), 1 deletion(-)

diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java
index 7ae01fe47a..48afdb38a5 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java
@@ -232,6 +232,30 @@ abstract class JdbcDatabase implements Database<Connection> {
 					+ " REFERENCES transports (transportId)"
 					+ " ON DELETE CASCADE)";
 
+	private static final String INDEX_CONTACTS_BY_AUTHOR_ID =
+			"CREATE INDEX IF NOT EXISTS contactsByAuthorId"
+					+ " ON contacts (authorId)";
+
+	private static final String INDEX_MESSAGES_BY_GROUP_ID =
+			"CREATE INDEX IF NOT EXISTS messagesByGroupId"
+					+ " ON messages (groupId)";
+
+	private static final String INDEX_OFFERS_BY_CONTACT_ID =
+			"CREATE INDEX IF NOT EXISTS offersByContactId"
+					+ " ON offers (contactId)";
+
+	private static final String INDEX_GROUPS_BY_CLIENT_ID =
+			"CREATE INDEX IF NOT EXISTS groupsByClientId"
+					+ " ON groups (clientId)";
+
+	private static final String INDEX_MESSAGE_METADATA_BY_MESSAGE_ID =
+			"CREATE INDEX IF NOT EXISTS messageMetadataByMessageId"
+					+ " ON messageMetadata (messageId)";
+
+	private static final String INDEX_GROUP_METADATA_BY_GROUP_ID =
+			"CREATE INDEX IF NOT EXISTS groupMetadataByGroupId"
+					+ " ON groupMetadata (groupId)";
+
 	private static final Logger LOG =
 			Logger.getLogger(JdbcDatabase.class.getName());
 
@@ -267,7 +291,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 		} catch (ClassNotFoundException e) {
 			throw new DbException(e);
 		}
-		// Open the database and create the tables if necessary
+		// Open the database and create the tables and indexes if necessary
 		Connection txn = startTransaction();
 		try {
 			if (reopen) {
@@ -276,6 +300,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 				createTables(txn);
 				storeSchemaVersion(txn);
 			}
+			createIndexes(txn);
 			commitTransaction(txn);
 		} catch (DbException e) {
 			abortTransaction(txn);
@@ -340,6 +365,23 @@ abstract class JdbcDatabase implements Database<Connection> {
 		}
 	}
 
+	private void createIndexes(Connection txn) throws DbException {
+		Statement s = null;
+		try {
+			s = txn.createStatement();
+			s.executeUpdate(INDEX_CONTACTS_BY_AUTHOR_ID);
+			s.executeUpdate(INDEX_MESSAGES_BY_GROUP_ID);
+			s.executeUpdate(INDEX_OFFERS_BY_CONTACT_ID);
+			s.executeUpdate(INDEX_GROUPS_BY_CLIENT_ID);
+			s.executeUpdate(INDEX_MESSAGE_METADATA_BY_MESSAGE_ID);
+			s.executeUpdate(INDEX_GROUP_METADATA_BY_GROUP_ID);
+			s.close();
+		} catch (SQLException e) {
+			tryToClose(s);
+			throw new DbException(e);
+		}
+	}
+
 	private String insertTypeNames(String s) {
 		s = s.replaceAll("HASH", hashType);
 		s = s.replaceAll("BINARY", binaryType);
-- 
GitLab