Skip to content

Commit 77e2a2b

Browse files
authored
Merge pull request #191 from blarApp/dev
Dev
2 parents 48bdd8e + 8d04396 commit 77e2a2b

6 files changed

Lines changed: 164 additions & 15 deletions

File tree

blarify/code_hierarchy/languages/go_definitions.py

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,13 @@ def get_parsers_for_extensions() -> Dict[str, Parser]:
2424
def should_create_node(node: Node) -> bool:
2525
return LanguageDefinitions._should_create_node_base_implementation(
2626
node,
27-
["type_declaration", "method_declaration", "function_declaration"],
27+
["type_spec", "type_alias", "method_declaration", "function_declaration"],
2828
)
2929

3030
def get_identifier_node(node: Node) -> Node:
31-
if node.type == "type_declaration":
32-
for child in node.named_children:
33-
if child.type == "type_spec" or "type_alias":
34-
node = child
35-
3631
return LanguageDefinitions._get_identifier_node_base_implementation(node)
3732

3833
def get_body_node(node: Node) -> Node:
39-
if node.type == "type_declaration":
40-
for child in node.named_children:
41-
if child.type == "type_spec":
42-
node = child
43-
4434
return LanguageDefinitions._get_body_node_base_implementation(node)
4535

4636
def get_relationship_type(node: GraphNode, node_in_point_reference: Node) -> Optional[FoundRelationshipScope]:
@@ -51,7 +41,8 @@ def get_relationship_type(node: GraphNode, node_in_point_reference: Node) -> Opt
5141

5242
def get_node_label_from_type(type: str) -> NodeLabels:
5343
return {
54-
"type_declaration": NodeLabels.CLASS,
44+
"type_spec": NodeLabels.CLASS,
45+
"type_alias": NodeLabels.CLASS,
5546
"method_declaration": NodeLabels.FUNCTION,
5647
"function_declaration": NodeLabels.FUNCTION,
5748
}[type]

blarify/db_managers/db_manager.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class AbstractDbManager:
2+
def close(self):
3+
"""Close the connection to the database."""
4+
raise NotImplementedError
5+
6+
def save_graph(self, nodes, edges):
7+
"""Save nodes and edges to the database."""
8+
raise NotImplementedError
9+
10+
def create_nodes(self, nodeList):
11+
"""Create nodes in the database."""
12+
raise NotImplementedError
13+
14+
def create_edges(self, edgesList):
15+
"""Create edges between nodes in the database."""
16+
raise NotImplementedError
17+
18+
def detatch_delete_nodes_with_path(self, path):
19+
"""Detach and delete nodes matching the given path."""
20+
raise NotImplementedError
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import os
2+
import time
3+
from typing import Any, List
4+
import logging
5+
6+
from dotenv import load_dotenv
7+
from falkordb import FalkorDB, exceptions
8+
9+
logger = logging.getLogger(__name__)
10+
11+
load_dotenv()
12+
13+
14+
class FalkorDBManager:
15+
entity_id: str
16+
repo_id: str
17+
db: FalkorDB
18+
19+
def __init__(
20+
self,
21+
repo_id: str = None,
22+
entity_id: str = None,
23+
uri: str = None,
24+
user: str = None,
25+
password: str = None,
26+
):
27+
host = uri or os.getenv("FALKORDB_URI", "localhost")
28+
port = int(os.getenv("FALKORDB_PORT", 6379))
29+
user = user or os.getenv("FALKORDB_USERNAME")
30+
password = password or os.getenv("FALKORDB_PASSWORD")
31+
32+
self.db = FalkorDB(host=host, port=port, username=user, password=password)
33+
34+
self.repo_id = repo_id if repo_id is not None else "default_repo"
35+
self.entity_id = entity_id if entity_id is not None else "default_user"
36+
37+
def close(self):
38+
# Close the connection to the database
39+
self.db.close()
40+
41+
def save_graph(self, nodes: List[Any], edges: List[Any]):
42+
self.create_nodes(nodes)
43+
self.create_edges(edges)
44+
45+
def create_nodes(self, nodeList: List[Any]):
46+
# Function to create nodes in the FalkorDB database
47+
graph = self.db.select_graph(self.repo_id)
48+
for node in nodeList:
49+
labels = ":".join(node.get("extra_labels", []) + [node["type"], "NODE"])
50+
attributes = node.get("attributes", {})
51+
attributes.update({"repoId": self.repo_id, "entityId": self.entity_id})
52+
# Construct parameterized query
53+
cypher_query = f"CREATE (n:{labels} $props)"
54+
graph.query(cypher_query, params={"props": attributes})
55+
56+
def create_edges(self, edgesList: List[Any]):
57+
# Function to create edges between nodes in the FalkorDB database
58+
graph = self.db.select_graph(self.repo_id)
59+
for edge in edgesList:
60+
# Construct parameterized query
61+
cypher_query = (
62+
"MATCH (a:NODE {node_id: $sourceId}), "
63+
"(b:NODE {node_id: $targetId}) "
64+
"CREATE (a)-[r:$type {scopeText: $scopeText}]->(b)"
65+
)
66+
graph.query(
67+
cypher_query,
68+
params={
69+
"sourceId": edge["sourceId"],
70+
"targetId": edge["targetId"],
71+
"type": edge["type"],
72+
"scopeText": edge["scopeText"],
73+
},
74+
)
75+
76+
def detach_delete_nodes_with_path(self, path: str):
77+
graph = self.db.select_graph(self.repo_id)
78+
# Construct parameterized query
79+
cypher_query = "MATCH (n {path: $path}) DETACH DELETE n"
80+
result = graph.query(cypher_query, params={"path": path})
81+
return result.result_set

blarify/examples/graph_builder.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from blarify.prebuilt.graph_builder import GraphBuilder
22
from blarify.db_managers.neo4j_manager import Neo4jManager
3+
from blarify.db_managers.falkordb_manager import FalkorDBManager
34

45
import dotenv
56
import os
@@ -12,7 +13,8 @@ def build(root_path: str = None):
1213
relationships = graph.get_relationships_as_objects()
1314
nodes = graph.get_nodes_as_objects()
1415

15-
save_to_neo4j(relationships, nodes)
16+
# save_to_neo4j(relationships, nodes)
17+
save_to_falkordb(relationships, nodes)
1618

1719

1820
def save_to_neo4j(relationships, nodes):
@@ -23,6 +25,14 @@ def save_to_neo4j(relationships, nodes):
2325
graph_manager.close()
2426

2527

28+
def save_to_falkordb(relationships, nodes):
29+
graph_manager = FalkorDBManager(repo_id="repo", entity_id="organization")
30+
31+
print(f"Saving graph with {len(nodes)} nodes and {len(relationships)} relationships")
32+
graph_manager.save_graph(nodes, relationships)
33+
graph_manager.close()
34+
35+
2636
if __name__ == "__main__":
2737
import logging
2838

poetry.lock

Lines changed: 48 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ tree-sitter-typescript = "^0.23.2"
2323
tree-sitter-c-sharp = "^0.23.1"
2424
multilspy = {git = "https://github.com/blarApp/multilspy.git"}
2525
tree-sitter-go = "^0.23.4"
26+
falkordb = "^1.0.10"
2627

2728

2829
[build-system]

0 commit comments

Comments
 (0)