From e25e7098f618a1305876dcb3f2d45e2975baebd9 Mon Sep 17 00:00:00 2001 From: mwiegand Date: Tue, 12 May 2026 21:27:01 +0200 Subject: [PATCH] refactor(live-state): drop redundant ix_sps_server_recent index MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The two indexes ix_sps_server_open and ix_sps_server_recent were byte-identical because SQLAlchemy's Index(name, *cols) form drops the DESC ordering the spec intended. Rather than reach for text("left_at DESC"), drop the second index entirely — SQLite scans the ASC index backwards at no measurable cost. Spec and plan updated to match. Co-Authored-By: Claude Sonnet 4.6 --- docs/superpowers/plans/2026-05-12-server-live-state-display.md | 3 --- .../specs/2026-05-12-server-live-state-display-design.md | 3 +-- l4d2web/alembic/versions/0010_server_live_state.py | 2 -- l4d2web/models.py | 1 - 4 files changed, 1 insertion(+), 8 deletions(-) diff --git a/docs/superpowers/plans/2026-05-12-server-live-state-display.md b/docs/superpowers/plans/2026-05-12-server-live-state-display.md index 93355cf..5db588c 100644 --- a/docs/superpowers/plans/2026-05-12-server-live-state-display.md +++ b/docs/superpowers/plans/2026-05-12-server-live-state-display.md @@ -194,7 +194,6 @@ class ServerPlayerSession(Base): __tablename__ = "server_player_session" __table_args__ = ( Index("ix_sps_server_open", "server_id", "left_at"), - Index("ix_sps_server_recent", "server_id", "left_at"), Index("ix_sps_steam_history", "steam_id_64", "joined_at"), {"sqlite_autoincrement": True}, ) @@ -311,7 +310,6 @@ def upgrade() -> None: sqlite_autoincrement=True, ) op.create_index("ix_sps_server_open", "server_player_session", ["server_id", "left_at"]) - op.create_index("ix_sps_server_recent", "server_player_session", ["server_id", "left_at"]) op.create_index( "ix_sps_steam_history", "server_player_session", ["steam_id_64", "joined_at"] ) @@ -329,7 +327,6 @@ def upgrade() -> None: def downgrade() -> None: op.drop_table("steam_user_profile") op.drop_index("ix_sps_steam_history", table_name="server_player_session") - op.drop_index("ix_sps_server_recent", table_name="server_player_session") op.drop_index("ix_sps_server_open", table_name="server_player_session") op.drop_table("server_player_session") op.drop_index("ix_sls_server_started", table_name="server_live_state") diff --git a/docs/superpowers/specs/2026-05-12-server-live-state-display-design.md b/docs/superpowers/specs/2026-05-12-server-live-state-display-design.md index 43a12f0..e52f8a0 100644 --- a/docs/superpowers/specs/2026-05-12-server-live-state-display-design.md +++ b/docs/superpowers/specs/2026-05-12-server-live-state-display-design.md @@ -99,8 +99,7 @@ CREATE TABLE server_player_session ( max_ping INTEGER NOT NULL ); CREATE INDEX ix_sps_server_open ON server_player_session(server_id, left_at); -CREATE INDEX ix_sps_server_recent ON server_player_session(server_id, left_at DESC); -CREATE INDEX ix_sps_steam_history ON server_player_session(steam_id_64, joined_at DESC); +CREATE INDEX ix_sps_steam_history ON server_player_session(steam_id_64, joined_at); ``` - `joined_at` is **backfilled from RCON's `connected` duration** on first sighting (`joined_at = now - connected_seconds`). This heals brief polling gaps and survives web restarts: even if we just started polling, we know when the still-connected players actually joined. diff --git a/l4d2web/alembic/versions/0010_server_live_state.py b/l4d2web/alembic/versions/0010_server_live_state.py index ec3d770..dd866e9 100644 --- a/l4d2web/alembic/versions/0010_server_live_state.py +++ b/l4d2web/alembic/versions/0010_server_live_state.py @@ -84,7 +84,6 @@ def upgrade() -> None: sqlite_autoincrement=True, ) op.create_index("ix_sps_server_open", "server_player_session", ["server_id", "left_at"]) - op.create_index("ix_sps_server_recent", "server_player_session", ["server_id", "left_at"]) op.create_index( "ix_sps_steam_history", "server_player_session", ["steam_id_64", "joined_at"] ) @@ -102,7 +101,6 @@ def upgrade() -> None: def downgrade() -> None: op.drop_table("steam_user_profile") op.drop_index("ix_sps_steam_history", table_name="server_player_session") - op.drop_index("ix_sps_server_recent", table_name="server_player_session") op.drop_index("ix_sps_server_open", table_name="server_player_session") op.drop_table("server_player_session") op.drop_index("ix_sls_server_started", table_name="server_live_state") diff --git a/l4d2web/models.py b/l4d2web/models.py index 1086d64..55cd3fc 100644 --- a/l4d2web/models.py +++ b/l4d2web/models.py @@ -201,7 +201,6 @@ class ServerPlayerSession(Base): __tablename__ = "server_player_session" __table_args__ = ( Index("ix_sps_server_open", "server_id", "left_at"), - Index("ix_sps_server_recent", "server_id", "left_at"), Index("ix_sps_steam_history", "steam_id_64", "joined_at"), {"sqlite_autoincrement": True}, )