use super::GraphPattern;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConstructConfig {
pub deduplicate: bool,
pub max_triples: Option<usize>,
pub collect_stats: bool,
pub blank_node_prefix: String,
}
impl Default for ConstructConfig {
fn default() -> Self {
Self {
deduplicate: true,
max_triples: None,
collect_stats: true,
blank_node_prefix: "b".to_string(),
}
}
}
#[derive(Debug, Clone)]
pub struct ConstructQuery {
pub template: Vec<TemplateTriple>,
pub(crate) where_patterns: Vec<GraphPattern>,
pub prefixes: HashMap<String, String>,
pub limit: Option<usize>,
pub offset: Option<usize>,
}
#[derive(Debug, Clone)]
pub struct TemplateTriple {
pub subject: TemplateTerm,
pub predicate: TemplateTerm,
pub object: TemplateTerm,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TemplateTerm {
Variable(String),
Iri(String),
BlankNode(String),
Literal(String),
LangLiteral { value: String, lang: String },
TypedLiteral { value: String, datatype: String },
}
impl TemplateTerm {
pub(crate) fn instantiate(
&self,
bindings: &HashMap<String, String>,
blank_scope: &mut HashMap<String, String>,
blank_counter: &mut u64,
prefix: &str,
) -> Option<String> {
match self {
TemplateTerm::Variable(name) => bindings.get(name).cloned(),
TemplateTerm::Iri(iri) => Some(iri.clone()),
TemplateTerm::BlankNode(label) => {
let entry = blank_scope.entry(label.clone()).or_insert_with(|| {
*blank_counter += 1;
format!("_:{}{}", prefix, blank_counter)
});
Some(entry.clone())
}
TemplateTerm::Literal(val) => Some(format!("\"{}\"", val)),
TemplateTerm::LangLiteral { value, lang } => Some(format!("\"{}\"@{}", value, lang)),
TemplateTerm::TypedLiteral { value, datatype } => {
Some(format!("\"{}\"^^<{}>", value, datatype))
}
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ConstructStats {
pub solution_count: usize,
pub template_triple_count: usize,
pub raw_triple_count: usize,
pub deduped_triple_count: usize,
pub skipped_unbound: usize,
pub blank_nodes_generated: u64,
}