use std::marker::PhantomData;
use crate::{
field::FieldData,
raw::{RawEdgeCursor, RawInEdgeCursor, RawOutEdgeCursor},
types::EdgeUid,
Result,
};
use super::iter::{
IntoEdgeDsts, IntoEdgeFields, IntoEdgeIds, IntoEdgeIter, IntoEdgeLabelIds, IntoEdgeLabels,
IntoEdgeSrcs, IntoEdgeTemporalIds, IntoEdgeUids,
};
trait AsRawEdgeCursor {
type RawEdgeCur: RawEdgeCursor;
fn as_raw(&self) -> &Self::RawEdgeCur;
}
pub trait EdgeCursor {
fn uid(&self) -> Result<EdgeUid>;
fn src(&self) -> Result<i64>;
fn dst(&self) -> Result<i64>;
fn eid(&self) -> Result<i64>;
fn tid(&self) -> Result<i64>;
fn label(&self) -> Result<String>;
fn lid(&self) -> Result<u16>;
fn is_valid(&self) -> bool;
fn seek_to_next(&mut self) -> Result<Option<&mut Self>>;
fn seek(&mut self, euid: &EdgeUid, nearest: bool) -> Result<&mut Self>;
fn into_edges(self) -> IntoEdgeIter<Self>
where
Self: Sized;
fn into_edge_uids(self) -> IntoEdgeUids<Self>
where
Self: Sized;
fn into_edge_srcs(self) -> IntoEdgeSrcs<Self>
where
Self: Sized;
fn into_edge_dsts(self) -> IntoEdgeDsts<Self>
where
Self: Sized;
fn into_edge_eids(self) -> IntoEdgeIds<Self>
where
Self: Sized;
fn into_edge_tids(self) -> IntoEdgeTemporalIds<Self>
where
Self: Sized;
fn into_edge_lids(self) -> IntoEdgeLabelIds<Self>
where
Self: Sized;
fn into_edge_labels(self) -> IntoEdgeLabels<Self>
where
Self: Sized;
fn into_edge_fields(self) -> IntoEdgeFields<Self>
where
Self: Sized;
fn into_edges_from(self, euid: &EdgeUid, nearest: bool) -> Result<IntoEdgeIter<Self>>
where
Self: Sized;
fn field(&self, name: &str) -> Result<FieldData>;
fn fields(&self, names: &[&str]) -> Result<Vec<FieldData>>;
fn field_by_id(&self, id: usize) -> Result<FieldData>;
fn fields_by_ids(&self, ids: &[usize]) -> Result<Vec<FieldData>>;
fn all_fields(&self) -> Result<Vec<(String, FieldData)>>;
}
impl<T> EdgeCursor for T
where
T: AsRawEdgeCursor,
{
fn uid(&self) -> Result<EdgeUid> {
self.as_raw().get_uid().map(|raw| EdgeUid::from_raw(&raw))
}
fn src(&self) -> Result<i64> {
self.as_raw().get_src()
}
fn dst(&self) -> Result<i64> {
self.as_raw().get_dst()
}
fn eid(&self) -> Result<i64> {
self.as_raw().get_edge_id()
}
fn tid(&self) -> Result<i64> {
self.as_raw().get_temporal_id()
}
fn label(&self) -> Result<String> {
self.as_raw().get_label()
}
fn lid(&self) -> Result<u16> {
self.as_raw().get_label_id()
}
fn is_valid(&self) -> bool {
self.as_raw().is_valid()
}
fn seek_to_next(&mut self) -> Result<Option<&mut Self>> {
if self.as_raw().next()? {
Ok(Some(self))
} else {
Ok(None)
}
}
fn seek(&mut self, euid: &EdgeUid, nearest: bool) -> Result<&mut Self> {
let ret = self.as_raw().goto(&euid.as_raw(), nearest)?;
debug_assert!(ret);
Ok(self)
}
fn into_edges(self) -> IntoEdgeIter<Self>
where
Self: Sized,
{
IntoEdgeIter::new(self)
}
fn into_edge_uids(self) -> IntoEdgeUids<Self>
where
Self: Sized,
{
IntoEdgeUids::new(self)
}
fn into_edge_srcs(self) -> IntoEdgeSrcs<Self>
where
Self: Sized,
{
IntoEdgeSrcs::new(self)
}
fn into_edge_dsts(self) -> IntoEdgeDsts<Self>
where
Self: Sized,
{
IntoEdgeDsts::new(self)
}
fn into_edge_eids(self) -> IntoEdgeIds<Self>
where
Self: Sized,
{
IntoEdgeIds::new(self)
}
fn into_edge_tids(self) -> IntoEdgeTemporalIds<Self>
where
Self: Sized,
{
IntoEdgeTemporalIds::new(self)
}
fn into_edge_lids(self) -> IntoEdgeLabelIds<Self>
where
Self: Sized,
{
IntoEdgeLabelIds::new(self)
}
fn into_edge_labels(self) -> IntoEdgeLabels<Self>
where
Self: Sized,
{
IntoEdgeLabels::new(self)
}
fn into_edge_fields(self) -> IntoEdgeFields<Self>
where
Self: Sized,
{
IntoEdgeFields::new(self)
}
fn into_edges_from(mut self, euid: &EdgeUid, nearest: bool) -> Result<IntoEdgeIter<Self>>
where
Self: Sized,
{
self.seek(euid, nearest)?;
Ok(IntoEdgeIter::new(self))
}
fn field(&self, name: &str) -> Result<FieldData> {
self.as_raw()
.get_field_by_name(name)
.map(|fd| FieldData::from_raw_field_data(&fd))
}
fn fields(&self, names: &[&str]) -> Result<Vec<FieldData>> {
self.as_raw()
.get_fields_by_names(names)
.map(|v| v.iter().map(FieldData::from_raw_field_data).collect())
}
fn field_by_id(&self, id: usize) -> Result<FieldData> {
self.as_raw()
.get_field_by_id(id)
.map(|fd| FieldData::from_raw_field_data(&fd))
}
fn fields_by_ids(&self, ids: &[usize]) -> Result<Vec<FieldData>> {
self.as_raw()
.get_fields_by_ids(ids)
.map(|v| v.iter().map(FieldData::from_raw_field_data).collect())
}
fn all_fields(&self) -> Result<Vec<(String, FieldData)>> {
self.as_raw().get_all_fields().map(|(names, datas)| {
names
.into_iter()
.zip(datas.into_iter())
.map(|(name, data)| (name, FieldData::from_raw_field_data(&data)))
.collect()
})
}
}
pub struct OutEdgeCur<'v> {
inner: RawOutEdgeCursor,
_marker: PhantomData<&'v ()>,
}
impl<'v> OutEdgeCur<'v> {
pub(crate) fn new(raw_cursor: RawOutEdgeCursor) -> OutEdgeCur<'v> {
OutEdgeCur {
inner: raw_cursor,
_marker: PhantomData,
}
}
}
impl<'v> AsRawEdgeCursor for OutEdgeCur<'v> {
type RawEdgeCur = RawOutEdgeCursor;
fn as_raw(&self) -> &Self::RawEdgeCur {
&self.inner
}
}
pub struct InEdgeCur<'v> {
inner: RawInEdgeCursor,
_marker: PhantomData<&'v ()>,
}
impl<'v> InEdgeCur<'v> {
pub(super) fn new(raw_cursor: RawInEdgeCursor) -> InEdgeCur<'v> {
InEdgeCur {
inner: raw_cursor,
_marker: PhantomData,
}
}
}
impl<'v> AsRawEdgeCursor for InEdgeCur<'v> {
type RawEdgeCur = RawInEdgeCursor;
fn as_raw(&self) -> &Self::RawEdgeCur {
&self.inner
}
}
pub trait EdgeCursorMut {
fn set_field(&self, name: &str, value: &FieldData) -> Result<()>;
fn set_field_by_id(&self, id: usize, value: &FieldData) -> Result<()>;
fn set_fields(&self, names: &[&str], values: &[FieldData]) -> Result<()>;
fn set_fields_by_ids(&self, ids: &[usize], values: &[FieldData]) -> Result<()>;
fn delete(&self) -> Result<()>;
}
macro_rules! edge_cursor_mut_impl {
($cursor_mut:ident) => {
impl<'txn> EdgeCursorMut for $cursor_mut<'txn> {
fn set_field(
&self,
name: &str,
value: &$crate::field::FieldData,
) -> $crate::Result<()> {
self.as_raw()
.set_field_by_name(name, &value.as_raw_field_data())
}
fn set_field_by_id(
&self,
id: usize,
value: &$crate::field::FieldData,
) -> $crate::Result<()> {
self.as_raw()
.set_field_by_id(id, &value.as_raw_field_data())
}
fn set_fields(
&self,
names: &[&str],
values: &[$crate::field::FieldData],
) -> $crate::Result<()> {
let values: Vec<_> = values.iter().map(|fd| fd.as_raw_field_data()).collect();
self.as_raw().set_fields_by_names(names, &values)
}
fn set_fields_by_ids(
&self,
ids: &[usize],
values: &[$crate::field::FieldData],
) -> $crate::Result<()> {
let values: Vec<_> = values.iter().map(|fd| fd.as_raw_field_data()).collect();
self.as_raw().set_fields_by_ids(ids, &values)
}
fn delete(&self) -> $crate::Result<()> {
self.as_raw().delete()
}
}
};
}
pub struct OutEdgeCurMut<'v> {
inner: RawOutEdgeCursor,
_marker: PhantomData<&'v mut ()>,
}
impl<'v> OutEdgeCurMut<'v> {
pub(crate) fn new(raw_cursor: RawOutEdgeCursor) -> OutEdgeCurMut<'v> {
OutEdgeCurMut {
inner: raw_cursor,
_marker: PhantomData,
}
}
}
impl<'v> AsRawEdgeCursor for OutEdgeCurMut<'v> {
type RawEdgeCur = RawOutEdgeCursor;
fn as_raw(&self) -> &Self::RawEdgeCur {
&self.inner
}
}
edge_cursor_mut_impl!(OutEdgeCurMut);
pub struct InEdgeCurMut<'v> {
inner: RawInEdgeCursor,
_marker: PhantomData<&'v mut ()>,
}
impl<'v> InEdgeCurMut<'v> {
pub(super) fn new(raw_cursor: RawInEdgeCursor) -> InEdgeCurMut<'v> {
InEdgeCurMut {
inner: raw_cursor,
_marker: PhantomData,
}
}
}
impl<'v> AsRawEdgeCursor for InEdgeCurMut<'v> {
type RawEdgeCur = RawInEdgeCursor;
fn as_raw(&self) -> &Self::RawEdgeCur {
&self.inner
}
}
edge_cursor_mut_impl!(InEdgeCurMut);