1+ from raphtory import filter
2+ from filters_setup import init_graph , create_test_graph
3+ from utils import with_disk_variants
4+ import pytest
5+
6+
7+ @with_disk_variants (init_graph , variants = ["graph" , "event_disk_graph" ])
8+ def test_edges_src_property_eq ():
9+ def check (graph ):
10+ expr = filter .Edge .src ().property ("p2" ) == 2
11+ result = sorted (graph .filter (expr ).edges .id )
12+ expected = sorted ([("2" , "1" ), ("2" , "3" )])
13+ assert result == expected
14+ return check
15+
16+
17+ @with_disk_variants (init_graph , variants = ["graph" , "event_disk_graph" ])
18+ def test_edges_dst_property_contains ():
19+ def check (graph ):
20+ # dst node "3" has p20 == "Gold_boat"; dst node "4" has p20 updated from Gold_boat to Gold_ship so it doesn't appear here
21+ expr = filter .Edge .dst ().property ("p20" ).contains ("boat" )
22+ result = sorted (graph .filter (expr ).edges .id )
23+ expected = sorted ([("2" , "3" )])
24+ assert result == expected
25+ return check
26+
27+ @with_disk_variants (init_graph , variants = ["graph" , "event_disk_graph" ])
28+ def test_edges_dst_property_any_contains ():
29+ def check (graph ):
30+ # dst node "3" has p20 == "Gold_boat"; dst node "4" has p20 updated from Gold_boat to Gold_ship so it appears with .temporal().any()
31+ expr = filter .Edge .dst ().property ("p20" ).temporal ().any ().contains ("boat" )
32+ result = sorted (graph .filter (expr ).edges .id )
33+ expected = sorted ([("2" , "3" ), ("3" , "4" )])
34+ assert result == expected
35+ return check
36+
37+
38+ @with_disk_variants (init_graph , variants = ["graph" , "event_disk_graph" ])
39+ def test_edges_dst_property_gt ():
40+ def check (graph ):
41+ expr = filter .Edge .dst ().property ("p100" ) > 55
42+ result = sorted (graph .filter (expr ).edges .id )
43+ expected = sorted ([("2" , "3" )]) # edge (2,3) is at times 2 and 3; IDs dedup by view
44+ assert result == expected
45+ return check
46+
47+
48+ @with_disk_variants (create_test_graph , variants = ("graph" , "persistent_graph" ))
49+ def test_edges_src_property_temporal_sum ():
50+ def check (graph ):
51+ expr = filter .Edge .src ().property ("prop6" ).temporal ().last ().sum () == 12
52+ result = sorted (graph .filter (expr ).edges .id )
53+ expected = sorted ([("a" , "d" )])
54+ assert result == expected
55+ return check
56+
57+
58+ @with_disk_variants (create_test_graph , variants = ("graph" , "persistent_graph" ))
59+ def test_edges_src_property_any_equals ():
60+ def check (graph ):
61+ # src node "d" doesn't exist as src; src of edges are a,b,c; node "a" has prop8 = [2,3,3]
62+ expr = filter .Edge .src ().property ("prop8" ).temporal ().any ().any () == 3
63+ result = sorted (graph .filter (expr ).edges .id )
64+ expected = sorted ([("a" , "d" )])
65+ assert result == expected
66+ return check
67+
68+
69+ @with_disk_variants (create_test_graph , variants = ("graph" , "persistent_graph" ))
70+ def test_edges_src_metadata_sum_with_same_name_property ():
71+ def check (graph ):
72+ # src node "a" metadata prop1 sum == 36
73+ # src node "b" and "c" property prop1 < 36, they don't appear because it's property not metadata
74+ expr = filter .Edge .src ().metadata ("prop1" ).sum () <= 36
75+ result = sorted (graph .filter (expr ).edges .id )
76+ expected = sorted ([("a" , "d" )])
77+ assert result == expected
78+ return check
79+
80+
81+ @with_disk_variants (create_test_graph , variants = ("graph" , "persistent_graph" ))
82+ def test_edges_src_metadata_avg ():
83+ def check (graph ):
84+ expr = filter .Edge .src ().metadata ("prop2" ).avg () <= 2.0
85+ result = sorted (graph .filter (expr ).edges .id )
86+ expected = sorted ([("a" , "d" ), ("b" , "d" )])
87+ assert result == expected
88+ return check
89+
90+
91+ @with_disk_variants (init_graph , variants = ["graph" , "event_disk_graph" ])
92+ def test_edges_src_property_and_edge_property ():
93+ def check (graph ):
94+ expr = (filter .Edge .src ().property ("p2" ) == 2 ) & (
95+ filter .Edge .property ("p20" ).temporal ().any ().contains ("ship" )
96+ )
97+ result = sorted (graph .filter (expr ).edges .id )
98+ expected = sorted ([("2" , "3" )])
99+ assert result == expected
100+ return check
101+
102+ @with_disk_variants (init_graph , variants = ["graph" , "event_disk_graph" ])
103+ def test_edges_src_and_dst_property ():
104+ def check (graph ):
105+ expr = (filter .Edge .src ().property ("p2" ) == 2 ) & (
106+ filter .Edge .dst ().property ("p20" ).contains ("boat" )
107+ )
108+ result = sorted (graph .filter (expr ).edges .id )
109+ expected = sorted ([("2" , "3" )])
110+ assert result == expected
111+ return check
112+
113+
114+ @with_disk_variants (init_graph , variants = ["graph" , "event_disk_graph" ])
115+ def test_edges_src_or_dst_property ():
116+ def check (graph ):
117+ expr = (filter .Edge .src ().property ("p2" ) == 2 ) | (
118+ filter .Edge .dst ().property ("p20" ).contains ("boat" )
119+ )
120+ result = sorted (graph .filter (expr ).edges .id )
121+ expected = sorted ([("2" , "1" ), ("2" , "3" )])
122+ assert result == expected
123+ return check
124+
125+
126+ @with_disk_variants (create_test_graph , variants = ("graph" , "persistent_graph" ))
127+ def test_edges_src_property_and_dst_name ():
128+ def check (graph ):
129+ expr = (filter .Edge .src ().property ("prop1" ) >= 20 ) & (
130+ filter .Edge .dst ().name () == "d"
131+ )
132+ result = sorted (graph .filter (expr ).edges .id )
133+ expected = sorted ([("a" , "d" ), ("c" , "d" )])
134+ assert result == expected
135+ return check
136+
137+
138+ @with_disk_variants (create_test_graph , variants = ("graph" , "persistent_graph" ))
139+ def test_edges_src_metadata_and_edge_property ():
140+ def check (graph ):
141+ expr = (filter .Edge .src ().metadata ("prop1" ).sum () == 36 ) & (
142+ filter .Edge .property ("eprop1" ) > 20
143+ )
144+ result = sorted (graph .filter (expr ).edges .id )
145+ expected = sorted ([("a" , "d" )])
146+ assert result == expected
147+ return check
148+
149+
150+ # node_type endpoint filters
151+ @with_disk_variants (init_graph , variants = ["graph" , "event_disk_graph" ])
152+ def test_edges_src_node_type_eq ():
153+ def check (graph ):
154+ expr = filter .Edge .src ().node_type () == "fire_nation"
155+ result = sorted (graph .filter (expr ).edges .id )
156+ expected = sorted ([("1" , "2" ), ("3" , "1" ), ("3" , "4" )])
157+ assert result == expected
158+
159+ return check
160+
161+
162+ @with_disk_variants (init_graph , variants = ["graph" , "event_disk_graph" ])
163+ def test_edges_dst_node_type_contains ():
164+ def check (graph ):
165+ expr = filter .Edge .dst ().node_type ().contains ("nomads" )
166+ result = sorted (graph .filter (expr ).edges .id )
167+ expected = sorted ([("1" , "2" )])
168+ assert result == expected
169+
170+ return check
171+
172+
173+ @with_disk_variants (init_graph , variants = ["graph" , "event_disk_graph" ])
174+ def test_edges_src_and_dst_node_type ():
175+ def check (graph ):
176+ expr = (
177+ filter .Edge .src ().node_type ().starts_with ("fire" )
178+ & filter .Edge .dst ().node_type ().contains ("nomads" )
179+ )
180+ result = sorted (graph .filter (expr ).edges .id )
181+ expected = sorted ([("1" , "2" )])
182+ assert result == expected
183+
184+ return check
185+
186+
187+ @with_disk_variants (init_graph , variants = ["graph" , "event_disk_graph" ])
188+ def test_edges_src_or_dst_node_type ():
189+ def check (graph ):
190+ expr = (
191+ (filter .Edge .src ().node_type () == "air_nomads" )
192+ | (filter .Edge .dst ().node_type () == "fire_nation" )
193+ )
194+ result = sorted (graph .filter (expr ).edges .id )
195+ expected = sorted ([("2" , "3" ), ("2" , "1" ), ("3" , "1" )])
196+ assert result == expected
197+
198+ return check
199+
200+
201+ @with_disk_variants (init_graph , variants = ["graph" , "event_disk_graph" ])
202+ def test_edges_not_src_node_type ():
203+ def check (graph ):
204+ expr = ~ filter .Edge .src ().node_type ().contains ("fire" )
205+ result = sorted (graph .filter (expr ).edges .id )
206+ expected = sorted (
207+ [
208+ ("2" , "3" ),
209+ ("2" , "1" ),
210+ ("David Gilmour" , "John Mayer" ),
211+ ("John Mayer" , "Jimmy Page" ),
212+ ]
213+ )
214+ assert result == expected
215+
216+ return check
217+
218+
219+ @with_disk_variants (create_test_graph , variants = ("graph" , "persistent_graph" ))
220+ def test_edges_src_node_type_eq_compose_with_edge_prop ():
221+ def check (graph ):
222+ # edge ("c","d") has eprop1 > 20 but src node_type isn't fire_nation, so not included here
223+ expr = (
224+ (filter .Edge .src ().node_type () == "fire_nation" )
225+ & (filter .Edge .property ("eprop1" ) > 20 )
226+ )
227+ result = sorted (graph .filter (expr ).edges .id )
228+ expected = sorted ([("a" , "d" )])
229+ assert result == expected
230+
231+ return check
0 commit comments