wenruifan commited on
Commit
9b67c39
·
1 Parent(s): 0424350

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(list(manager.get_all_chains()))
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 get_all_chains(self) -> Set[str]:
70
- """Return unique A-side chain identifiers as 'PDBID_ChainID' from node table."""
71
- from app.protein import tsv_loader
72
- index = tsv_loader._get_index()
73
- return {f"{pdb.upper()}_{chain}" for pdb, chain in index.keys()}
 
 
 
 
 
 
 
 
 
 
 
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."""