diff --git a/src/gausse/storage/database.py b/src/gausse/storage/database.py index 51657da..86533bc 100644 --- a/src/gausse/storage/database.py +++ b/src/gausse/storage/database.py @@ -65,11 +65,19 @@ def count_runs(conn: sqlite3.Connection, feasible: bool | None = None) -> int: return cursor.fetchone()[0] +def fetch_run_by_id(conn: sqlite3.Connection, run_id: str) -> RunRecord | None: + """Одна запись по PRIMARY KEY — быстро (без загрузки всей таблицы).""" + conn.row_factory = sqlite3.Row + row = conn.execute("SELECT * FROM runs WHERE run_id = ?", (run_id,)).fetchone() + return _row_to_record(row) if row is not None else None + + def fetch_runs( conn: sqlite3.Connection, feasible: bool | None = None, min_efficiency: float | None = None, order_by_efficiency_desc: bool = False, + order_by_velocity_desc: bool = False, limit: int | None = None, ) -> list[RunRecord]: conn.row_factory = sqlite3.Row @@ -81,7 +89,9 @@ def fetch_runs( if min_efficiency is not None: query += " AND efficiency >= ?" params.append(min_efficiency) - if order_by_efficiency_desc: + if order_by_velocity_desc: + query += " ORDER BY exit_velocity_mps DESC" + elif order_by_efficiency_desc: query += " ORDER BY efficiency DESC" if limit is not None: query += " LIMIT ?" diff --git a/src/gausse/storage/schema.py b/src/gausse/storage/schema.py index fb2524e..a8d76a7 100644 --- a/src/gausse/storage/schema.py +++ b/src/gausse/storage/schema.py @@ -29,6 +29,7 @@ CREATE TABLE IF NOT EXISTS runs ( CREATE_INDEXES_SQL = [ "CREATE INDEX IF NOT EXISTS idx_runs_feasible ON runs(feasible)", "CREATE INDEX IF NOT EXISTS idx_runs_efficiency ON runs(efficiency)", + "CREATE INDEX IF NOT EXISTS idx_runs_velocity ON runs(exit_velocity_mps)", "CREATE INDEX IF NOT EXISTS idx_runs_search_mode ON runs(search_mode)", ] diff --git a/src/gausse/web/page.py b/src/gausse/web/page.py index f182874..266d5c0 100644 --- a/src/gausse/web/page.py +++ b/src/gausse/web/page.py @@ -27,6 +27,9 @@ PAGE_HTML = r""" th,td { text-align:left; padding:7px 8px; border-bottom:1px solid #21262d; } th { color:#8b949e; font-weight:600; font-size:12px; } tr.clk:hover { background:#1c2230; cursor:pointer; } + .tgl { font-size:11px; padding:2px 8px; margin-left:6px; background:#21262d; color:#8b949e; + border:1px solid #30363d; border-radius:6px; cursor:pointer; text-transform:none; letter-spacing:0; } + .tgl.active { background:#238636; color:#fff; border-color:#238636; } .bar { height:16px; background:#238636; border-radius:3px; } .hist td { padding:3px 8px; } .log { background:#0a0d12; border:1px solid #30363d; border-radius:8px; padding:12px; @@ -57,12 +60,15 @@ PAGE_HTML = r"""
| КПД | Скор., м/с | Ступ. | Цена, ₽ | Режим |
|---|