@@ -121,14 +121,11 @@ NOTE: This project is a work in progress. While functional, it is not optimized.
121
121
# Descendant methods which return a queryset
122
122
123
123
>>> root.descendants()
124
- <QuerySet [<NetworkNode: a1>, <NetworkNode: a2>, <NetworkNode: a3>, <NetworkNode: b1>, <NetworkNode: b
125
- 2>, <NetworkNode: b3>, <NetworkNode: b4>, <NetworkNode: c1>, <NetworkNode: c2>]>
124
+ <QuerySet [<NetworkNode: a1>, <NetworkNode: a2>, <NetworkNode: a3>, <NetworkNode: b1>, <NetworkNode: b2>, <NetworkNode: b3>, <NetworkNode: b4>, <NetworkNode: c1>, <NetworkNode: c2>]>
126
125
>>> root.self_and_descendants()
127
- <QuerySet [<NetworkNode: root>, <NetworkNode: a1>, <NetworkNode: a2>, <NetworkNode: a3>, <NetworkNode:
128
- b1>, <NetworkNode: b2>, <NetworkNode: b3>, <NetworkNode: b4>, <NetworkNode: c1>, <NetworkNode: c2>]>
126
+ <QuerySet [<NetworkNode: root>, <NetworkNode: a1>, <NetworkNode: a2>, <NetworkNode: a3>, <NetworkNode: b1>, <NetworkNode: b2>, <NetworkNode: b3>, <NetworkNode: b4>, <NetworkNode: c1>, <NetworkNode: c2>]>
129
127
>>> root.descendants_and_self()
130
- [<NetworkNode: c2>, <NetworkNode: c1>, <NetworkNode: b4>, <NetworkNode: b3>, <NetworkNode: b2>, <Netwo
131
- rkNode: b1>, <NetworkNode: a3>, <NetworkNode: a2>, <NetworkNode: a1>, <NetworkNode: root>]
128
+ [<NetworkNode: c2>, <NetworkNode: c1>, <NetworkNode: b4>, <NetworkNode: b3>, <NetworkNode: b2>, <NetworkNode: b1>, <NetworkNode: a3>, <NetworkNode: a2>, <NetworkNode: a1>, <NetworkNode: root>]
132
129
133
130
# Ancestor methods which return ids
134
131
@@ -144,8 +141,7 @@ NOTE: This project is a work in progress. While functional, it is not optimized.
144
141
>>> c1.ancestors()
145
142
<QuerySet [<NetworkNode: root>, <NetworkNode: a3>, <NetworkNode: b3>, <NetworkNode: b4>]>
146
143
>>> c1.ancestors_and_self()
147
- <QuerySet [<NetworkNode: root>, <NetworkNode: a3>, <NetworkNode: b3>, <NetworkNode: b4>, <NetworkNode:
148
- c1>]>
144
+ <QuerySet [<NetworkNode: root>, <NetworkNode: a3>, <NetworkNode: b3>, <NetworkNode: b4>, <NetworkNode: c1>]>
149
145
>>> c1.self_and_ancestors()
150
146
[<NetworkNode: c1>, <NetworkNode: b4>, <NetworkNode: b3>, <NetworkNode: a3>, <NetworkNode: root>]
151
147
@@ -154,15 +150,43 @@ NOTE: This project is a work in progress. While functional, it is not optimized.
154
150
>>> b3.clan_ids()
155
151
[1, 4, 7, 9, 10]
156
152
>>> b3.clan()
157
- <QuerySet [<NetworkNode: root>, <NetworkNode: a3>, <NetworkNode: b3>, <NetworkNode: c1>, <NetworkNode:
158
- c2>]>
153
+ <QuerySet [<NetworkNode: root>, <NetworkNode: a3>, <NetworkNode: b3>, <NetworkNode: c1>, <NetworkNode: c2>]>
159
154
160
155
# Get all roots or leaves associated with the node
161
156
162
157
>>> b3.get_roots()
163
158
{<NetworkNode: root>}
164
159
>>> b3.get_leaves()
165
160
{<NetworkNode: c1>, <NetworkNode: c2>}
161
+
162
+ # Perform path search
163
+
164
+ >>> root.path_ids_list(c1)
165
+ [[1, 4, 7, 9]]
166
+ >>> c1.path_ids_list(root)
167
+ Traceback (most recent call last):
168
+ File "<input>", line 1, in <module>
169
+ c1.path_ids_list(root)
170
+ File "/home/runner/pgdagtest/pg/models.py", line 313, in path_ids_list
171
+ raise NodeNotReachableException
172
+ pg.models.NodeNotReachableException
173
+ >>> c1.path_ids_list(root, directional=False)
174
+ [[1, 4, 7, 9]]
175
+ >>> root.path_ids_list(c1, max_paths=2)
176
+ [[1, 4, 7, 9], [1, 4, 8, 9]]
177
+ >>> root.shortest_path(c1)
178
+ <QuerySet [<NetworkNode: root>, <NetworkNode: a3>, <NetworkNode: b3>, <NetworkNode: c1>]>
179
+ >>> c1.shortest_path(root)
180
+ Traceback (most recent call last):
181
+ File "<input>", line 1, in <module>
182
+ c1.shortest_path(root)
183
+ File "/home/runner/pgdagtest/pg/models.py", line 323, in shortest_path
184
+ return self.filter_order_ids(self.path_ids_list(target_node, directional=directional)[0])
185
+ File "/home/runner/pgdagtest/pg/models.py", line 313, in path_ids_list
186
+ raise NodeNotReachableException
187
+ pg.models.NodeNotReachableException
188
+ >>> c1.shortest_path(root, directional=False)
189
+ <QuerySet [<NetworkNode: root>, <NetworkNode: a3>, <NetworkNode: b4>, <NetworkNode: c1>]>
166
190
167
191
# Get the nodes at the start or end of an edge
168
192
@@ -175,7 +199,7 @@ NOTE: This project is a work in progress. While functional, it is not optimized.
175
199
<NetworkNode: b4>
176
200
>>> e2.child
177
201
<NetworkNode: c1>
178
-
202
+
179
203
# Edge-specific Manager methods
180
204
181
205
>>> NetworkEdge.objects.descendants(b3)
@@ -184,7 +208,18 @@ NOTE: This project is a work in progress. While functional, it is not optimized.
184
208
<QuerySet [<NetworkEdge: a3 b3>, <NetworkEdge: root a3>]>
185
209
>>> NetworkEdge.objects.clan(b3)
186
210
<QuerySet [<NetworkEdge: root a3>, <NetworkEdge: a3 b3>, <NetworkEdge: b3 c2>, <NetworkEdge: b3 c1>]>
187
- >>> NetworkEdge.objects.path(root, c1)
211
+ >>> NetworkEdge.objects.shortest_path(root, c1)
212
+ <QuerySet [<NetworkEdge: root a3>, <NetworkEdge: a3 b3>, <NetworkEdge: b3 c1>]>
213
+ >>> NetworkEdge.objects.shortest_path(c1, root)
214
+ Traceback (most recent call last):
215
+ File "<input>", line 1, in <module>
216
+ NetworkEdge.objects.shortest_path(c1, root)
217
+ File "/home/runner/pgdagtest/pg/models.py", line 425, in shortest_path
218
+ self.model.objects, ["parent_id", "child_id"], start_node.path_ids_list(end_node)[0]
219
+ File "/home/runner/pgdagtest/pg/models.py", line 313, in path_ids_list
220
+ raise NodeNotReachableException
221
+ pg.models.NodeNotReachableException
222
+ >>> NetworkEdge.objects.shortest_path(c1, root, directional=False)
188
223
<QuerySet [<NetworkEdge: root a3>, <NetworkEdge: a3 b4>, <NetworkEdge: b4 c1>]>
189
224
190
225
0 commit comments