use crate::{
core::entities::LayerIds,
db::api::{
properties::internal::InheritPropertiesOps,
view::internal::{
GraphView, Immutable, InheritEdgeFilterOps, InheritEdgeHistoryFilter,
InheritExplodedEdgeFilterOps, InheritListOps, InheritMaterialize, InheritNodeFilterOps,
InheritNodeHistoryFilter, InheritStorageOps, InheritTimeSemantics,
InternalEdgeLayerFilterOps, InternalLayerOps, Static,
},
},
prelude::GraphViewOps,
};
use raphtory_api::inherit::Base;
use raphtory_storage::{core_ops::InheritCoreGraphOps, graph::edges::edge_ref::EdgeStorageRef};
use std::fmt::{Debug, Formatter};
#[derive(Clone)]
pub struct LayeredGraph<G> {
pub graph: G,
pub layers: LayerIds,
}
impl<'graph, G: GraphViewOps<'graph>> Immutable for LayeredGraph<G> {}
impl<G> Static for LayeredGraph<G> {}
impl<'graph, G: GraphViewOps<'graph> + Debug> Debug for LayeredGraph<G> {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
f.debug_struct("LayeredGraph")
.field("graph", &self.graph as &dyn Debug)
.field("layers", &self.layers)
.finish()
}
}
impl<'graph, G: GraphViewOps<'graph>> Base for LayeredGraph<G> {
type Base = G;
#[inline(always)]
fn base(&self) -> &Self::Base {
&self.graph
}
}
impl<'graph, G: GraphViewOps<'graph>> InheritTimeSemantics for LayeredGraph<G> {}
impl<'graph, G: GraphViewOps<'graph>> InheritListOps for LayeredGraph<G> {}
impl<'graph, G: GraphViewOps<'graph>> InheritCoreGraphOps for LayeredGraph<G> {}
impl<'graph, G: GraphViewOps<'graph>> InheritMaterialize for LayeredGraph<G> {}
impl<'graph, G: GraphViewOps<'graph>> InheritPropertiesOps for LayeredGraph<G> {}
impl<'graph, G: GraphViewOps<'graph>> InheritStorageOps for LayeredGraph<G> {}
impl<'graph, G: GraphViewOps<'graph>> InheritNodeHistoryFilter for LayeredGraph<G> {}
impl<'graph, G: GraphViewOps<'graph>> InheritEdgeHistoryFilter for LayeredGraph<G> {}
impl<'graph, G: GraphView> InheritNodeFilterOps for LayeredGraph<G> {}
impl<'graph, G: GraphViewOps<'graph>> LayeredGraph<G> {
pub fn new(graph: G, layers: LayerIds) -> Self {
Self { graph, layers }
}
}
impl<'graph, G: GraphViewOps<'graph>> InternalLayerOps for LayeredGraph<G> {
fn layer_ids(&self) -> &LayerIds {
&self.layers
}
}
impl<G: GraphView> InternalEdgeLayerFilterOps for LayeredGraph<G> {
fn internal_edge_layer_filtered(&self) -> bool {
!matches!(self.layers, LayerIds::All) || self.graph.internal_edge_layer_filtered()
}
fn internal_layer_filter_edge_list_trusted(&self) -> bool {
matches!(self.layers, LayerIds::All) && self.graph.internal_layer_filter_edge_list_trusted()
}
fn internal_filter_edge_layer(&self, edge: EdgeStorageRef, layer: usize) -> bool {
self.graph.internal_filter_edge_layer(edge, layer) }
}
impl<G: GraphView> InheritEdgeFilterOps for LayeredGraph<G> {}
impl<G: GraphView> InheritExplodedEdgeFilterOps for LayeredGraph<G> {}