@@ -8,7 +8,7 @@ use dynamic_graphql::{
88} ;
99use raphtory:: {
1010 db:: graph:: views:: filter:: model:: {
11- edge_filter:: CompositeEdgeFilter ,
11+ edge_filter:: { CompositeEdgeFilter , EdgeDstEndpoint , EdgeSrcEndpoint } ,
1212 filter_operator:: FilterOperator ,
1313 node_filter:: CompositeNodeFilter ,
1414 property_filter:: { Op , PropertyFilter , PropertyFilterValue , PropertyRef } ,
@@ -421,6 +421,18 @@ pub enum EdgeFilter {
421421 Src ( NodeFieldFilterNew ) ,
422422 /// Destination node filter.
423423 Dst ( NodeFieldFilterNew ) ,
424+ /// Source node property filter.
425+ SrcProperty ( PropertyFilterNew ) ,
426+ /// Destination node property filter.
427+ DstProperty ( PropertyFilterNew ) ,
428+ /// Source node metadata filter.
429+ SrcMetadata ( PropertyFilterNew ) ,
430+ /// Destination node metadata filter.
431+ DstMetadata ( PropertyFilterNew ) ,
432+ /// Source node temporal property filter.
433+ SrcTemporalProperty ( PropertyFilterNew ) ,
434+ /// Destination node temporal property filter.
435+ DstTemporalProperty ( PropertyFilterNew ) ,
424436 /// Property filter.
425437 Property ( PropertyFilterNew ) ,
426438 /// Metadata filter.
@@ -1006,33 +1018,79 @@ impl TryFrom<EdgeFilter> for CompositeEdgeFilter {
10061018 fn try_from ( filter : EdgeFilter ) -> Result < Self , Self :: Error > {
10071019 match filter {
10081020 EdgeFilter :: Src ( src) => {
1009- if matches ! ( src. field, NodeField :: NodeType ) {
1010- return Err ( GraphError :: InvalidGqlFilter (
1011- "Src filter does not support NODE_TYPE" . into ( ) ,
1012- ) ) ;
1013- }
10141021 let ( _, field_value, operator) =
10151022 translate_node_field_where ( src. field , & src. where_ ) ?;
1023+ let field_name = match src. field {
1024+ NodeField :: NodeType => "src_node_type" . to_string ( ) ,
1025+ _ => "src" . to_string ( ) ,
1026+ } ;
10161027 Ok ( CompositeEdgeFilter :: Edge ( Filter {
1017- field_name : "src" . to_string ( ) ,
1028+ field_name,
10181029 field_value,
10191030 operator,
10201031 } ) )
10211032 }
10221033 EdgeFilter :: Dst ( dst) => {
1023- if matches ! ( dst. field, NodeField :: NodeType ) {
1024- return Err ( GraphError :: InvalidGqlFilter (
1025- "Dst filter does not support NODE_TYPE" . into ( ) ,
1026- ) ) ;
1027- }
10281034 let ( _, field_value, operator) =
10291035 translate_node_field_where ( dst. field , & dst. where_ ) ?;
1036+ let field_name = match dst. field {
1037+ NodeField :: NodeType => "dst_node_type" . to_string ( ) ,
1038+ _ => "dst" . to_string ( ) ,
1039+ } ;
10301040 Ok ( CompositeEdgeFilter :: Edge ( Filter {
1031- field_name : "dst" . to_string ( ) ,
1041+ field_name,
10321042 field_value,
10331043 operator,
10341044 } ) )
10351045 }
1046+ EdgeFilter :: SrcProperty ( prop) => {
1047+ let prop_ref = PropertyRef :: Property ( prop. name ) ;
1048+ let pf = build_property_filter_from_condition :: < EdgeSrcEndpoint > (
1049+ prop_ref,
1050+ & prop. where_ ,
1051+ ) ?;
1052+ Ok ( CompositeEdgeFilter :: SrcEndpointProperty ( pf) )
1053+ }
1054+ EdgeFilter :: DstProperty ( prop) => {
1055+ let prop_ref = PropertyRef :: Property ( prop. name ) ;
1056+ let pf = build_property_filter_from_condition :: < EdgeDstEndpoint > (
1057+ prop_ref,
1058+ & prop. where_ ,
1059+ ) ?;
1060+ Ok ( CompositeEdgeFilter :: DstEndpointProperty ( pf) )
1061+ }
1062+ EdgeFilter :: SrcMetadata ( prop) => {
1063+ let prop_ref = PropertyRef :: Metadata ( prop. name ) ;
1064+ let pf = build_property_filter_from_condition :: < EdgeSrcEndpoint > (
1065+ prop_ref,
1066+ & prop. where_ ,
1067+ ) ?;
1068+ Ok ( CompositeEdgeFilter :: SrcEndpointProperty ( pf) )
1069+ }
1070+ EdgeFilter :: DstMetadata ( prop) => {
1071+ let prop_ref = PropertyRef :: Metadata ( prop. name ) ;
1072+ let pf = build_property_filter_from_condition :: < EdgeDstEndpoint > (
1073+ prop_ref,
1074+ & prop. where_ ,
1075+ ) ?;
1076+ Ok ( CompositeEdgeFilter :: DstEndpointProperty ( pf) )
1077+ }
1078+ EdgeFilter :: SrcTemporalProperty ( prop) => {
1079+ let prop_ref = PropertyRef :: TemporalProperty ( prop. name ) ;
1080+ let pf = build_property_filter_from_condition :: < EdgeSrcEndpoint > (
1081+ prop_ref,
1082+ & prop. where_ ,
1083+ ) ?;
1084+ Ok ( CompositeEdgeFilter :: SrcEndpointProperty ( pf) )
1085+ }
1086+ EdgeFilter :: DstTemporalProperty ( prop) => {
1087+ let prop_ref = PropertyRef :: TemporalProperty ( prop. name ) ;
1088+ let pf = build_property_filter_from_condition :: < EdgeDstEndpoint > (
1089+ prop_ref,
1090+ & prop. where_ ,
1091+ ) ?;
1092+ Ok ( CompositeEdgeFilter :: DstEndpointProperty ( pf) )
1093+ }
10361094 EdgeFilter :: Property ( p) => {
10371095 let prop_ref = PropertyRef :: Property ( p. name ) ;
10381096 build_edge_filter_from_prop_condition ( prop_ref, & p. where_ )
0 commit comments