yoursdvniel commited on
Commit
a97fbfc
·
verified ·
1 Parent(s): e45b931

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +12 -10
main.py CHANGED
@@ -9,6 +9,7 @@ from role_access import get_allowed_collections
9
  from data_fetcher import fetch_data_from_firestore
10
  from data_planner import determine_data_requirements # 🧠 Gemini planner
11
  from resolver import resolve_user_context
 
12
  from schema_utils import has_field, resolve_field
13
 
14
  app = Flask(__name__)
@@ -17,31 +18,32 @@ CORS(app)
17
  db = get_firestore_client()
18
 
19
  # 🔧 Normalize Gemini plan into proper Firestore fetch format
20
-
21
-
22
- def normalize_plan(plan: dict) -> dict:
23
  filters = plan.get("filters", {}) or {}
24
  planned_cols = plan.get("collections", []) or []
25
 
26
  def canonical_value(key, val):
 
 
27
  if key == "status" and val == "running":
28
  return "active"
29
  return val
30
 
31
  collections_out = []
32
  for col in planned_cols:
33
- # Allow both string names or objects {name, fields}
34
  name = col["name"] if isinstance(col, dict) else col
35
  col_filters = []
36
  for k, v in filters.items():
37
  canon_key = resolve_field(name, k)
38
  if has_field(name, canon_key):
39
- col_filters.append({"field": canon_key, "op": "==", "value": canonical_value(k, v)})
40
- collections_out.append({
41
- "name": name,
42
- "filters": col_filters,
43
- "limit": 50
44
- })
 
45
 
46
  return {"collections": collections_out}
47
 
 
9
  from data_fetcher import fetch_data_from_firestore
10
  from data_planner import determine_data_requirements # 🧠 Gemini planner
11
  from resolver import resolve_user_context
12
+ from typing import Optional, Dict, Any
13
  from schema_utils import has_field, resolve_field
14
 
15
  app = Flask(__name__)
 
18
  db = get_firestore_client()
19
 
20
  # 🔧 Normalize Gemini plan into proper Firestore fetch format
21
+ def normalize_plan(plan: dict, token_map: Optional[Dict[str, Any]] = None) -> dict:
22
+ token_map = token_map or {}
 
23
  filters = plan.get("filters", {}) or {}
24
  planned_cols = plan.get("collections", []) or []
25
 
26
  def canonical_value(key, val):
27
+ if isinstance(val, str) and val in token_map:
28
+ val = token_map[val] # 🔁 replace {{participantId}} etc.
29
  if key == "status" and val == "running":
30
  return "active"
31
  return val
32
 
33
  collections_out = []
34
  for col in planned_cols:
 
35
  name = col["name"] if isinstance(col, dict) else col
36
  col_filters = []
37
  for k, v in filters.items():
38
  canon_key = resolve_field(name, k)
39
  if has_field(name, canon_key):
40
+ col_filters.append({
41
+ "field": canon_key,
42
+ "op": "==",
43
+ "value": canonical_value(k, v)
44
+ })
45
+ # else: skip invalid field for this collection
46
+ collections_out.append({"name": name, "filters": col_filters, "limit": 50})
47
 
48
  return {"collections": collections_out}
49