Merge commit 'd803bfe2b1fe7f5e219e50ac20d6801a0a58ac75' as 'vendor/ruvector'

This commit is contained in:
ruv
2026-02-28 14:39:40 -05:00
7854 changed files with 3522914 additions and 0 deletions

View File

@@ -0,0 +1,149 @@
//! Node implementation
use crate::types::{Label, NodeId, Properties, PropertyValue};
use bincode::{Decode, Encode};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, Encode, Decode)]
pub struct Node {
pub id: NodeId,
pub labels: Vec<Label>,
pub properties: Properties,
}
impl Node {
pub fn new(id: NodeId, labels: Vec<Label>, properties: Properties) -> Self {
Self {
id,
labels,
properties,
}
}
/// Check if node has a specific label
pub fn has_label(&self, label_name: &str) -> bool {
self.labels.iter().any(|l| l.name == label_name)
}
/// Get a property value by key
pub fn get_property(&self, key: &str) -> Option<&PropertyValue> {
self.properties.get(key)
}
/// Set a property value
pub fn set_property(&mut self, key: impl Into<String>, value: PropertyValue) {
self.properties.insert(key.into(), value);
}
/// Add a label to the node
pub fn add_label(&mut self, label: impl Into<String>) {
self.labels.push(Label::new(label));
}
/// Remove a label from the node
pub fn remove_label(&mut self, label_name: &str) -> bool {
let len_before = self.labels.len();
self.labels.retain(|l| l.name != label_name);
self.labels.len() < len_before
}
}
/// Builder for constructing Node instances
#[derive(Debug, Clone, Default)]
pub struct NodeBuilder {
id: Option<NodeId>,
labels: Vec<Label>,
properties: Properties,
}
impl NodeBuilder {
/// Create a new node builder
pub fn new() -> Self {
Self::default()
}
/// Set the node ID
pub fn id(mut self, id: impl Into<String>) -> Self {
self.id = Some(id.into());
self
}
/// Add a label to the node
pub fn label(mut self, label: impl Into<String>) -> Self {
self.labels.push(Label::new(label));
self
}
/// Add multiple labels to the node
pub fn labels(mut self, labels: impl IntoIterator<Item = impl Into<String>>) -> Self {
for label in labels {
self.labels.push(Label::new(label));
}
self
}
/// Add a property to the node
pub fn property<V: Into<PropertyValue>>(mut self, key: impl Into<String>, value: V) -> Self {
self.properties.insert(key.into(), value.into());
self
}
/// Add multiple properties to the node
pub fn properties(mut self, props: Properties) -> Self {
self.properties.extend(props);
self
}
/// Build the node
pub fn build(self) -> Node {
Node {
id: self.id.unwrap_or_else(|| Uuid::new_v4().to_string()),
labels: self.labels,
properties: self.properties,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_node_builder() {
let node = NodeBuilder::new()
.label("Person")
.property("name", "Alice")
.property("age", 30i64)
.build();
assert!(node.has_label("Person"));
assert!(!node.has_label("Organization"));
assert_eq!(
node.get_property("name"),
Some(&PropertyValue::String("Alice".to_string()))
);
}
#[test]
fn test_node_has_label() {
let node = NodeBuilder::new().label("Person").label("Employee").build();
assert!(node.has_label("Person"));
assert!(node.has_label("Employee"));
assert!(!node.has_label("Company"));
}
#[test]
fn test_node_modify_labels() {
let mut node = NodeBuilder::new().label("Person").build();
node.add_label("Employee");
assert!(node.has_label("Employee"));
let removed = node.remove_label("Person");
assert!(removed);
assert!(!node.has_label("Person"));
}
}