pub use super::dataset::{
convert_property_path, ConcreteStoreDataset, Dataset, DatasetPathAdapter, InMemoryDataset,
};
use crate::algebra::Solution;
use anyhow::Result;
use super::types::AccessPath;
use super::queryexecutor_type::QueryExecutor;
impl QueryExecutor {
pub(super) fn execute_single_pattern(
&self,
pattern: &crate::algebra::TriplePattern,
dataset: &dyn Dataset,
) -> Result<Solution> {
let access_path = self.select_access_path(pattern);
let solution = match access_path {
AccessPath::SubjectIndex => self.lookup_by_subject(pattern, dataset)?,
AccessPath::PredicateIndex => self.lookup_by_predicate(pattern, dataset)?,
AccessPath::ObjectIndex => self.lookup_by_object(pattern, dataset)?,
AccessPath::FullScan => self.full_scan_pattern(pattern, dataset)?,
};
Ok(solution)
}
pub(super) fn select_access_path(&self, pattern: &crate::algebra::TriplePattern) -> AccessPath {
if !matches!(pattern.subject, crate::algebra::Term::Variable(_)) {
return AccessPath::SubjectIndex;
}
if !matches!(pattern.predicate, crate::algebra::Term::Variable(_)) {
return AccessPath::PredicateIndex;
}
if !matches!(pattern.object, crate::algebra::Term::Variable(_)) {
return AccessPath::ObjectIndex;
}
AccessPath::FullScan
}
pub(super) fn lookup_by_subject(
&self,
pattern: &crate::algebra::TriplePattern,
dataset: &dyn Dataset,
) -> Result<Solution> {
self.execute_pattern_with_dataset(pattern, dataset)
}
pub(super) fn lookup_by_predicate(
&self,
pattern: &crate::algebra::TriplePattern,
dataset: &dyn Dataset,
) -> Result<Solution> {
self.execute_pattern_with_dataset(pattern, dataset)
}
pub(super) fn lookup_by_object(
&self,
pattern: &crate::algebra::TriplePattern,
dataset: &dyn Dataset,
) -> Result<Solution> {
self.execute_pattern_with_dataset(pattern, dataset)
}
pub(super) fn full_scan_pattern(
&self,
pattern: &crate::algebra::TriplePattern,
dataset: &dyn Dataset,
) -> Result<Solution> {
self.execute_pattern_with_dataset(pattern, dataset)
}
}