from app.repositories.neo4j_repository import Neo4jRepository class GraphService: def __init__(self): self.neo = Neo4jRepository() def build( self, repository_id: str, resolved, ): for file in resolved: self.neo.merge_file( repository_id=repository_id, path=file["path"], ) self._create_imports( repository_id, file, ) self._create_functions( repository_id, file, ) self._create_classes( repository_id, file, ) self._create_declares( repository_id, file, ) self._create_has_methods( repository_id, file, ) self._create_edges( repository_id, file, ) self.neo.create_vector_indexes() def _create_functions( self, repository_id: str, file, ): for function in file["functions"]: self.neo.merge_function( repository_id=repository_id, qualified_name=function["qualified_name"], name=function["name"], source_code=function["source_code"], ) def _create_classes( self, repository_id: str, file, ): for cls in file["classes"]: self.neo.merge_class( repository_id=repository_id, qualified_name=cls["qualified_name"], name=cls["name"], source_code=cls["source_code"], ) for method in cls["methods"]: self.neo.merge_function( repository_id=repository_id, qualified_name=method["qualified_name"], name=method["name"], source_code=method["source_code"], ) def _create_declares( self, repository_id: str, file, ): for function in file["functions"]: self.neo.create_declares( repository_id=repository_id, file_path=file["path"], qualified_name=function["qualified_name"], ) for cls in file["classes"]: self.neo.create_declares( repository_id=repository_id, file_path=file["path"], qualified_name=cls["qualified_name"], ) def _create_has_methods( self, repository_id: str, file, ): for cls in file["classes"]: for method in cls["methods"]: self.neo.create_has_method( repository_id=repository_id, class_name=cls["qualified_name"], method_name=method["qualified_name"], ) def _create_imports( self, repository_id: str, file, ): for imp in file["imports"]: module = imp["module"] if not module: continue self.neo.merge_module( repository_id=repository_id, module=module, ) self.neo.create_import( repository_id=repository_id, file_path=file["path"], module=module, symbol=imp["name"], alias=imp["alias"], ) def _create_edges( self, repository_id: str, file, ): self._create_function_edges( repository_id, file["functions"], ) for cls in file["classes"]: self._create_function_edges( repository_id, cls["methods"], ) def _create_function_edges( self, repository_id: str, functions, ): for function in functions: source = function["qualified_name"] for call in function["calls"]: target = call["qualified_name"] if target is None: continue if target.startswith("app."): self.neo.merge_call( repository_id=repository_id, source=source, target=target, ) else: self.neo.merge_external_function( repository_id=repository_id, qualified_name=target, ) self.neo.create_belongs_to( repository_id=repository_id, qualified_name=target, ) self.neo.merge_call( repository_id=repository_id, source=source, target=target, )