Avoid full node index load for filters
Browse files
backend/app/protein/api/routes/protein.py
CHANGED
|
@@ -62,7 +62,7 @@ async def get_filters():
|
|
| 62 |
"""Get available filter options and ranges."""
|
| 63 |
try:
|
| 64 |
manager = _require_data_manager()
|
| 65 |
-
chains = sorted(
|
| 66 |
fd = manager.get_filters_data()
|
| 67 |
|
| 68 |
return FilterOptions(
|
|
|
|
| 62 |
"""Get available filter options and ranges."""
|
| 63 |
try:
|
| 64 |
manager = _require_data_manager()
|
| 65 |
+
chains = sorted(manager.get_chain_sample())
|
| 66 |
fd = manager.get_filters_data()
|
| 67 |
|
| 68 |
return FilterOptions(
|
backend/app/protein/data_loader.py
CHANGED
|
@@ -66,11 +66,22 @@ class DataManager:
|
|
| 66 |
raise RuntimeError("Call load_data() first.")
|
| 67 |
return connect_readonly(self.db_path)
|
| 68 |
|
| 69 |
-
def
|
| 70 |
-
"""Return
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 74 |
|
| 75 |
def get_filters_data(self) -> Dict[str, Any]:
|
| 76 |
"""Return aggregated ranges for filter UI."""
|
|
|
|
| 66 |
raise RuntimeError("Call load_data() first.")
|
| 67 |
return connect_readonly(self.db_path)
|
| 68 |
|
| 69 |
+
def get_chain_sample(self, limit: int = 500) -> Set[str]:
|
| 70 |
+
"""Return a small chain sample without loading the full node index."""
|
| 71 |
+
conn = self._connect()
|
| 72 |
+
try:
|
| 73 |
+
cur = conn.cursor()
|
| 74 |
+
cur.execute(
|
| 75 |
+
"SELECT pdb_id, auth_asym_id FROM node "
|
| 76 |
+
"WHERE pdb_id IS NOT NULL AND auth_asym_id IS NOT NULL LIMIT ?",
|
| 77 |
+
(limit,),
|
| 78 |
+
)
|
| 79 |
+
return {
|
| 80 |
+
f"{str(pdb).upper()}_{str(chain).upper()}"
|
| 81 |
+
for pdb, chain in cur.fetchall()
|
| 82 |
+
}
|
| 83 |
+
finally:
|
| 84 |
+
conn.close()
|
| 85 |
|
| 86 |
def get_filters_data(self) -> Dict[str, Any]:
|
| 87 |
"""Return aggregated ranges for filter UI."""
|