use crate::{
Result, Rudof,
api::data::DataOperations,
formats::{BackendSpec, DataFormat, DataReaderMode, InputSpec},
};
use rudof_rdf::rdf_impl::EndpointStrategy;
#[derive(Debug)]
pub struct LoadDataBuilder<'a> {
rudof: &'a mut Rudof,
data: Option<&'a [InputSpec]>,
data_format: Option<&'a DataFormat>,
base: Option<&'a str>,
reader_mode: Option<&'a DataReaderMode>,
merge: Option<bool>,
prefixes: Option<&'a [InputSpec]>,
backend: BackendSpec,
endpoint_strategy: EndpointStrategy,
}
impl<'a> LoadDataBuilder<'a> {
pub(crate) fn new(rudof: &'a mut Rudof) -> Self {
Self {
rudof,
data: None,
data_format: None,
base: None,
reader_mode: None,
merge: None,
prefixes: None,
backend: BackendSpec::default(),
endpoint_strategy: EndpointStrategy::default(),
}
}
pub fn with_backend(mut self, backend: BackendSpec) -> Self {
self.backend = backend;
self
}
pub fn with_endpoint_strategy(mut self, strategy: EndpointStrategy) -> Self {
self.endpoint_strategy = strategy;
self
}
pub fn with_data(mut self, data: &'a [InputSpec]) -> Self {
self.data = Some(data);
self
}
pub fn with_data_format(mut self, data_format: &'a DataFormat) -> Self {
self.data_format = Some(data_format);
self
}
pub fn with_base(mut self, base: &'a str) -> Self {
self.base = Some(base);
self
}
pub fn with_reader_mode(mut self, reader_mode: &'a DataReaderMode) -> Self {
self.reader_mode = Some(reader_mode);
self
}
pub fn with_endpoint(mut self, endpoint: &str) -> Self {
self.backend = BackendSpec::Endpoint(endpoint.to_string());
self
}
pub fn with_merge(mut self, merge: bool) -> Self {
self.merge = Some(merge);
self
}
pub fn with_prefixes(mut self, prefixes: &'a [InputSpec]) -> Self {
self.prefixes = Some(prefixes);
self
}
pub fn execute(self) -> Result<()> {
match &self.backend {
BackendSpec::Memory => <Rudof as DataOperations>::load_data(
self.rudof,
self.data,
self.data_format,
self.base,
None,
self.reader_mode,
self.merge,
self.prefixes,
self.endpoint_strategy,
),
BackendSpec::Endpoint(url) => <Rudof as DataOperations>::load_data(
self.rudof,
self.data,
self.data_format,
self.base,
Some(url.as_str()),
self.reader_mode,
self.merge,
self.prefixes,
self.endpoint_strategy,
),
BackendSpec::Qlever => self.execute_qlever(),
BackendSpec::Lbug => Err(Box::new(crate::errors::DataError::DataSourceSpec {
message: "the 'lbug' backend cannot supply RDF data yet: rudof has no PG\u{2192}RDF \
materialization (only RDF\u{2192}PG, via `rudof load`/`ddl`, exists today). \
Use `rudof connect`/`load`/`query --dialect cypher` to work with LadybugDB \
directly, or pick --backend memory|qlever|endpoint=... for RDF sources. \
See https://github.com/rudof-project/rudof/discussions/747"
.to_string(),
})
.into()),
}
}
#[cfg(feature = "qlever")]
fn execute_qlever(self) -> Result<()> {
crate::api::data::implementations::load_data_via_qlever(
self.rudof,
self.data,
self.data_format,
self.base,
self.prefixes,
)
}
#[cfg(not(feature = "qlever"))]
fn execute_qlever(self) -> Result<()> {
Err(Box::new(crate::errors::DataError::DataSourceSpec {
message: "--backend qlever was passed but this rudof binary was built without the \
`qlever` feature. Rebuild with `cargo install rudof_cli --features qlever`."
.to_string(),
})
.into())
}
}