wasccgraph_actor/
graph.rs1use common::CAPID_GRAPHDB;
2use crate::{FromTable};
3use wasccgraph_common::{Statistics, ResultSet};
4use wasccgraph_common::protocol::*;
5use wascc_actor::{prelude::{deserialize, serialize}, untyped::{self, UntypedHostBinding}};
6
7#[doc(hidden)]
8pub struct GraphHostBindingBuilder {
9 binding: String,
10}
11
12impl GraphHostBindingBuilder {
13 pub fn graph(&self, graph: &str) -> GraphHostBinding {
14 GraphHostBinding {
15 hostbinding: untyped::host(&self.binding),
16 graph_name: graph.to_string(),
17 }
18 }
19}
20pub struct GraphHostBinding {
21 hostbinding: UntypedHostBinding,
22 graph_name: String,
23}
24
25pub fn host(binding: &str) -> GraphHostBindingBuilder {
28 GraphHostBindingBuilder {
29 binding: binding.to_string(),
30 }
31}
32
33pub fn default() -> GraphHostBindingBuilder {
37 GraphHostBindingBuilder {
38 binding: "default".to_string(),
39 }
40}
41
42impl GraphHostBinding {
43 pub fn query<T: FromTable>(&self, query: &str) -> std::result::Result<T, Box<dyn std::error::Error>> {
47 self.query_with_statistics(query).map(|(value, _)| value)
48 }
49
50 pub fn query_with_statistics<T:FromTable>(&self, query: &str) -> std::result::Result<(T, Statistics), Box<dyn std::error::Error>> {
52 let result_set = self.get_result_set(query).map_err(|e| format!("{}", e))?;
53 let value = T::from_table(&result_set).map_err(|e| format!("{}", e))?;
54 Ok((value, result_set.statistics))
55 }
56
57 pub fn mutate(&mut self, query: &str) -> std::result::Result<(), Box<dyn std::error::Error>> {
61 self.mutate_with_statistics(query).map(|_| ())
62 }
63
64 pub fn mutate_with_statistics(&mut self, query: &str) -> std::result::Result<Statistics, Box<dyn std::error::Error>> {
66 let result_set = self.get_result_set(query).map_err(|e| format!("{}", e))?;
67 Ok(result_set.statistics)
68 }
69
70 pub fn delete(self) -> std::result::Result<(), Box<dyn std::error::Error>> {
74 let delreq = DeleteRequest {
75 graph_name: self.graph_name.to_string()
76 };
77 self.hostbinding.call(CAPID_GRAPHDB, OP_DELETE, serialize(&delreq)?)?;
78 Ok(())
79 }
80
81 pub fn name(&self) -> &str {
83 &self.graph_name
84 }
85
86 fn get_result_set(&self, query: &str) -> std::result::Result<ResultSet, Box<dyn std::error::Error>> {
87 let query = QueryRequest {
88 graph_name: self.graph_name.to_string(),
89 query: query.to_string()
90 };
91 let res = self.hostbinding.call(CAPID_GRAPHDB, OP_QUERY, serialize(&query)?)?;
92 Ok(deserialize(&res)?)
93 }
94}