Skip to content

Commit f0dcbc3

Browse files
committed
Added edge endpoint filtering to GraphQL. Added property, metadata, temporal property, and node_type filtering on edge src and dst endpoints in GraphQL.
1 parent 4aaf7d6 commit f0dcbc3

File tree

1 file changed

+71
-13
lines changed

1 file changed

+71
-13
lines changed

raphtory-graphql/src/model/graph/filtering.rs

Lines changed: 71 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use dynamic_graphql::{
88
};
99
use 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

Comments
 (0)