From e61987c8df46328bba38a42ed2b69a2c9dd10d5f Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 23 Dec 2025 13:34:04 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20Bolt:=20Optimize=20pincode=20and=20?= =?UTF-8?q?MLA=20lookup=20to=20O(1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactored `backend/maharashtra_locator.py` to cache data as dictionaries keyed by lookup fields (pincode/constituency) instead of lists. This reduces lookup time complexity from O(n) to O(1). Preserved "first match" behavior for duplicate keys. --- backend/maharashtra_locator.py | 62 ++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/backend/maharashtra_locator.py b/backend/maharashtra_locator.py index e228b1e3..f67596a0 100644 --- a/backend/maharashtra_locator.py +++ b/backend/maharashtra_locator.py @@ -11,12 +11,12 @@ @lru_cache(maxsize=1) -def load_maharashtra_pincode_data() -> list: +def load_maharashtra_pincode_data() -> Dict[str, Dict[str, Any]]: """ Load and cache Maharashtra pincode to constituency mapping data. Returns: - list: List of pincode mapping dictionaries + dict: Dictionary of pincode mapping dictionaries keyed by pincode """ file_path = os.path.join( os.path.dirname(__file__), @@ -25,16 +25,26 @@ def load_maharashtra_pincode_data() -> list: ) with open(file_path, "r", encoding="utf-8") as f: - return json.load(f) + data_list = json.load(f) + + # Convert list to dict for O(1) lookup + # Iterate forward and check existence to preserve first-match precedence + data_dict = {} + for entry in data_list: + pincode = entry.get("pincode") + if pincode and pincode not in data_dict: + data_dict[pincode] = entry + + return data_dict @lru_cache(maxsize=1) -def load_maharashtra_mla_data() -> list: +def load_maharashtra_mla_data() -> Dict[str, Dict[str, Any]]: """ Load and cache Maharashtra MLA information data. Returns: - list: List of MLA information dictionaries + dict: Dictionary of MLA information dictionaries keyed by assembly constituency """ file_path = os.path.join( os.path.dirname(__file__), @@ -43,7 +53,15 @@ def load_maharashtra_mla_data() -> list: ) with open(file_path, "r", encoding="utf-8") as f: - return json.load(f) + data_list = json.load(f) + + data_dict = {} + for entry in data_list: + constituency = entry.get("assembly_constituency") + if constituency and constituency not in data_dict: + data_dict[constituency] = entry + + return data_dict def find_constituency_by_pincode(pincode: str) -> Optional[Dict[str, Any]]: @@ -61,13 +79,13 @@ def find_constituency_by_pincode(pincode: str) -> Optional[Dict[str, Any]]: pincode_data = load_maharashtra_pincode_data() - for entry in pincode_data: - if entry.get("pincode") == pincode: - return { - "district": entry.get("district"), - "state": entry.get("state"), - "assembly_constituency": entry.get("assembly_constituency") - } + entry = pincode_data.get(pincode) + if entry: + return { + "district": entry.get("district"), + "state": entry.get("state"), + "assembly_constituency": entry.get("assembly_constituency") + } return None @@ -87,14 +105,14 @@ def find_mla_by_constituency(constituency_name: str) -> Optional[Dict[str, Any]] mla_data = load_maharashtra_mla_data() - for entry in mla_data: - if entry.get("assembly_constituency") == constituency_name: - return { - "mla_name": entry.get("mla_name"), - "party": entry.get("party"), - "phone": entry.get("phone"), - "email": entry.get("email"), - "twitter": entry.get("twitter") - } + entry = mla_data.get(constituency_name) + if entry: + return { + "mla_name": entry.get("mla_name"), + "party": entry.get("party"), + "phone": entry.get("phone"), + "email": entry.get("email"), + "twitter": entry.get("twitter") + } return None