@@ -16,9 +16,13 @@ use crate::{
1616} ;
1717use raphtory_core:: utils:: time:: IntoTime ;
1818use std:: { fmt, fmt:: Display , ops:: Deref , sync:: Arc } ;
19+ use crate :: db:: graph:: views:: filter:: edge_node_filtered_graph:: EdgeNodeFilteredGraph ;
20+ use crate :: db:: graph:: views:: filter:: model:: edge_filter:: { EdgeEndpoint , Endpoint } ;
1921
2022#[ derive( Debug , Clone , PartialEq , Eq ) ]
2123pub enum CompositeExplodedEdgeFilter {
24+ Src ( CompositeNodeFilter ) ,
25+ Dst ( CompositeNodeFilter ) ,
2226 Property ( PropertyFilter < ExplodedEdgeFilter > ) ,
2327 And (
2428 Box < CompositeExplodedEdgeFilter > ,
@@ -34,6 +38,8 @@ pub enum CompositeExplodedEdgeFilter {
3438impl Display for CompositeExplodedEdgeFilter {
3539 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
3640 match self {
41+ CompositeExplodedEdgeFilter :: Src ( filter) => write ! ( f, "SRC({})" , filter) ,
42+ CompositeExplodedEdgeFilter :: Dst ( filter) => write ! ( f, "DST({})" , filter) ,
3743 CompositeExplodedEdgeFilter :: Property ( filter) => write ! ( f, "{}" , filter) ,
3844 CompositeExplodedEdgeFilter :: And ( left, right) => write ! ( f, "({} AND {})" , left, right) ,
3945 CompositeExplodedEdgeFilter :: Or ( left, right) => write ! ( f, "({} OR {})" , left, right) ,
@@ -66,6 +72,22 @@ impl CreateFilter for CompositeExplodedEdgeFilter {
6672 graph : G ,
6773 ) -> Result < Self :: EntityFiltered < ' graph , G > , GraphError > {
6874 match self {
75+ CompositeExplodedEdgeFilter :: Src ( filter) => {
76+ let filtered_graph = filter. clone ( ) . create_filter ( graph. clone ( ) ) ?;
77+ Ok ( Arc :: new ( EdgeNodeFilteredGraph :: new (
78+ graph,
79+ Endpoint :: Src ,
80+ filtered_graph
81+ ) ) )
82+ } ,
83+ CompositeExplodedEdgeFilter :: Dst ( filter) => {
84+ let filtered_graph = filter. clone ( ) . create_filter ( graph. clone ( ) ) ?;
85+ Ok ( Arc :: new ( EdgeNodeFilteredGraph :: new (
86+ graph,
87+ Endpoint :: Dst ,
88+ filtered_graph
89+ ) ) )
90+ } ,
6991 CompositeExplodedEdgeFilter :: Property ( i) => Ok ( Arc :: new ( i. create_filter ( graph) ?) ) ,
7092 CompositeExplodedEdgeFilter :: And ( l, r) => Ok ( Arc :: new (
7193 AndFilter {
@@ -109,6 +131,16 @@ pub struct ExplodedEdgeFilter;
109131impl PropertyFilterFactory < ExplodedEdgeFilter > for ExplodedEdgeFilter { }
110132
111133impl ExplodedEdgeFilter {
134+ #[ inline]
135+ pub fn src ( ) -> EdgeEndpoint {
136+ EdgeEndpoint :: src ( )
137+ }
138+
139+ #[ inline]
140+ pub fn dst ( ) -> EdgeEndpoint {
141+ EdgeEndpoint :: dst ( )
142+ }
143+
112144 #[ inline]
113145 pub fn window < S : IntoTime , E : IntoTime > ( start : S , end : E ) -> Windowed < ExplodedEdgeFilter > {
114146 Windowed :: from_times ( start, end)
0 commit comments