use super::{V3Backend, map_v3_error};
use crate::SqliteGraphError;
use crate::backend::native::v3::edge_compat::Direction as EdgeDirection;
use crate::backend::{BackendDirection, NeighborQuery};
use crate::snapshot::SnapshotId;
use std::sync::Arc;
impl V3Backend {
pub fn neighbors_shared(
&self,
snapshot_id: SnapshotId,
node: i64,
query: NeighborQuery,
) -> Result<Arc<[i64]>, SqliteGraphError> {
Self::require_current_snapshot(snapshot_id)?;
if let Some(csr_neighbors) = self.csr_neighbors_shared(snapshot_id, node, &query)? {
return Ok(csr_neighbors);
}
let edge_store = self.edge_store.read();
if let Some(ref edge_type) = query.edge_type {
let dir = match query.direction {
BackendDirection::Outgoing => EdgeDirection::Outgoing,
BackendDirection::Incoming => EdgeDirection::Incoming,
};
edge_store
.neighbors_filtered(node, dir, edge_type)
.map_err(map_v3_error)
} else {
match query.direction {
BackendDirection::Outgoing => edge_store.outgoing(node).map_err(map_v3_error),
BackendDirection::Incoming => edge_store.incoming(node).map_err(map_v3_error),
}
}
}
pub fn neighbors_weighted_shared(
&self,
snapshot_id: SnapshotId,
node: i64,
query: NeighborQuery,
) -> Result<Arc<[(i64, f32)]>, SqliteGraphError> {
Self::require_current_snapshot(snapshot_id)?;
if let Some(csr_neighbors) =
self.csr_neighbors_weighted_shared(snapshot_id, node, &query)?
{
return Ok(csr_neighbors);
}
let edge_store = self.edge_store.read();
let dir = match query.direction {
BackendDirection::Outgoing => EdgeDirection::Outgoing,
BackendDirection::Incoming => EdgeDirection::Incoming,
};
if let Some(ref edge_type) = query.edge_type {
edge_store
.neighbors_weighted_filtered(node, dir, edge_type)
.map_err(map_v3_error)
} else {
edge_store
.neighbors_weighted(node, dir)
.map_err(map_v3_error)
}
}
pub fn neighbors_weighted(
&self,
snapshot_id: SnapshotId,
node: i64,
query: NeighborQuery,
) -> Result<Vec<(i64, f32)>, SqliteGraphError> {
let shared = self.neighbors_weighted_shared(snapshot_id, node, query)?;
Ok(shared.to_vec())
}
pub fn warm_neighbors_for_sources(
&self,
snapshot_id: SnapshotId,
sources: &[i64],
query: NeighborQuery,
) -> Result<usize, SqliteGraphError> {
Self::require_current_snapshot(snapshot_id)?;
let edge_store = self.edge_store.read();
let dir = match query.direction {
BackendDirection::Outgoing => EdgeDirection::Outgoing,
BackendDirection::Incoming => EdgeDirection::Incoming,
};
edge_store
.warm_weighted_neighbors(sources, dir)
.map_err(map_v3_error)
}
pub fn edge_cache_stats(&self) -> (u64, u64, u64, u64, usize) {
self.edge_store.read().cache_stats()
}
pub fn reset_edge_cache_stats(&self) {
self.edge_store.read().reset_stats();
}
}