@@ -15,33 +15,61 @@ def __init__(self, db_manager: DatabaseManager):
1515 self .db_manager = db_manager
1616 self .driver = self .db_manager .get_driver ()
1717
18- def find_by_function_name (self , search_term : str ) -> List [Dict ]:
18+ def find_by_function_name (self , search_term : str , fuzzy_search : bool ) -> List [Dict ]:
1919 """Find functions by name matching using the full-text index."""
20- with self .driver .session () as session :
21- result = session .run ("""
22- CALL db.index.fulltext.queryNodes("code_search_index", $search_term) YIELD node, score
23- WITH node, score
24- WHERE node:Function AND node.name CONTAINS $search_term
25- RETURN node.name as name, node.file_path as file_path, node.line_number as line_number,
26- node.source as source, node.docstring as docstring, node.is_dependency as is_dependency
27- ORDER BY score DESC
28- LIMIT 20
29- """ , search_term = search_term )
30- return [dict (record ) for record in result ]
31-
32- def find_by_class_name (self , search_term : str ) -> List [Dict ]:
20+ if fuzzy_search :
21+ with self .driver .session () as session :
22+ formatted_search_term = f"name:{ search_term } "
23+ result = session .run ("""
24+ CALL db.index.fulltext.queryNodes("code_search_index", $search_term) YIELD node, score
25+ WITH node, score
26+ WHERE node:Function
27+ RETURN node.name as name, node.file_path as file_path, node.line_number as line_number,
28+ node.source as source, node.docstring as docstring, node.is_dependency as is_dependency
29+ ORDER BY score DESC
30+ LIMIT 20
31+ """ , search_term = formatted_search_term )
32+ return [dict (record ) for record in result ]
33+ else :
34+ with self .driver .session () as session :
35+ result = session .run ("""
36+ CALL db.index.fulltext.queryNodes("code_search_index", $search_term) YIELD node, score
37+ WITH node, score
38+ WHERE node:Function AND node.name CONTAINS $search_term
39+ RETURN node.name as name, node.file_path as file_path, node.line_number as line_number,
40+ node.source as source, node.docstring as docstring, node.is_dependency as is_dependency
41+ ORDER BY score DESC
42+ LIMIT 20
43+ """ , search_term = search_term )
44+ return [dict (record ) for record in result ]
45+
46+ def find_by_class_name (self , search_term : str , fuzzy_search : bool ) -> List [Dict ]:
3347 """Find classes by name matching using the full-text index."""
34- with self .driver .session () as session :
35- result = session .run ("""
36- CALL db.index.fulltext.queryNodes("code_search_index", $search_term) YIELD node, score
37- WITH node, score
38- WHERE node:Class AND node.name CONTAINS $search_term
39- RETURN node.name as name, node.file_path as file_path, node.line_number as line_number,
40- node.source as source, node.docstring as docstring, node.is_dependency as is_dependency
41- ORDER BY score DESC
42- LIMIT 20
43- """ , search_term = search_term )
44- return [dict (record ) for record in result ]
48+ if fuzzy_search :
49+ with self .driver .session () as session :
50+ formatted_search_term = f"name:{ search_term } "
51+ result = session .run ("""
52+ CALL db.index.fulltext.queryNodes("code_search_index", $search_term) YIELD node, score
53+ WITH node, score
54+ WHERE node:Class
55+ RETURN node.name as name, node.file_path as file_path, node.line_number as line_number,
56+ node.source as source, node.docstring as docstring, node.is_dependency as is_dependency
57+ ORDER BY score DESC
58+ LIMIT 20
59+ """ , search_term = formatted_search_term )
60+ return [dict (record ) for record in result ]
61+ else :
62+ with self .driver .session () as session :
63+ result = session .run ("""
64+ CALL db.index.fulltext.queryNodes("code_search_index", $search_term) YIELD node, score
65+ WITH node, score
66+ WHERE node:Class AND node.name CONTAINS $search_term
67+ RETURN node.name as name, node.file_path as file_path, node.line_number as line_number,
68+ node.source as source, node.docstring as docstring, node.is_dependency as is_dependency
69+ ORDER BY score DESC
70+ LIMIT 20
71+ """ , search_term = search_term )
72+ return [dict (record ) for record in result ]
4573
4674 def find_by_variable_name (self , search_term : str ) -> List [Dict ]:
4775 """Find variables by name matching"""
@@ -56,7 +84,7 @@ def find_by_variable_name(self, search_term: str) -> List[Dict]:
5684 """ , search_term = search_term , regex_pattern = f"(?i).*{ re .escape (search_term )} .*" )
5785
5886 return [dict (record ) for record in result ]
59-
87+
6088 def find_by_content (self , search_term : str ) -> List [Dict ]:
6189 """Find code by content matching in source or docstrings using the full-text index."""
6290 with self .driver .session () as session :
@@ -77,15 +105,20 @@ def find_by_content(self, search_term: str) -> List[Dict]:
77105 LIMIT 20
78106 """ , search_term = search_term )
79107 return [dict (record ) for record in result ]
80-
81- def find_related_code (self , user_query : str ) -> Dict [str , Any ]:
108+
109+ def find_related_code (self , user_query : str , fuzzy_search : bool , edit_distance : int ) -> Dict [str , Any ]:
82110 """Find code related to a query using multiple search strategies"""
111+ if fuzzy_search :
112+ user_query_normalized = f"{ " " .join (map (lambda x : f'{ x } ~{ edit_distance } ' , user_query .split (' ' )))} "
113+ else :
114+ user_query_normalized = user_query
115+
83116 results = {
84- "query" : user_query ,
85- "functions_by_name" : self .find_by_function_name (user_query ),
86- "classes_by_name" : self .find_by_class_name (user_query ),
87- "variables_by_name" : self .find_by_variable_name (user_query ),
88- "content_matches" : self .find_by_content (user_query )
117+ "query" : user_query_normalized ,
118+ "functions_by_name" : self .find_by_function_name (user_query_normalized , fuzzy_search ),
119+ "classes_by_name" : self .find_by_class_name (user_query_normalized , fuzzy_search ),
120+ "variables_by_name" : self .find_by_variable_name (user_query ), # no fuzzy for variables as they are not using full-text index
121+ "content_matches" : self .find_by_content (user_query_normalized )
89122 }
90123
91124 all_results = []
@@ -763,4 +796,4 @@ def list_indexed_repositories(self) -> List[Dict]:
763796 RETURN r.name as name, r.path as path, r.is_dependency as is_dependency
764797 ORDER BY r.name
765798 """ )
766- return [dict (record ) for record in result ]
799+ return [dict (record ) for record in result ]
0 commit comments