Skip to content

Commit 5fcc0f4

Browse files
authored
update to adj assertions, remove _rev concept (#37)
* initial commit * attempt: try to cache the update data * cleanup * update assertions * new: _rev assertions, `newDict` assertions this is currently failing on the `_rev` assertions for digraph & graph * Remove `_rev` concept (#39) * initial commit | remove `_rev` logic * remove: `root` concept * cleanup: `del "_rev"` * fix: lint * cleanup test * fix: return clause
1 parent 04007e4 commit 5fcc0f4

File tree

5 files changed

+172
-71
lines changed

5 files changed

+172
-71
lines changed

nx_arangodb/classes/dict/adj.py

Lines changed: 44 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
check_list_for_errors,
3535
doc_insert,
3636
doc_update,
37+
edge_get,
38+
edge_link,
3739
get_arangodb_graph,
3840
get_node_id,
3941
get_node_type_and_id,
@@ -144,7 +146,6 @@ def process_edge_attr_dict_value(parent: EdgeAttrDict, key: str, value: Any) ->
144146
return value
145147

146148
edge_attr_dict = parent.edge_attr_dict_factory()
147-
edge_attr_dict.root = parent.root or parent
148149
edge_attr_dict.edge_id = parent.edge_id
149150
edge_attr_dict.parent_keys = parent.parent_keys + [key]
150151
edge_attr_dict.data = build_edge_attr_dict_data(edge_attr_dict, value)
@@ -183,8 +184,6 @@ def __init__(
183184
# EdgeAttrDict may be a child of another EdgeAttrDict
184185
# e.g G._adj['node/1']['node/2']['object']['foo'] = 'bar'
185186
# In this case, **parent_keys** would be ['object']
186-
# and **root** would be G._adj['node/1']['node/2']
187-
self.root: EdgeAttrDict | None = None
188187
self.parent_keys: list[str] = []
189188
self.edge_attr_dict_factory = edge_attr_dict_factory(self.db, self.graph)
190189

@@ -236,8 +235,7 @@ def __setitem__(self, key: str, value: Any) -> None:
236235
edge_attr_dict_value = process_edge_attr_dict_value(self, key, value)
237236
update_dict = get_update_dict(self.parent_keys, {key: value})
238237
self.data[key] = edge_attr_dict_value
239-
root_data = self.root.data if self.root else self.data
240-
root_data["_rev"] = doc_update(self.db, self.edge_id, update_dict)
238+
doc_update(self.db, self.edge_id, update_dict)
241239

242240
@key_is_string
243241
@key_is_not_reserved
@@ -247,8 +245,7 @@ def __delitem__(self, key: str) -> None:
247245
assert self.edge_id
248246
self.data.pop(key, None)
249247
update_dict = get_update_dict(self.parent_keys, {key: None})
250-
root_data = self.root.data if self.root else self.data
251-
root_data["_rev"] = doc_update(self.db, self.edge_id, update_dict)
248+
doc_update(self.db, self.edge_id, update_dict)
252249

253250
@keys_are_strings
254251
@keys_are_not_reserved
@@ -265,8 +262,7 @@ def update(self, attrs: Any) -> None:
265262
return
266263

267264
update_dict = get_update_dict(self.parent_keys, attrs)
268-
root_data = self.root.data if self.root else self.data
269-
root_data["_rev"] = doc_update(self.db, self.edge_id, update_dict)
265+
doc_update(self.db, self.edge_id, update_dict)
270266

271267

272268
class EdgeKeyDict(UserDict[str, EdgeAttrDict]):
@@ -457,7 +453,7 @@ def __contains__(self, key: str | int) -> bool:
457453
if self.FETCHED_ALL_IDS:
458454
return False
459455

460-
edge = self.graph.edge(key)
456+
edge = edge_get(self.graph, key)
461457

462458
if edge is None:
463459
logger.warning(f"Edge '{key}' does not exist in Graph.")
@@ -500,7 +496,7 @@ def __getitem__(self, key: str | int) -> EdgeAttrDict:
500496
if key not in self.data and self.FETCHED_ALL_IDS:
501497
raise KeyError(key)
502498

503-
edge = self.graph.edge(key)
499+
edge = edge_get(self.graph, key)
504500

505501
if edge is None:
506502
raise KeyError(key)
@@ -546,8 +542,12 @@ def __setitem__(self, key: int, edge_attr_dict: EdgeAttrDict) -> None:
546542
if not edge_type:
547543
edge_type = self.default_edge_type
548544

549-
edge = self.graph.link(
550-
edge_type, self.src_node_id, self.dst_node_id, edge_attr_dict.data
545+
edge = edge_link(
546+
self.graph,
547+
edge_type,
548+
self.src_node_id,
549+
self.dst_node_id,
550+
edge_attr_dict.data,
551551
)
552552

553553
edge_data: dict[str, Any] = {
@@ -1032,12 +1032,17 @@ def __setitem__graph(
10321032
can_return_multiple=False,
10331033
)
10341034

1035-
if edge_id:
1036-
edge = doc_insert(self.db, edge_type, edge_id, edge_attr_dict.data)
1037-
else:
1038-
edge = self.graph.link(
1039-
edge_type, self.src_node_id, dst_node_id, edge_attr_dict.data
1035+
edge = (
1036+
doc_insert(self.db, edge_type, edge_id, edge_attr_dict.data)
1037+
if edge_id
1038+
else edge_link(
1039+
self.graph,
1040+
edge_type,
1041+
self.src_node_id,
1042+
dst_node_id,
1043+
edge_attr_dict.data,
10401044
)
1045+
)
10411046

10421047
edge_data: dict[str, Any] = {
10431048
**edge_attr_dict.data,
@@ -1064,15 +1069,16 @@ def __setitem__multigraph(
10641069
assert list(edge_key_dict.data.keys())[0] == "-1"
10651070
assert edge_key_dict.src_node_id is None
10661071
assert edge_key_dict.dst_node_id is None
1072+
assert self.src_node_id is not None
10671073

10681074
edge_attr_dict = edge_key_dict.data["-1"]
10691075

10701076
edge_type = edge_attr_dict.data.pop(self.edge_type_key, None)
10711077
if edge_type is None:
10721078
edge_type = self.edge_type_func(self.src_node_type, dst_node_type)
10731079

1074-
edge = self.graph.link(
1075-
edge_type, self.src_node_id, dst_node_id, edge_attr_dict.data
1080+
edge = edge_link(
1081+
self.graph, edge_type, self.src_node_id, dst_node_id, edge_attr_dict.data
10761082
)
10771083

10781084
edge_data: dict[str, Any] = {
@@ -1217,7 +1223,7 @@ def _fetch_all(self) -> None:
12171223
query = f"""
12181224
FOR v, e IN 1..1 {self.traversal_direction.name} @src_node_id
12191225
GRAPH @graph_name
1220-
RETURN e
1226+
RETURN UNSET(e, '_rev')
12211227
"""
12221228

12231229
bind_vars = {"src_node_id": self.src_node_id, "graph_name": self.graph.name}
@@ -1550,14 +1556,20 @@ def __set_adj_elements(
15501556
def set_edge_graph(
15511557
src_node_id: str, dst_node_id: str, edge: dict[str, Any]
15521558
) -> EdgeAttrDict:
1559+
edge.pop("_rev", None)
1560+
15531561
adjlist_inner_dict = self.data[src_node_id]
15541562

15551563
edge_attr_dict: EdgeAttrDict
15561564
edge_attr_dict = adjlist_inner_dict._create_edge_attr_dict(edge)
15571565

1558-
adjlist_inner_dict.data[dst_node_id] = edge_attr_dict
1566+
if dst_node_id not in adjlist_inner_dict.data:
1567+
adjlist_inner_dict.data[dst_node_id] = edge_attr_dict
1568+
else:
1569+
existing_edge_attr_dict = adjlist_inner_dict.data[dst_node_id]
1570+
existing_edge_attr_dict.data.update(edge_attr_dict.data)
15591571

1560-
return edge_attr_dict
1572+
return adjlist_inner_dict.data[dst_node_id] # type: ignore # false positive
15611573

15621574
def set_edge_multigraph(
15631575
src_node_id: str, dst_node_id: str, edges: dict[int, dict[str, Any]]
@@ -1571,8 +1583,16 @@ def set_edge_multigraph(
15711583
edge_key_dict.FETCHED_ALL_IDS = True
15721584

15731585
for edge in edges.values():
1586+
edge.pop("_rev", None)
1587+
1588+
edge_attr_dict: EdgeAttrDict
15741589
edge_attr_dict = adjlist_inner_dict._create_edge_attr_dict(edge)
1575-
edge_key_dict.data[edge["_id"]] = edge_attr_dict
1590+
1591+
if edge["_id"] not in edge_key_dict.data:
1592+
edge_key_dict.data[edge["_id"]] = edge_attr_dict
1593+
else:
1594+
existing_edge_attr_dict = edge_key_dict.data[edge["_id"]]
1595+
existing_edge_attr_dict.data.update(edge_attr_dict.data)
15761596

15771597
adjlist_inner_dict.data[dst_node_id] = edge_key_dict
15781598

@@ -1618,11 +1638,6 @@ def propagate_edge_directed_symmetric(
16181638
for src_node_id, inner_dict in edges_dict.items():
16191639
for dst_node_id, edge_or_edges in inner_dict.items():
16201640

1621-
if not self.is_directed:
1622-
if src_node_id in self.data:
1623-
if dst_node_id in self.data[src_node_id].data:
1624-
continue # can skip due not directed
1625-
16261641
self.__set_adj_inner_dict(self, src_node_id)
16271642
self.__set_adj_inner_dict(self, dst_node_id)
16281643
edge_attr_or_key_dict = set_edge_func( # type: ignore[operator]

nx_arangodb/classes/dict/graph.py

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ def process_graph_attr_dict_value(parent: GraphAttrDict, key: str, value: Any) -
6262
return value
6363

6464
graph_attr_dict = parent.graph_attr_dict_factory()
65-
graph_attr_dict.root = parent.root or parent
6665
graph_attr_dict.parent_keys = parent.parent_keys + [key]
6766
graph_attr_dict.data = build_graph_attr_dict_data(graph_attr_dict, value)
6867

@@ -149,15 +148,15 @@ def __setitem__(self, key: str, value: Any) -> None:
149148

150149
graph_dict_value = self.__process_graph_dict_value(key, value)
151150
self.data[key] = graph_dict_value
152-
self.data["_rev"] = doc_update(self.db, self.graph_id, {key: value})
151+
doc_update(self.db, self.graph_id, {key: value})
153152

154153
@key_is_string
155154
@key_is_not_reserved
156155
@logger_debug
157156
def __delitem__(self, key: str) -> None:
158157
"""del G.graph['foo']"""
159158
self.data.pop(key, None)
160-
self.data["_rev"] = doc_update(self.db, self.graph_id, {key: None})
159+
doc_update(self.db, self.graph_id, {key: None})
161160

162161
# @values_are_json_serializable # TODO?
163162
@logger_debug
@@ -172,7 +171,7 @@ def update(self, attrs: Any) -> None:
172171
graph_attr_dict.data = graph_attr_dict_data
173172

174173
self.data.update(graph_attr_dict_data)
175-
self.data["_rev"] = doc_update(self.db, self.graph_id, attrs)
174+
doc_update(self.db, self.graph_id, attrs)
176175

177176
@logger_debug
178177
def clear(self) -> None:
@@ -211,7 +210,6 @@ def __init__(
211210
self.graph = graph
212211
self.graph_id: str = graph_id
213212

214-
self.root: GraphAttrDict | None = None
215213
self.parent_keys: list[str] = []
216214
self.graph_attr_dict_factory = graph_attr_dict_factory(
217215
self.db, self.graph, self.graph_id
@@ -262,17 +260,15 @@ def __setitem__(self, key, value):
262260
graph_attr_dict_value = process_graph_attr_dict_value(self, key, value)
263261
update_dict = get_update_dict(self.parent_keys, {key: value})
264262
self.data[key] = graph_attr_dict_value
265-
root_data = self.root.data if self.root else self.data
266-
root_data["_rev"] = doc_update(self.db, self.graph_id, update_dict)
263+
doc_update(self.db, self.graph_id, update_dict)
267264

268265
@key_is_string
269266
@logger_debug
270267
def __delitem__(self, key):
271268
"""del G.graph['foo']['bar']"""
272269
self.data.pop(key, None)
273270
update_dict = get_update_dict(self.parent_keys, {key: None})
274-
root_data = self.root.data if self.root else self.data
275-
root_data["_rev"] = doc_update(self.db, self.graph_id, update_dict)
271+
doc_update(self.db, self.graph_id, update_dict)
276272

277273
@logger_debug
278274
def update(self, attrs: Any) -> None:
@@ -282,5 +278,4 @@ def update(self, attrs: Any) -> None:
282278

283279
self.data.update(build_graph_attr_dict_data(self, attrs))
284280
updated_dict = get_update_dict(self.parent_keys, attrs)
285-
root_data = self.root.data if self.root else self.data
286-
root_data["_rev"] = doc_update(self.db, self.graph_id, updated_dict)
281+
doc_update(self.db, self.graph_id, updated_dict)

nx_arangodb/classes/dict/node.py

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
logger_debug,
3232
separate_nodes_by_collections,
3333
upsert_collection_documents,
34+
vertex_get,
3435
)
3536

3637
#############
@@ -78,7 +79,6 @@ def process_node_attr_dict_value(parent: NodeAttrDict, key: str, value: Any) ->
7879
return value
7980

8081
node_attr_dict = parent.node_attr_dict_factory()
81-
node_attr_dict.root = parent.root or parent
8282
node_attr_dict.node_id = parent.node_id
8383
node_attr_dict.parent_keys = parent.parent_keys + [key]
8484
node_attr_dict.data = build_node_attr_dict_data(node_attr_dict, value)
@@ -109,8 +109,6 @@ def __init__(self, db: StandardDatabase, graph: Graph, *args: Any, **kwargs: Any
109109
# NodeAttrDict may be a child of another NodeAttrDict
110110
# e.g G._node['node/1']['object']['foo'] = 'bar'
111111
# In this case, **parent_keys** would be ['object']
112-
# and **root** would be G._node['node/1']
113-
self.root: NodeAttrDict | None = None
114112
self.parent_keys: list[str] = []
115113
self.node_attr_dict_factory = node_attr_dict_factory(self.db, self.graph)
116114

@@ -168,8 +166,7 @@ def __setitem__(self, key: str, value: Any) -> None:
168166
node_attr_dict_value = process_node_attr_dict_value(self, key, value)
169167
update_dict = get_update_dict(self.parent_keys, {key: value})
170168
self.data[key] = node_attr_dict_value
171-
root_data = self.root.data if self.root else self.data
172-
root_data["_rev"] = doc_update(self.db, self.node_id, update_dict)
169+
doc_update(self.db, self.node_id, update_dict)
173170

174171
@key_is_string
175172
@key_is_not_reserved
@@ -179,8 +176,7 @@ def __delitem__(self, key: str) -> None:
179176
assert self.node_id
180177
self.data.pop(key, None)
181178
update_dict = get_update_dict(self.parent_keys, {key: None})
182-
root_data = self.root.data if self.root else self.data
183-
root_data["_rev"] = doc_update(self.db, self.node_id, update_dict)
179+
doc_update(self.db, self.node_id, update_dict)
184180

185181
@keys_are_strings
186182
@keys_are_not_reserved
@@ -198,8 +194,7 @@ def update(self, attrs: Any) -> None:
198194
return
199195

200196
update_dict = get_update_dict(self.parent_keys, attrs)
201-
root_data = self.root.data if self.root else self.data
202-
root_data["_rev"] = doc_update(self.db, self.node_id, update_dict)
197+
doc_update(self.db, self.node_id, update_dict)
203198

204199

205200
class NodeDict(UserDict[str, NodeAttrDict]):
@@ -280,14 +275,14 @@ def __getitem__(self, key: str) -> NodeAttrDict:
280275
"""G._node['node/1']"""
281276
node_id = get_node_id(key, self.default_node_type)
282277

283-
if vertex := self.data.get(node_id):
284-
return vertex
278+
if vertex_cache := self.data.get(node_id):
279+
return vertex_cache
285280

286281
if node_id not in self.data and self.FETCHED_ALL_IDS:
287282
raise KeyError(key)
288283

289-
if vertex := self.graph.vertex(node_id):
290-
node_attr_dict = self._create_node_attr_dict(vertex)
284+
if vertex_db := vertex_get(self.graph, node_id):
285+
node_attr_dict = self._create_node_attr_dict(vertex_db)
291286
self.data[node_id] = node_attr_dict
292287

293288
return node_attr_dict
@@ -458,6 +453,7 @@ def _fetch_all(self):
458453
)
459454

460455
for node_id, node_data in node_dict.items():
456+
del node_data["_rev"] # TODO: Optimize away via phenolrs
461457
node_attr_dict = self._create_node_attr_dict(node_data)
462458
self.data[node_id] = node_attr_dict
463459

0 commit comments

Comments
 (0)