#![allow(unused)]
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use crate::value;
#[derive(Serialize, Debug, Clone, Copy, PartialEq, Eq)]
#[allow(clippy::upper_case_acronyms)]
pub(crate) enum QueryType
{
KRQL,
KDQL,
SPARQL,
SQL,
}
#[derive(Serialize, Clone)]
pub struct Query
{
pub(crate) query: String,
pub(crate) bindings: HashMap<String, value::Value>,
pub(crate) query_type: QueryType,
}
impl Query
{
pub(crate) fn new(
query: String,
bindings: HashMap<String, value::Value>,
query_type: QueryType,
) -> Query
{
Query {
query,
bindings,
query_type,
}
}
}
#[derive(Debug, Deserialize, Clone)]
pub struct ResultMetadata
{
pub(crate) error: String,
pub(crate) query: String,
pub(crate) success: bool,
}
#[derive(Debug, Deserialize, Clone)]
pub struct ResultHead
{
pub(crate) vars: Vec<String>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct ResultResults
{
pub(crate) bindings: Vec<value::ValueHash>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct Result
{
#[serde(rename = "__knowL")]
pub(crate) metadata: ResultMetadata,
pub(crate) head: ResultHead,
pub(crate) results: ResultResults,
}
#[cfg(test)]
mod tests
{
use crate::queries::krql;
#[test]
fn it_can_parse_failed_result()
{
let json_failed = r#"{
"__knowL":
{
"error": "Invalid result.",
"query": "",
"success": false
},
"head": { "vars": [] },
"results":
{
"bindings": []
}
}"#;
let r: super::Result = serde_json::from_str(json_failed).unwrap();
assert_eq!(r.metadata.error, "Invalid result.");
assert_eq!(r.metadata.query, "");
assert!(!r.metadata.success);
assert_eq!(r.head.vars.len(), 0);
assert_eq!(r.results.bindings.len(), 0);
}
#[test]
fn it_can_parse_succesful_result()
{
let json_success = r#"{
"__knowL":{
"error":"",
"query":"{\"test\":{\"return\":{\"datatype\":\"http://www.w3.org/2001/XMLSchema#long\",\"value\":12}}}",
"success":true
},
"head":{
"vars":[
"data"
]
},
"results":{
"bindings":[
{
"data":{
"type":"literal",
"datatype":"http://www.w3.org/2001/XMLSchema#long",
"value":12
}
}
]
}
}"#;
let r: super::Result = serde_json::from_str(json_success).unwrap();
assert_eq!(r.metadata.error, "");
assert_eq!(
r.metadata.query,
"{\"test\":{\"return\":{\"datatype\":\"http://www.w3.org/2001/XMLSchema#long\",\"value\":12}}}"
);
assert!(r.metadata.success);
assert_eq!(r.head.vars, ["data"]);
assert_eq!(r.results.bindings.len(), 1);
let v0 = r.results.bindings.first().unwrap();
assert_eq!(v0.len(), 1);
let v0data = v0.get("data").unwrap();
assert_eq!(*v0data, 12.into());
}
}