use pyo3::exceptions::PyRuntimeError;
use pyo3::prelude::*;
use crate::core::single_file::SingleFileDB as RustSingleFileDB;
use crate::graph::db::GraphDB as RustGraphDB;
use crate::graph::edges::{
del_edge_prop as graph_del_edge_prop, get_edge_prop_db, get_edge_props_db,
set_edge_prop as graph_set_edge_prop,
};
use crate::graph::nodes::{
del_node_prop as graph_del_node_prop, get_node_prop_db, get_node_props_db,
set_node_prop as graph_set_node_prop,
};
use crate::graph::tx::TxHandle as GraphTxHandle;
use crate::types::{ETypeId, NodeId, PropKeyId, PropValue as CorePropValue};
use crate::pyo3_bindings::types::{NodeProp, PropValue};
pub trait PropertyOps {
fn set_node_prop_impl(&self, node_id: i64, key_id: u32, value: PropValue) -> PyResult<()>;
fn get_node_prop_impl(&self, node_id: i64, key_id: u32) -> PyResult<Option<PropValue>>;
fn delete_node_prop_impl(&self, node_id: i64, key_id: u32) -> PyResult<()>;
fn get_node_props_impl(&self, node_id: i64) -> PyResult<Option<Vec<NodeProp>>>;
fn set_edge_prop_impl(
&self,
src: i64,
etype: u32,
dst: i64,
key_id: u32,
value: PropValue,
) -> PyResult<()>;
fn get_edge_prop_impl(
&self,
src: i64,
etype: u32,
dst: i64,
key_id: u32,
) -> PyResult<Option<PropValue>>;
fn delete_edge_prop_impl(&self, src: i64, etype: u32, dst: i64, key_id: u32) -> PyResult<()>;
fn get_edge_props_impl(&self, src: i64, etype: u32, dst: i64) -> PyResult<Option<Vec<NodeProp>>>;
}
pub fn set_node_prop_single(
db: &RustSingleFileDB,
node_id: NodeId,
key_id: PropKeyId,
value: CorePropValue,
) -> PyResult<()> {
db.set_node_prop(node_id, key_id, value)
.map_err(|e| PyRuntimeError::new_err(format!("Failed to set property: {e}")))
}
pub fn set_node_prop_by_name_single(
db: &RustSingleFileDB,
node_id: NodeId,
key_name: &str,
value: CorePropValue,
) -> PyResult<()> {
db.set_node_prop_by_name(node_id, key_name, value)
.map_err(|e| PyRuntimeError::new_err(format!("Failed to set property: {e}")))
}
pub fn get_node_prop_single(
db: &RustSingleFileDB,
node_id: NodeId,
key_id: PropKeyId,
) -> Option<PropValue> {
db.get_node_prop(node_id, key_id).map(|v| v.into())
}
pub fn delete_node_prop_single(
db: &RustSingleFileDB,
node_id: NodeId,
key_id: PropKeyId,
) -> PyResult<()> {
db.delete_node_prop(node_id, key_id)
.map_err(|e| PyRuntimeError::new_err(format!("Failed to delete property: {e}")))
}
pub fn get_node_props_single(db: &RustSingleFileDB, node_id: NodeId) -> Option<Vec<NodeProp>> {
db.get_node_props(node_id).map(|props| {
props
.into_iter()
.map(|(k, v)| NodeProp {
key_id: k,
value: v.into(),
})
.collect()
})
}
pub fn set_edge_prop_single(
db: &RustSingleFileDB,
src: NodeId,
etype: ETypeId,
dst: NodeId,
key_id: PropKeyId,
value: CorePropValue,
) -> PyResult<()> {
db.set_edge_prop(src, etype, dst, key_id, value)
.map_err(|e| PyRuntimeError::new_err(format!("Failed to set edge property: {e}")))
}
pub fn set_edge_prop_by_name_single(
db: &RustSingleFileDB,
src: NodeId,
etype: ETypeId,
dst: NodeId,
key_name: &str,
value: CorePropValue,
) -> PyResult<()> {
db.set_edge_prop_by_name(src, etype, dst, key_name, value)
.map_err(|e| PyRuntimeError::new_err(format!("Failed to set edge property: {e}")))
}
pub fn get_edge_prop_single(
db: &RustSingleFileDB,
src: NodeId,
etype: ETypeId,
dst: NodeId,
key_id: PropKeyId,
) -> Option<PropValue> {
db.get_edge_prop(src, etype, dst, key_id).map(|v| v.into())
}
pub fn delete_edge_prop_single(
db: &RustSingleFileDB,
src: NodeId,
etype: ETypeId,
dst: NodeId,
key_id: PropKeyId,
) -> PyResult<()> {
db.delete_edge_prop(src, etype, dst, key_id)
.map_err(|e| PyRuntimeError::new_err(format!("Failed to delete edge property: {e}")))
}
pub fn get_edge_props_single(
db: &RustSingleFileDB,
src: NodeId,
etype: ETypeId,
dst: NodeId,
) -> Option<Vec<NodeProp>> {
db.get_edge_props(src, etype, dst).map(|props| {
props
.into_iter()
.map(|(k, v)| NodeProp {
key_id: k,
value: v.into(),
})
.collect()
})
}
pub fn set_node_prop_graph(
handle: &mut GraphTxHandle,
node_id: NodeId,
key_id: PropKeyId,
value: CorePropValue,
) -> PyResult<()> {
graph_set_node_prop(handle, node_id, key_id, value)
.map_err(|e| PyRuntimeError::new_err(format!("Failed to set property: {e}")))?;
Ok(())
}
pub fn get_node_prop_graph(
db: &RustGraphDB,
node_id: NodeId,
key_id: PropKeyId,
) -> Option<PropValue> {
get_node_prop_db(db, node_id, key_id).map(|v| v.into())
}
pub fn delete_node_prop_graph(
handle: &mut GraphTxHandle,
node_id: NodeId,
key_id: PropKeyId,
) -> PyResult<()> {
graph_del_node_prop(handle, node_id, key_id)
.map_err(|e| PyRuntimeError::new_err(format!("Failed to delete property: {e}")))?;
Ok(())
}
pub fn get_node_props_graph(db: &RustGraphDB, node_id: NodeId) -> Option<Vec<NodeProp>> {
get_node_props_db(db, node_id).map(|props| {
props
.into_iter()
.map(|(k, v)| NodeProp {
key_id: k,
value: v.into(),
})
.collect()
})
}
pub fn set_edge_prop_graph(
handle: &mut GraphTxHandle,
src: NodeId,
etype: ETypeId,
dst: NodeId,
key_id: PropKeyId,
value: CorePropValue,
) -> PyResult<()> {
graph_set_edge_prop(handle, src, etype, dst, key_id, value)
.map_err(|e| PyRuntimeError::new_err(format!("Failed to set edge property: {e}")))?;
Ok(())
}
pub fn get_edge_prop_graph(
db: &RustGraphDB,
src: NodeId,
etype: ETypeId,
dst: NodeId,
key_id: PropKeyId,
) -> Option<PropValue> {
get_edge_prop_db(db, src, etype, dst, key_id).map(|v| v.into())
}
pub fn delete_edge_prop_graph(
handle: &mut GraphTxHandle,
src: NodeId,
etype: ETypeId,
dst: NodeId,
key_id: PropKeyId,
) -> PyResult<()> {
graph_del_edge_prop(handle, src, etype, dst, key_id)
.map_err(|e| PyRuntimeError::new_err(format!("Failed to delete edge property: {e}")))?;
Ok(())
}
pub fn get_edge_props_graph(
db: &RustGraphDB,
src: NodeId,
etype: ETypeId,
dst: NodeId,
) -> Option<Vec<NodeProp>> {
get_edge_props_db(db, src, etype, dst).map(|props| {
props
.into_iter()
.map(|(k, v)| NodeProp {
key_id: k,
value: v.into(),
})
.collect()
})
}
pub fn get_node_prop_string_single(
db: &RustSingleFileDB,
node_id: NodeId,
key_id: PropKeyId,
) -> Option<String> {
db.get_node_prop(node_id, key_id).and_then(|v| match v {
CorePropValue::String(s) => Some(s),
_ => None,
})
}
pub fn get_node_prop_int_single(
db: &RustSingleFileDB,
node_id: NodeId,
key_id: PropKeyId,
) -> Option<i64> {
db.get_node_prop(node_id, key_id).and_then(|v| match v {
CorePropValue::I64(i) => Some(i),
_ => None,
})
}
pub fn get_node_prop_float_single(
db: &RustSingleFileDB,
node_id: NodeId,
key_id: PropKeyId,
) -> Option<f64> {
db.get_node_prop(node_id, key_id).and_then(|v| match v {
CorePropValue::F64(f) => Some(f),
_ => None,
})
}
pub fn get_node_prop_bool_single(
db: &RustSingleFileDB,
node_id: NodeId,
key_id: PropKeyId,
) -> Option<bool> {
db.get_node_prop(node_id, key_id).and_then(|v| match v {
CorePropValue::Bool(b) => Some(b),
_ => None,
})
}
pub fn get_node_prop_string_graph(
db: &RustGraphDB,
node_id: NodeId,
key_id: PropKeyId,
) -> Option<String> {
get_node_prop_db(db, node_id, key_id).and_then(|v| match v {
CorePropValue::String(s) => Some(s),
_ => None,
})
}
pub fn get_node_prop_int_graph(
db: &RustGraphDB,
node_id: NodeId,
key_id: PropKeyId,
) -> Option<i64> {
get_node_prop_db(db, node_id, key_id).and_then(|v| match v {
CorePropValue::I64(i) => Some(i),
_ => None,
})
}
pub fn get_node_prop_float_graph(
db: &RustGraphDB,
node_id: NodeId,
key_id: PropKeyId,
) -> Option<f64> {
get_node_prop_db(db, node_id, key_id).and_then(|v| match v {
CorePropValue::F64(f) => Some(f),
_ => None,
})
}
pub fn get_node_prop_bool_graph(
db: &RustGraphDB,
node_id: NodeId,
key_id: PropKeyId,
) -> Option<bool> {
get_node_prop_db(db, node_id, key_id).and_then(|v| match v {
CorePropValue::Bool(b) => Some(b),
_ => None,
})
}
#[cfg(test)]
mod tests {
}