use crate::{
Result, Rudof,
api::data::DataOperations,
formats::{BackendSpec, DataFormat, DataReaderMode, InputSpec},
};
#[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,
}
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(),
}
}
pub fn with_backend(mut self, backend: BackendSpec) -> Self {
self.backend = backend;
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,
),
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,
),
BackendSpec::Qlever => self.execute_qlever(),
}
}
#[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())
}
}