From 6c7e2749688100a10ac7de1d422b8c4cee98f393 Mon Sep 17 00:00:00 2001
From: Kevin Morris <kevr@0cost.org>
Date: Sat, 13 Aug 2022 19:52:50 -0700
Subject: [PATCH] feat(db): add an index for SSHPubKeys.PubKey (#2)

Speeds up SSHPubKeys.PubKey searches in a larger database.

Fixed form of the original commit which was reverted,
1a7f6e1fa9f500fead3650ef1e4ec9521884e1d8

Signed-off-by: Kevin Morris <kevr@0cost.org>
---
 aurweb/schema.py                              |  2 ++
 ...d70103d2e82_add_sshpubkeys_pubkey_index.py | 35 +++++++++++++++++++
 test/test_migration.py                        | 23 ++++++++++++
 3 files changed, 60 insertions(+)
 create mode 100644 migrations/versions/dd70103d2e82_add_sshpubkeys_pubkey_index.py
 create mode 100644 test/test_migration.py

diff --git a/aurweb/schema.py b/aurweb/schema.py
index d2644541d..3d8369c94 100644
--- a/aurweb/schema.py
+++ b/aurweb/schema.py
@@ -87,6 +87,8 @@ SSHPubKeys = Table(
     Column('UserID', ForeignKey('Users.ID', ondelete='CASCADE'), nullable=False),
     Column('Fingerprint', String(44), primary_key=True),
     Column('PubKey', String(4096), nullable=False),
+    Index('SSHPubKeysUserID', 'UserID'),
+    Index('SSHPubKeysPubKey', 'PubKey'),
     mysql_engine='InnoDB', mysql_charset='utf8mb4', mysql_collate='utf8mb4_bin',
 )
 
diff --git a/migrations/versions/dd70103d2e82_add_sshpubkeys_pubkey_index.py b/migrations/versions/dd70103d2e82_add_sshpubkeys_pubkey_index.py
new file mode 100644
index 000000000..7d3f4b59f
--- /dev/null
+++ b/migrations/versions/dd70103d2e82_add_sshpubkeys_pubkey_index.py
@@ -0,0 +1,35 @@
+"""add SSHPubKeys.PubKey index
+
+Revision ID: dd70103d2e82
+Revises: d64e5571bc8d
+Create Date: 2022-08-12 21:30:26.155465
+
+"""
+import traceback
+
+from alembic import op
+
+# revision identifiers, used by Alembic.
+revision = 'dd70103d2e82'
+down_revision = 'd64e5571bc8d'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    try:
+        op.create_index("SSHPubKeysUserID", "SSHPubKeys", ["UserID"])
+    except Exception:
+        traceback.print_exc()
+        print("failing silently...")
+
+    try:
+        op.create_index("SSHPubKeysPubKey", "SSHPubKeys", ["PubKey"])
+    except Exception:
+        traceback.print_exc()
+        print("failing silently...")
+
+
+def downgrade():
+    op.drop_index("SSHPubKeysPubKey", "SSHPubKeys")
+    op.drop_index("SSHPubKeysUserID", "SSHPubKeys")
diff --git a/test/test_migration.py b/test/test_migration.py
new file mode 100644
index 000000000..cf8702fab
--- /dev/null
+++ b/test/test_migration.py
@@ -0,0 +1,23 @@
+import pytest
+
+from sqlalchemy import inspect
+
+from aurweb.db import get_engine
+from aurweb.models.ssh_pub_key import SSHPubKey
+
+
+@pytest.fixture(autouse=True)
+def setup(db_test):
+    return
+
+
+def test_sshpubkeys_pubkey_index():
+    insp = inspect(get_engine())
+    indexes = insp.get_indexes(SSHPubKey.__tablename__)
+
+    found_pk = False
+    for idx in indexes:
+        if idx.get("name") == "SSHPubKeysPubKey":
+            assert idx.get("column_names") == ["PubKey"]
+            found_pk = True
+    assert found_pk
-- 
GitLab