use std::{fmt::Debug, marker::PhantomData};
use crate::{
cursor::{
EdgeIndexDsts, EdgeIndexEdgeIds, EdgeIndexIter, EdgeIndexLabelIds, EdgeIndexSrcs,
EdgeIndexUids, EdgeIndexValues, OutEdgeCur, OutEdgeCurMut, VertexCur, VertexCurMut,
VertexIndexIds, VertexIndexIter, VertexIndexValues,
},
field::{FieldData, FieldSpec},
index::IndexSpec,
raw::RawTransaction,
types::EdgeUid,
Result,
};
trait AsRawTransaction {
fn as_raw(&self) -> &RawTransaction;
}
pub trait TxnRead {
fn is_valid(&self) -> bool;
fn is_read_only(&self) -> bool;
fn vertex_cur(&self) -> Result<VertexCur<'_>>;
fn num_vertex_labels(&self) -> Result<usize>;
fn num_edge_labels(&self) -> Result<usize>;
fn all_vertex_labels(&self) -> Result<Vec<String>>;
fn all_edge_labels(&self) -> Result<Vec<String>>;
fn vertex_label_id(&self, label: &str) -> Result<usize>;
fn edge_label_id(&self, label: &str) -> Result<usize>;
fn vertex_schema(&self, label: &str) -> Result<Vec<FieldSpec>>;
fn edge_schema(&self, label: &str) -> Result<Vec<FieldSpec>>;
fn vertex_field_id(&self, label_id: usize, field_name: &str) -> Result<usize>;
fn vertex_fields_ids<'a, T>(&self, label_id: usize, field_names: T) -> Result<Vec<usize>>
where
T: IntoIterator<Item = &'a str>;
fn edge_field_id(&self, label_id: usize, field_name: &str) -> Result<usize>;
fn edge_fields_ids<'a, T>(&self, label_id: usize, field_names: T) -> Result<Vec<usize>>
where
T: IntoIterator<Item = &'a str>;
fn is_vertex_indexed(&self, label: &str, field: &str) -> Result<bool>;
fn is_edge_indexed(&self, label: &str, field: &str) -> Result<bool>;
fn all_vertex_indexes(&self) -> Result<Vec<IndexSpec>>;
fn all_edge_indexes(&self) -> Result<Vec<IndexSpec>>;
fn vertex_index_iter_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<VertexIndexIter<'_>>;
fn vertex_index_iter_ids_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<VertexIndexIds<'_>>;
fn vertex_index_iter_values_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<VertexIndexValues<'_>>;
fn vertex_index_iter_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<VertexIndexIter<'_>>;
fn vertex_index_iter_ids_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<VertexIndexIds<'_>>;
fn vertex_index_iter_values_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<VertexIndexValues<'_>>;
fn edge_index_iter_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexIter<'_>>;
fn edge_index_iter_uids_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexUids<'_>>;
fn edge_index_iter_srcs_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexSrcs<'_>>;
fn edge_index_iter_dsts_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexDsts<'_>>;
fn edge_index_iter_lids_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexLabelIds<'_>>;
fn edge_index_iter_eids_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexEdgeIds<'_>>;
fn edge_index_iter_values_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexValues<'_>>;
fn edge_index_iter_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexIter<'_>>;
fn edge_index_iter_srcs_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexSrcs<'_>>;
fn edge_index_iter_dsts_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexDsts<'_>>;
fn edge_index_iter_lids_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexLabelIds<'_>>;
fn edge_index_iter_eids_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexEdgeIds<'_>>;
fn edge_index_iter_values_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexValues<'_>>;
fn unique_index_vertex_cur(
&self,
label: &str,
field: &str,
value: &FieldData,
) -> Result<VertexCur<'_>>;
fn unique_index_vertex_cur_by_id(
&self,
label_id: usize,
field_id: usize,
field_value: &FieldData,
) -> Result<VertexCur<'_>>;
fn unique_index_out_edgr_cur(
&self,
label: &str,
field: &str,
value: &FieldData,
) -> Result<OutEdgeCur<'_>>;
fn unique_index_out_edgr_cur_by_id(
&self,
label_id: usize,
field_id: usize,
value: &FieldData,
) -> Result<OutEdgeCur<'_>>;
fn num_vertices(&self) -> Result<usize>;
fn get_vertex_primary_field(&self, label: &str) -> Result<String>;
}
impl<T> TxnRead for T
where
T: AsRawTransaction,
{
fn is_valid(&self) -> bool {
self.as_raw().is_valid()
}
fn is_read_only(&self) -> bool {
self.as_raw().is_read_only()
}
fn vertex_cur(&self) -> Result<VertexCur<'_>> {
self.as_raw().get_vertex_iterator().map(VertexCur::new)
}
fn num_vertex_labels(&self) -> Result<usize> {
self.as_raw().get_num_vertex_labels()
}
fn num_edge_labels(&self) -> Result<usize> {
self.as_raw().get_num_edge_labels()
}
fn all_vertex_labels(&self) -> Result<Vec<String>> {
self.as_raw().list_vertex_labels()
}
fn all_edge_labels(&self) -> Result<Vec<String>> {
self.as_raw().list_edge_labels()
}
fn vertex_label_id(&self, label: &str) -> Result<usize> {
self.as_raw().get_vertex_label_id(label)
}
fn edge_label_id(&self, label: &str) -> Result<usize> {
self.as_raw().get_edge_label_id(label)
}
fn vertex_schema(&self, label: &str) -> Result<Vec<FieldSpec>> {
self.as_raw().get_vertex_schema(label).map(|fss| {
fss.into_iter()
.map(|raw| FieldSpec::from_raw_field_spec(&raw))
.collect()
})
}
fn edge_schema(&self, label: &str) -> Result<Vec<FieldSpec>> {
self.as_raw().get_edge_schema(label).map(|fss| {
fss.into_iter()
.map(|raw| FieldSpec::from_raw_field_spec(&raw))
.collect()
})
}
fn vertex_field_id(&self, label_id: usize, field_name: &str) -> Result<usize> {
self.as_raw().get_vertex_field_id(label_id, field_name)
}
fn vertex_fields_ids<'a, N>(&self, label_id: usize, field_names: N) -> Result<Vec<usize>>
where
N: IntoIterator<Item = &'a str>,
{
self.as_raw().get_vertex_field_ids(label_id, field_names)
}
fn edge_field_id(&self, label_id: usize, field_name: &str) -> Result<usize> {
self.as_raw().get_edge_field_id(label_id, field_name)
}
fn edge_fields_ids<'a, N>(&self, label_id: usize, field_names: N) -> Result<Vec<usize>>
where
N: IntoIterator<Item = &'a str>,
{
self.as_raw().get_edge_field_ids(label_id, field_names)
}
fn is_vertex_indexed(&self, label: &str, field: &str) -> Result<bool> {
self.as_raw().is_vertex_indexed(label, field)
}
fn is_edge_indexed(&self, label: &str, field: &str) -> Result<bool> {
self.as_raw().is_edge_indexed(label, field)
}
fn all_vertex_indexes(&self) -> Result<Vec<IndexSpec>> {
self.as_raw().list_vertex_indexes().map(|iss| {
iss.into_iter()
.map(|is| IndexSpec::from_raw_index_spec(&is))
.collect()
})
}
fn all_edge_indexes(&self) -> Result<Vec<IndexSpec>> {
self.as_raw().list_edge_indexes().map(|iss| {
iss.into_iter()
.map(|is| IndexSpec::from_raw_index_spec(&is))
.collect()
})
}
fn vertex_index_iter_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<VertexIndexIter<'_>> {
self.as_raw()
.get_vertex_index_iterator_by_data(
label,
field,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(VertexIndexIter::new)
}
fn vertex_index_iter_ids_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<VertexIndexIds<'_>> {
self.as_raw()
.get_vertex_index_iterator_by_data(
label,
field,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(VertexIndexIds::new)
}
fn vertex_index_iter_values_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<VertexIndexValues<'_>> {
self.as_raw()
.get_vertex_index_iterator_by_data(
label,
field,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(VertexIndexValues::new)
}
fn vertex_index_iter_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<VertexIndexIter<'_>> {
self.as_raw()
.get_vertex_index_iterator_by_id(
label_id,
field_id,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(VertexIndexIter::new)
}
fn vertex_index_iter_ids_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<VertexIndexIds<'_>> {
self.as_raw()
.get_vertex_index_iterator_by_id(
label_id,
field_id,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(VertexIndexIds::new)
}
fn vertex_index_iter_values_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<VertexIndexValues<'_>> {
self.as_raw()
.get_vertex_index_iterator_by_id(
label_id,
field_id,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(VertexIndexValues::new)
}
fn edge_index_iter_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexIter<'_>> {
self.as_raw()
.get_edge_index_iterator_by_data(
label,
field,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(EdgeIndexIter::new)
}
fn edge_index_iter_uids_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexUids<'_>> {
self.as_raw()
.get_edge_index_iterator_by_data(
label,
field,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(EdgeIndexUids::new)
}
fn edge_index_iter_srcs_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexSrcs<'_>> {
self.as_raw()
.get_edge_index_iterator_by_data(
label,
field,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(EdgeIndexSrcs::new)
}
fn edge_index_iter_dsts_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexDsts<'_>> {
self.as_raw()
.get_edge_index_iterator_by_data(
label,
field,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(EdgeIndexDsts::new)
}
fn edge_index_iter_lids_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexLabelIds<'_>> {
self.as_raw()
.get_edge_index_iterator_by_data(
label,
field,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(EdgeIndexLabelIds::new)
}
fn edge_index_iter_eids_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexEdgeIds<'_>> {
self.as_raw()
.get_edge_index_iterator_by_data(
label,
field,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(EdgeIndexEdgeIds::new)
}
fn edge_index_iter_values_from(
&self,
label: &str,
field: &str,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexValues<'_>> {
self.as_raw()
.get_edge_index_iterator_by_data(
label,
field,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(EdgeIndexValues::new)
}
fn edge_index_iter_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexIter<'_>> {
self.as_raw()
.get_edge_index_iterator_by_id(
label_id,
field_id,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(EdgeIndexIter::new)
}
fn edge_index_iter_srcs_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexSrcs<'_>> {
self.as_raw()
.get_edge_index_iterator_by_id(
label_id,
field_id,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(EdgeIndexSrcs::new)
}
fn edge_index_iter_dsts_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexDsts<'_>> {
self.as_raw()
.get_edge_index_iterator_by_id(
label_id,
field_id,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(EdgeIndexDsts::new)
}
fn edge_index_iter_lids_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexLabelIds<'_>> {
self.as_raw()
.get_edge_index_iterator_by_id(
label_id,
field_id,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(EdgeIndexLabelIds::new)
}
fn edge_index_iter_eids_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexEdgeIds<'_>> {
self.as_raw()
.get_edge_index_iterator_by_id(
label_id,
field_id,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(EdgeIndexEdgeIds::new)
}
fn edge_index_iter_values_from_by_id(
&self,
label_id: usize,
field_id: usize,
start: &FieldData,
end: &FieldData,
) -> Result<EdgeIndexValues<'_>> {
self.as_raw()
.get_edge_index_iterator_by_id(
label_id,
field_id,
&start.as_raw_field_data(),
&end.as_raw_field_data(),
)
.map(EdgeIndexValues::new)
}
fn unique_index_vertex_cur(
&self,
label: &str,
field: &str,
value: &FieldData,
) -> Result<VertexCur<'_>> {
self.as_raw()
.get_vertex_by_unique_index_by_data(label, field, &value.as_raw_field_data())
.map(VertexCur::new)
}
fn unique_index_vertex_cur_by_id(
&self,
label_id: usize,
field_id: usize,
field_value: &FieldData,
) -> Result<VertexCur<'_>> {
self.as_raw()
.get_vertex_by_unique_index_id(label_id, field_id, &field_value.as_raw_field_data())
.map(VertexCur::new)
}
fn unique_index_out_edgr_cur(
&self,
label: &str,
field: &str,
value: &FieldData,
) -> Result<OutEdgeCur<'_>> {
self.as_raw()
.get_edge_by_unique_index_by_data(label, field, &value.as_raw_field_data())
.map(OutEdgeCur::new)
}
fn unique_index_out_edgr_cur_by_id(
&self,
label_id: usize,
field_id: usize,
value: &FieldData,
) -> Result<OutEdgeCur<'_>> {
self.as_raw()
.get_edge_by_unique_index_id(label_id, field_id, &value.as_raw_field_data())
.map(OutEdgeCur::new)
}
fn num_vertices(&self) -> Result<usize> {
self.as_raw().get_num_vertices()
}
fn get_vertex_primary_field(&self, label: &str) -> Result<String> {
self.as_raw().get_vertex_primary_field(label)
}
}
pub trait TxnWrite {
fn vertex_cur_mut(&self) -> Result<VertexCurMut<'_>>;
fn unique_index_vertex_cur_mut(
&self,
label: &str,
field: &str,
value: &FieldData,
) -> Result<VertexCurMut<'_>>;
fn unique_index_vertex_cur_mut_by_id(
&self,
label_id: usize,
field_id: usize,
field_value: &FieldData,
) -> Result<VertexCurMut<'_>>;
fn unique_index_out_edgr_cur_mut(
&self,
label: &str,
field: &str,
value: &FieldData,
) -> Result<OutEdgeCurMut<'_>>;
fn unique_index_out_edgr_cur_mut_by_id(
&self,
label_id: usize,
field_id: usize,
value: &FieldData,
) -> Result<OutEdgeCurMut<'_>>;
fn add_vertex<'a, T>(
&mut self,
label: &str,
field_names: &[&str],
field_values: T,
) -> Result<i64>
where
T: IntoIterator<Item = &'a FieldData>;
fn add_vertex_by_id<'a, 'b, T>(
&mut self,
label_id: usize,
field_ids: &[usize],
field_values: T,
) -> Result<i64>
where
T: IntoIterator<Item = &'b FieldData>;
fn add_edge<'a, T>(
&mut self,
src: i64,
dst: i64,
label: &str,
field_names: &[&str],
field_values: T,
) -> Result<EdgeUid>
where
T: IntoIterator<Item = &'a FieldData>;
fn add_edge_by_id<'a, T>(
&mut self,
src: i64,
dst: i64,
label_id: usize,
field_ids: &[usize],
field_values: T,
) -> Result<EdgeUid>
where
T: IntoIterator<Item = &'a FieldData>;
fn upsert_edge<'a, T>(
&mut self,
src: i64,
dst: i64,
label: &str,
field_names: &[&str],
field_values: T,
) -> Result<bool>
where
T: IntoIterator<Item = &'a FieldData>;
fn upsert_edge_by_id<'a, T>(
&mut self,
src: i64,
dst: i64,
label_id: usize,
field_ids: &[usize],
field_values: T,
) -> Result<bool>
where
T: IntoIterator<Item = &'a FieldData>;
}
pub struct RoTxn<'g> {
inner: RawTransaction,
_graph: PhantomData<&'g ()>,
}
impl<'g> Debug for RoTxn<'g> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("RoTxn").finish()
}
}
impl<'g> RoTxn<'g> {
pub(crate) fn from_raw(raw: RawTransaction) -> Self {
RoTxn {
inner: raw,
_graph: PhantomData,
}
}
pub(crate) fn as_raw(&self) -> &RawTransaction {
&self.inner
}
}
impl<'g> AsRawTransaction for RoTxn<'g> {
fn as_raw(&self) -> &RawTransaction {
&self.inner
}
}
unsafe impl Sync for RoTxn<'_> {}
impl<'g> TxnWrite for RwTxn<'g> {
fn vertex_cur_mut(&self) -> Result<VertexCurMut<'_>> {
self.as_raw().get_vertex_iterator().map(VertexCurMut::new)
}
fn unique_index_vertex_cur_mut(
&self,
label: &str,
field: &str,
value: &FieldData,
) -> Result<VertexCurMut<'_>> {
self.as_raw()
.get_vertex_by_unique_index_by_data(label, field, &value.as_raw_field_data())
.map(VertexCurMut::new)
}
fn unique_index_vertex_cur_mut_by_id(
&self,
label_id: usize,
field_id: usize,
field_value: &FieldData,
) -> Result<VertexCurMut<'_>> {
self.as_raw()
.get_vertex_by_unique_index_id(label_id, field_id, &field_value.as_raw_field_data())
.map(VertexCurMut::new)
}
fn unique_index_out_edgr_cur_mut(
&self,
label: &str,
field: &str,
value: &FieldData,
) -> Result<OutEdgeCurMut<'_>> {
self.as_raw()
.get_edge_by_unique_index_by_data(label, field, &value.as_raw_field_data())
.map(OutEdgeCurMut::new)
}
fn unique_index_out_edgr_cur_mut_by_id(
&self,
label_id: usize,
field_id: usize,
value: &FieldData,
) -> Result<OutEdgeCurMut<'_>> {
self.as_raw()
.get_edge_by_unique_index_id(label_id, field_id, &value.as_raw_field_data())
.map(OutEdgeCurMut::new)
}
fn add_vertex<'a, V>(
&mut self,
label: &str,
field_names: &[&str],
field_values: V,
) -> Result<i64>
where
V: IntoIterator<Item = &'a FieldData>,
{
let raw_field_values: Vec<_> = field_values
.into_iter()
.map(|fd| fd.as_raw_field_data())
.collect();
self.as_raw()
.add_vertex_by_data(label, field_names.iter().copied(), &raw_field_values)
}
fn add_vertex_by_id<'a, 'b, V>(
&mut self,
label_id: usize,
field_ids: &[usize],
field_values: V,
) -> Result<i64>
where
V: IntoIterator<Item = &'b FieldData>,
{
let raw_field_values: Vec<_> = field_values
.into_iter()
.map(|fd| fd.as_raw_field_data())
.collect();
self.as_raw()
.add_vertex_by_ids(label_id, field_ids, &raw_field_values)
}
fn add_edge<'a, V>(
&mut self,
src: i64,
dst: i64,
label: &str,
field_names: &[&str],
field_values: V,
) -> Result<EdgeUid>
where
V: IntoIterator<Item = &'a FieldData>,
{
let raw_field_values: Vec<_> = field_values
.into_iter()
.map(|fd| fd.as_raw_field_data())
.collect();
self.as_raw()
.add_edge_by_data(
src,
dst,
label,
field_names.iter().copied(),
&raw_field_values,
)
.map(|raw| EdgeUid::from_raw(&raw))
}
fn add_edge_by_id<'a, V>(
&mut self,
src: i64,
dst: i64,
label_id: usize,
field_ids: &[usize],
field_values: V,
) -> Result<EdgeUid>
where
V: IntoIterator<Item = &'a FieldData>,
{
let raw_field_values: Vec<_> = field_values
.into_iter()
.map(|fd| fd.as_raw_field_data())
.collect();
self.as_raw()
.add_edge_by_id(src, dst, label_id, field_ids, &raw_field_values)
.map(|raw| EdgeUid::from_raw(&raw))
}
fn upsert_edge<'a, V>(
&mut self,
src: i64,
dst: i64,
label: &str,
field_names: &[&str],
field_values: V,
) -> Result<bool>
where
V: IntoIterator<Item = &'a FieldData>,
{
let raw_field_values: Vec<_> = field_values
.into_iter()
.map(|fd| fd.as_raw_field_data())
.collect();
self.as_raw().upsert_edge_by_data(
src,
dst,
label,
field_names.iter().copied(),
&raw_field_values,
)
}
fn upsert_edge_by_id<'a, V>(
&mut self,
src: i64,
dst: i64,
label_id: usize,
field_ids: &[usize],
field_values: V,
) -> Result<bool>
where
V: IntoIterator<Item = &'a FieldData>,
{
let raw_field_values: Vec<_> = field_values
.into_iter()
.map(|fd| fd.as_raw_field_data())
.collect();
self.as_raw()
.upsert_edge_by_id(src, dst, label_id, field_ids, &raw_field_values)
}
}
pub struct RwTxn<'g> {
inner: RawTransaction,
_graph: PhantomData<&'g ()>,
}
impl<'g> RwTxn<'g> {
pub(crate) fn from_raw(raw: RawTransaction) -> Self {
RwTxn {
inner: raw,
_graph: PhantomData,
}
}
}
impl<'g> AsRawTransaction for RwTxn<'g> {
fn as_raw(&self) -> &RawTransaction {
&self.inner
}
}
impl<'g> Debug for RwTxn<'g> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("RwTxn").finish()
}
}
impl<'g> RwTxn<'g> {
pub fn commit(self) -> Result<()> {
self.inner.commit()
}
}