use errors::Result;
use models;
use serde_json::value::Value as JsonValue;
use std::vec::Vec;
use uuid::Uuid;
pub trait Datastore {
type Trans: Transaction;
fn transaction(&self) -> Result<Self::Trans>;
fn bulk_insert<I>(&self, items: I) -> Result<()>
where
I: Iterator<Item = models::BulkInsertItem>,
{
let trans = self.transaction()?;
for item in items {
match item {
models::BulkInsertItem::Vertex(ref vertex) => {
trans.create_vertex(vertex)?;
}
models::BulkInsertItem::Edge(ref edge_key) => {
trans.create_edge(edge_key)?;
}
models::BulkInsertItem::VertexProperty(id, ref name, ref value) => {
let query = models::VertexQuery::Vertices { ids: vec![id] };
trans.set_vertex_properties(&query, name, value)?;
}
models::BulkInsertItem::EdgeProperty(ref edge_key, ref name, ref value) => {
let query = models::EdgeQuery::Edges {
keys: vec![edge_key.clone()],
};
trans.set_edge_properties(&query, name, value)?;
}
}
}
Ok(())
}
}
pub trait Transaction {
fn create_vertex(&self, vertex: &models::Vertex) -> Result<bool>;
fn create_vertex_from_type(&self, t: models::Type) -> Result<Uuid> {
let v = models::Vertex::new(t);
if !self.create_vertex(&v)? {
Err("UUID already taken".into())
} else {
Ok(v.id)
}
}
fn get_vertices(&self, q: &models::VertexQuery) -> Result<Vec<models::Vertex>>;
fn delete_vertices(&self, q: &models::VertexQuery) -> Result<()>;
fn get_vertex_count(&self) -> Result<u64>;
fn create_edge(&self, key: &models::EdgeKey) -> Result<bool>;
fn get_edges(&self, q: &models::EdgeQuery) -> Result<Vec<models::Edge>>;
fn delete_edges(&self, q: &models::EdgeQuery) -> Result<()>;
fn get_edge_count(
&self,
id: Uuid,
type_filter: Option<&models::Type>,
direction: models::EdgeDirection,
) -> Result<u64>;
fn get_vertex_properties(&self, q: &models::VertexQuery, name: &str) -> Result<Vec<models::VertexProperty>>;
fn set_vertex_properties(&self, q: &models::VertexQuery, name: &str, value: &JsonValue) -> Result<()>;
fn delete_vertex_properties(&self, q: &models::VertexQuery, name: &str) -> Result<()>;
fn get_edge_properties(&self, q: &models::EdgeQuery, name: &str) -> Result<Vec<models::EdgeProperty>>;
fn set_edge_properties(&self, q: &models::EdgeQuery, name: &str, value: &JsonValue) -> Result<()>;
fn delete_edge_properties(&self, q: &models::EdgeQuery, name: &str) -> Result<()>;
}