@@ -81,6 +81,17 @@ impl GraphPlanConvert<StringGraphTypes, SimpleGraphTypes> for SimpleGraphEngine
81
81
LabelFilter :: Never
82
82
}
83
83
}
84
+ LabelFilter :: Negated ( inner) => {
85
+ LabelFilter :: Negated ( Box :: new ( self . convert_label_filter ( inner) ) )
86
+ }
87
+ LabelFilter :: Conjunction ( inner) => {
88
+ let inner = inner. iter ( ) . map ( |l| self . convert_label_filter ( l) ) ;
89
+ LabelFilter :: Conjunction ( inner. collect ( ) )
90
+ }
91
+ LabelFilter :: Disjunction ( inner) => {
92
+ let inner = inner. iter ( ) . map ( |l| self . convert_label_filter ( l) ) ;
93
+ LabelFilter :: Disjunction ( inner. collect ( ) )
94
+ }
84
95
}
85
96
}
86
97
@@ -100,6 +111,17 @@ impl GraphPlanConvert<SimpleGraphTypes, StringGraphTypes> for SimpleGraphEngine
100
111
LabelFilter :: Named ( l) => {
101
112
LabelFilter :: Named ( self . graph . labels . resolve ( & l. 0 ) . to_string ( ) )
102
113
}
114
+ LabelFilter :: Negated ( inner) => {
115
+ LabelFilter :: Negated ( Box :: new ( self . convert_label_filter ( inner) ) )
116
+ }
117
+ LabelFilter :: Conjunction ( inner) => {
118
+ let inner = inner. iter ( ) . map ( |l| self . convert_label_filter ( l) ) ;
119
+ LabelFilter :: Conjunction ( inner. collect ( ) )
120
+ }
121
+ LabelFilter :: Disjunction ( inner) => {
122
+ let inner = inner. iter ( ) . map ( |l| self . convert_label_filter ( l) ) ;
123
+ LabelFilter :: Disjunction ( inner. collect ( ) )
124
+ }
103
125
}
104
126
}
105
127
@@ -148,17 +170,13 @@ impl TripleScan<SimpleGraphTypes> for SimpleGraph {
148
170
// scan directed triples left to right and right to left
149
171
self . g_dir
150
172
. iter ( )
151
- . filter ( move |( _, e, _) | EdgeMatcher :: matches ( self , & spec. e , e) )
173
+ . filter ( move |( _, e, _) | self . edge_matches ( & spec. e , e) )
152
174
. flat_map ( move |( l, e, r) | {
153
175
let mut res = Vec :: with_capacity ( 2 ) ;
154
- if NodeMatcher :: matches ( self , & spec. lhs , l)
155
- && NodeMatcher :: matches ( self , & spec. rhs , r)
156
- {
176
+ if self . node_matches ( & spec. lhs , l) && self . node_matches ( & spec. rhs , r) {
157
177
res. push ( build_triple ( & ( * l, * e, * r) ) )
158
178
}
159
- if NodeMatcher :: matches ( self , & spec. rhs , l)
160
- && NodeMatcher :: matches ( self , & spec. lhs , r)
161
- {
179
+ if self . node_matches ( & spec. rhs , l) && self . node_matches ( & spec. lhs , r) {
162
180
res. push ( reverse_triple ( & ( * l, * e, * r) ) )
163
181
}
164
182
@@ -173,17 +191,13 @@ impl TripleScan<SimpleGraphTypes> for SimpleGraph {
173
191
// scan undirected triples
174
192
self . g_undir
175
193
. iter ( )
176
- . filter ( move |( _, e, _) | EdgeMatcher :: matches ( self , & spec. e , e) )
194
+ . filter ( move |( _, e, _) | self . edge_matches ( & spec. e , e) )
177
195
. flat_map ( move |( l, e, r) | {
178
196
let mut res = Vec :: with_capacity ( 2 ) ;
179
- if NodeMatcher :: matches ( self , & spec. lhs , l)
180
- && NodeMatcher :: matches ( self , & spec. rhs , r)
181
- {
197
+ if self . node_matches ( & spec. lhs , l) && self . node_matches ( & spec. rhs , r) {
182
198
res. push ( build_triple ( & ( * l, * e, * r) ) )
183
199
}
184
- if NodeMatcher :: matches ( self , & spec. rhs , l)
185
- && NodeMatcher :: matches ( self , & spec. lhs , r)
186
- {
200
+ if self . node_matches ( & spec. rhs , l) && self . node_matches ( & spec. lhs , r) {
187
201
res. push ( reverse_triple ( & ( * l, * e, * r) ) )
188
202
}
189
203
@@ -194,7 +208,7 @@ impl TripleScan<SimpleGraphTypes> for SimpleGraph {
194
208
fn get ( & self , spec : & NodeFilter < SimpleGraphTypes > ) -> Vec < GNodeId > {
195
209
( 0 ..self . nodes . len ( ) )
196
210
. map ( GNodeId )
197
- . filter ( |node| NodeMatcher :: matches ( self , spec, node) )
211
+ . filter ( |node| self . node_matches ( spec, node) )
198
212
. collect ( )
199
213
}
200
214
}
@@ -222,11 +236,17 @@ trait TripleMatcher<GT: GraphTypes> {
222
236
}
223
237
224
238
trait NodeMatcher < GT : GraphTypes > {
225
- fn matches ( & self , spec : & NodeFilter < GT > , node : & GT :: NodeId ) -> bool ;
239
+ fn node_matches ( & self , spec : & NodeFilter < GT > , node : & GT :: NodeId ) -> bool ;
240
+ fn node_label_matches ( & self , spec : & LabelFilter < GT > , node : & GT :: NodeId ) -> bool ;
241
+ #[ allow( dead_code) ] // TODO implement value filters for `where`
242
+ fn node_value_matches ( & self , spec : & ValueFilter , node : & GT :: NodeId ) -> bool ;
226
243
}
227
244
228
245
trait EdgeMatcher < GT : GraphTypes > {
229
- fn matches ( & self , spec : & EdgeFilter < GT > , edge : & GT :: EdgeId ) -> bool ;
246
+ fn edge_matches ( & self , spec : & EdgeFilter < GT > , edge : & GT :: EdgeId ) -> bool ;
247
+ fn edge_label_matches ( & self , spec : & LabelFilter < GT > , edge : & GT :: EdgeId ) -> bool ;
248
+ #[ allow( dead_code) ] // TODO implement value filters for `where`
249
+ fn edge_value_matches ( & self , spec : & ValueFilter , edge : & GT :: EdgeId ) -> bool ;
230
250
}
231
251
232
252
impl TripleMatcher < SimpleGraphTypes > for SimpleGraph {
@@ -236,32 +256,82 @@ impl TripleMatcher<SimpleGraphTypes> for SimpleGraph {
236
256
spec : & TripleFilter < SimpleGraphTypes > ,
237
257
triple : & Triple < SimpleGraphTypes > ,
238
258
) -> bool {
239
- NodeMatcher :: matches ( self , & spec. lhs , & triple. lhs )
240
- && EdgeMatcher :: matches ( self , & spec. e , & triple. e )
241
- && NodeMatcher :: matches ( self , & spec. rhs , & triple. rhs )
259
+ self . node_matches ( & spec. lhs , & triple. lhs )
260
+ && self . edge_matches ( & spec. e , & triple. e )
261
+ && self . node_matches ( & spec. rhs , & triple. rhs )
242
262
}
243
263
}
244
264
245
265
impl NodeMatcher < SimpleGraphTypes > for SimpleGraph {
246
266
#[ inline]
247
- fn matches ( & self , spec : & NodeFilter < SimpleGraphTypes > , node : & GNodeId ) -> bool {
267
+ fn node_matches ( & self , spec : & NodeFilter < SimpleGraphTypes > , node : & GNodeId ) -> bool {
248
268
let NodeFilter { label, filter } = spec;
249
269
match ( label, filter) {
250
270
( LabelFilter :: Never , _) => false ,
251
271
( LabelFilter :: Always , ValueFilter :: Always ) => true ,
252
- ( LabelFilter :: Named ( l) , ValueFilter :: Always ) => self . nodes [ node. 0 ] . labels . 0 . contains ( l) ,
272
+ //TODO when ValueFilter has other variants:
273
+ // (LabelFilter::Always, v) => self.node_value_matches(v, node),
274
+ ( l, ValueFilter :: Always ) => self . node_label_matches ( l, node) ,
275
+ //TODO when ValueFilter has other variants:
276
+ // (l, v) => self.node_label_matches(l, node) && self.node_value_matches(v, node),
277
+ }
278
+ }
279
+
280
+ fn node_label_matches ( & self , spec : & LabelFilter < SimpleGraphTypes > , node : & GNodeId ) -> bool {
281
+ match spec {
282
+ LabelFilter :: Never => false ,
283
+ LabelFilter :: Always => true ,
284
+ LabelFilter :: Named ( l) => self . nodes [ node. 0 ] . labels . 0 . contains ( l) ,
285
+ LabelFilter :: Negated ( inner) => !self . node_label_matches ( inner. as_ref ( ) , node) ,
286
+ LabelFilter :: Disjunction ( inner) => {
287
+ inner. iter ( ) . any ( |l| self . node_label_matches ( l, node) )
288
+ }
289
+ LabelFilter :: Conjunction ( inner) => {
290
+ inner. iter ( ) . all ( |l| self . node_label_matches ( l, node) )
291
+ }
292
+ }
293
+ }
294
+
295
+ fn node_value_matches ( & self , spec : & ValueFilter , _: & GNodeId ) -> bool {
296
+ match spec {
297
+ ValueFilter :: Always => true ,
253
298
}
254
299
}
255
300
}
256
301
257
302
impl EdgeMatcher < SimpleGraphTypes > for SimpleGraph {
258
303
#[ inline]
259
- fn matches ( & self , spec : & EdgeFilter < SimpleGraphTypes > , edge : & GEdgeId ) -> bool {
304
+ fn edge_matches ( & self , spec : & EdgeFilter < SimpleGraphTypes > , edge : & GEdgeId ) -> bool {
260
305
let EdgeFilter { label, filter } = spec;
261
306
match ( label, filter) {
262
307
( LabelFilter :: Never , _) => false ,
263
308
( LabelFilter :: Always , ValueFilter :: Always ) => true ,
264
- ( LabelFilter :: Named ( l) , ValueFilter :: Always ) => self . edges [ edge. 0 ] . labels . 0 . contains ( l) ,
309
+ //TODO when ValueFilter has other variants:
310
+ // (LabelFilter::Always, v) => self.edge_value_matches(v, edge),
311
+ ( l, ValueFilter :: Always ) => self . edge_label_matches ( l, edge) ,
312
+ //TODO when ValueFilter has other variants:
313
+ // (l, v) => self.edge_label_matches(l, edge) && self.edge_value_matches(v, edge),
314
+ }
315
+ }
316
+
317
+ fn edge_label_matches ( & self , spec : & LabelFilter < SimpleGraphTypes > , edge : & GEdgeId ) -> bool {
318
+ match spec {
319
+ LabelFilter :: Never => false ,
320
+ LabelFilter :: Always => true ,
321
+ LabelFilter :: Named ( l) => self . edges [ edge. 0 ] . labels . 0 . contains ( l) ,
322
+ LabelFilter :: Negated ( inner) => !self . edge_label_matches ( inner. as_ref ( ) , edge) ,
323
+ LabelFilter :: Disjunction ( inner) => {
324
+ inner. iter ( ) . any ( |l| self . edge_label_matches ( l, edge) )
325
+ }
326
+ LabelFilter :: Conjunction ( inner) => {
327
+ inner. iter ( ) . all ( |l| self . edge_label_matches ( l, edge) )
328
+ }
329
+ }
330
+ }
331
+
332
+ fn edge_value_matches ( & self , spec : & ValueFilter , _: & GEdgeId ) -> bool {
333
+ match spec {
334
+ ValueFilter :: Always => true ,
265
335
}
266
336
}
267
337
}
0 commit comments