use model::*; use std::fmt; use std::iter::empty; use std::iter::once; use std::iter::FromIterator; use std::iter::Iterator; use std::sync::Arc; use store::numeric_encoder::*; use url::Url; use Result; /// Defines the Store traits that is used to have efficient binary storage pub trait EncodedQuadsStore: StringStore + Sized + 'static { type QuadsIterator: Iterator> + 'static; type QuadsForSubjectIterator: Iterator> + 'static; type QuadsForSubjectPredicateIterator: Iterator> + 'static; type QuadsForSubjectPredicateObjectIterator: Iterator> + 'static; type QuadsForSubjectObjectIterator: Iterator> + 'static; type QuadsForPredicateIterator: Iterator> + 'static; type QuadsForPredicateObjectIterator: Iterator> + 'static; type QuadsForObjectIterator: Iterator> + 'static; type QuadsForGraphIterator: Iterator> + 'static; type QuadsForSubjectGraphIterator: Iterator> + 'static; type QuadsForSubjectPredicateGraphIterator: Iterator> + 'static; type QuadsForSubjectObjectGraphIterator: Iterator> + 'static; type QuadsForPredicateGraphIterator: Iterator> + 'static; type QuadsForPredicateObjectGraphIterator: Iterator> + 'static; type QuadsForObjectGraphIterator: Iterator> + 'static; fn encoder(&self) -> Encoder> { Encoder::new(DelegatingStringStore(&self)) } fn quads(&self) -> Result; fn quads_for_subject(&self, subject: EncodedTerm) -> Result; fn quads_for_subject_predicate( &self, subject: EncodedTerm, predicate: EncodedTerm, ) -> Result; fn quads_for_subject_predicate_object( &self, subject: EncodedTerm, predicate: EncodedTerm, object: EncodedTerm, ) -> Result; fn quads_for_subject_object( &self, subject: EncodedTerm, object: EncodedTerm, ) -> Result; fn quads_for_predicate( &self, predicate: EncodedTerm, ) -> Result; fn quads_for_predicate_object( &self, predicate: EncodedTerm, object: EncodedTerm, ) -> Result; fn quads_for_object(&self, object: EncodedTerm) -> Result; fn quads_for_graph(&self, graph_name: EncodedTerm) -> Result; fn quads_for_subject_graph( &self, subject: EncodedTerm, graph_name: EncodedTerm, ) -> Result; fn quads_for_subject_predicate_graph( &self, subject: EncodedTerm, predicate: EncodedTerm, graph_name: EncodedTerm, ) -> Result; fn quads_for_subject_object_graph( &self, subject: EncodedTerm, object: EncodedTerm, graph_name: EncodedTerm, ) -> Result; fn quads_for_predicate_graph( &self, predicate: EncodedTerm, graph_name: EncodedTerm, ) -> Result; fn quads_for_predicate_object_graph( &self, predicate: EncodedTerm, object: EncodedTerm, graph_name: EncodedTerm, ) -> Result; fn quads_for_object_graph( &self, object: EncodedTerm, graph_name: EncodedTerm, ) -> Result; fn contains(&self, quad: &EncodedQuad) -> Result; fn insert(&self, quad: &EncodedQuad) -> Result<()>; fn remove(&self, quad: &EncodedQuad) -> Result<()>; fn quads_for_pattern( &self, subject: Option, predicate: Option, object: Option, graph_name: Option, ) -> Result>>> { Ok(match subject { Some(subject) => match predicate { Some(predicate) => match object { Some(object) => match graph_name { Some(graph_name) => { let quad = EncodedQuad::new(subject, predicate, object, graph_name); if self.contains(&quad)? { Box::new(once(Ok(quad))) } else { Box::new(empty()) } } None => Box::new( self.quads_for_subject_predicate_object(subject, predicate, object)?, ), }, None => match graph_name { Some(graph_name) => Box::new( self.quads_for_subject_predicate_graph(subject, predicate, graph_name)?, ), None => Box::new(self.quads_for_subject_predicate(subject, predicate)?), }, }, None => match object { Some(object) => match graph_name { Some(graph_name) => Box::new( self.quads_for_subject_object_graph(subject, object, graph_name)?, ), None => Box::new(self.quads_for_subject_object(subject, object)?), }, None => match graph_name { Some(graph_name) => { Box::new(self.quads_for_subject_graph(subject, graph_name)?) } None => Box::new(self.quads_for_subject(subject)?), }, }, }, None => match predicate { Some(predicate) => match object { Some(object) => match graph_name { Some(graph_name) => Box::new( self.quads_for_predicate_object_graph(predicate, object, graph_name)?, ), None => Box::new(self.quads_for_predicate_object(predicate, object)?), }, None => match graph_name { Some(graph_name) => { Box::new(self.quads_for_predicate_graph(predicate, graph_name)?) } None => Box::new(self.quads_for_predicate(predicate)?), }, }, None => match object { Some(object) => match graph_name { Some(graph_name) => { Box::new(self.quads_for_object_graph(object, graph_name)?) } None => Box::new(self.quads_for_object(object)?), }, None => match graph_name { Some(graph_name) => Box::new(self.quads_for_graph(graph_name)?), None => Box::new(self.quads()?), }, }, }, }) } } pub struct StoreDataset { store: Arc, } impl StoreDataset { pub fn new_from_store(store: S) -> Self { Self { store: Arc::new(store), } } pub(crate) fn encoded(&self) -> Arc { self.store.clone() } } impl Dataset for StoreDataset { type NamedGraph = StoreNamedGraph; type DefaultGraph = StoreDefaultGraph; type UnionGraph = StoreUnionGraph; type QuadsIterator = QuadsIterator; type QuadsForSubjectIterator = QuadsIterator; type QuadsForSubjectPredicateIterator = QuadsIterator; type QuadsForSubjectPredicateObjectIterator = QuadsIterator; type QuadsForSubjectObjectIterator = QuadsIterator; type QuadsForPredicateIterator = QuadsIterator; type QuadsForPredicateObjectIterator = QuadsIterator; type QuadsForObjectIterator = QuadsIterator; fn named_graph(&self, name: &NamedOrBlankNode) -> Result> { Ok(StoreNamedGraph { store: self.store.clone(), name: name.clone(), encoded_name: self.store.encoder().encode_named_or_blank_node(name)?, }) } fn default_graph(&self) -> StoreDefaultGraph { StoreDefaultGraph { store: self.store.clone(), } } fn union_graph(&self) -> StoreUnionGraph { StoreUnionGraph { store: self.store.clone(), } } fn quads(&self) -> Result> { Ok(QuadsIterator { iter: self.store.quads()?, store: self.store.clone(), }) } fn quads_for_subject( &self, subject: &NamedOrBlankNode, ) -> Result> { let encoder = self.store.encoder(); Ok(QuadsIterator { iter: self .store .quads_for_subject(encoder.encode_named_or_blank_node(subject)?)?, store: self.store.clone(), }) } fn quads_for_subject_predicate( &self, subject: &NamedOrBlankNode, predicate: &NamedNode, ) -> Result> { let encoder = self.store.encoder(); Ok(QuadsIterator { iter: self.store.quads_for_subject_predicate( encoder.encode_named_or_blank_node(subject)?, encoder.encode_named_node(predicate)?, )?, store: self.store.clone(), }) } fn quads_for_subject_predicate_object( &self, subject: &NamedOrBlankNode, predicate: &NamedNode, object: &Term, ) -> Result> { let encoder = self.store.encoder(); Ok(QuadsIterator { iter: self.store.quads_for_subject_predicate_object( encoder.encode_named_or_blank_node(subject)?, encoder.encode_named_node(predicate)?, encoder.encode_term(object)?, )?, store: self.store.clone(), }) } fn quads_for_subject_object( &self, subject: &NamedOrBlankNode, object: &Term, ) -> Result> { let encoder = self.store.encoder(); Ok(QuadsIterator { iter: self.store.quads_for_subject_object( encoder.encode_named_or_blank_node(subject)?, encoder.encode_term(object)?, )?, store: self.store.clone(), }) } fn quads_for_predicate( &self, predicate: &NamedNode, ) -> Result> { let encoder = self.store.encoder(); Ok(QuadsIterator { iter: self .store .quads_for_predicate(encoder.encode_named_node(predicate)?)?, store: self.store.clone(), }) } fn quads_for_predicate_object( &self, predicate: &NamedNode, object: &Term, ) -> Result> { let encoder = self.store.encoder(); Ok(QuadsIterator { iter: self.store.quads_for_predicate_object( encoder.encode_named_node(predicate)?, encoder.encode_term(object)?, )?, store: self.store.clone(), }) } fn quads_for_object( &self, object: &Term, ) -> Result> { let encoder = self.store.encoder(); Ok(QuadsIterator { iter: self.store.quads_for_object(encoder.encode_term(object)?)?, store: self.store.clone(), }) } fn contains(&self, quad: &Quad) -> Result { self.store .contains(&self.store.encoder().encode_quad(quad)?) } fn insert(&self, quad: &Quad) -> Result<()> { self.store.insert(&self.store.encoder().encode_quad(quad)?) } fn remove(&self, quad: &Quad) -> Result<()> { self.store.remove(&self.store.encoder().encode_quad(quad)?) } fn len(&self) -> Result { Ok(self.store.quads()?.count()) } fn is_empty(&self) -> Result { Ok(self.store.quads()?.any(|_| true)) } } impl fmt::Display for StoreDataset { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { for quad in self.iter().map_err(|_| fmt::Error)? { writeln!(fmt, "{}", quad.map_err(|_| fmt::Error)?)?; } Ok(()) } } impl Default for StoreDataset { fn default() -> Self { Self::new_from_store(S::default()) } } impl FromIterator for StoreDataset { fn from_iter>(iter: I) -> Self { let dataset = Self::default(); for quad in iter { dataset.insert(&quad).unwrap(); } dataset } } impl<'a, S: EncodedQuadsStore + Default> FromIterator<&'a Quad> for StoreDataset { fn from_iter>(iter: I) -> Self { let dataset = Self::default(); for quad in iter { dataset.insert(quad).unwrap(); } dataset } } pub struct StoreNamedGraph { store: Arc, name: NamedOrBlankNode, encoded_name: EncodedTerm, } impl Graph for StoreNamedGraph { type TriplesIterator = TriplesIterator; type TriplesForSubjectIterator = TriplesIterator; type ObjectsForSubjectPredicateIterator = ObjectsIterator; type PredicatesForSubjectObjectIterator = PredicatesIterator; type TriplesForPredicateIterator = TriplesIterator; type SubjectsForPredicateObjectIterator = SubjectsIterator; type TriplesForObjectIterator = TriplesIterator; fn triples(&self) -> Result> { Ok(TriplesIterator { iter: self.store.quads_for_graph(self.encoded_name)?, store: self.store.clone(), }) } fn triples_for_subject( &self, subject: &NamedOrBlankNode, ) -> Result> { let encoder = self.store.encoder(); Ok(TriplesIterator { iter: self.store.quads_for_subject_graph( encoder.encode_named_or_blank_node(subject)?, self.encoded_name, )?, store: self.store.clone(), }) } fn objects_for_subject_predicate( &self, subject: &NamedOrBlankNode, predicate: &NamedNode, ) -> Result> { let encoder = self.store.encoder(); Ok(ObjectsIterator { iter: self.store.quads_for_subject_predicate_graph( encoder.encode_named_or_blank_node(subject)?, encoder.encode_named_node(predicate)?, self.encoded_name, )?, store: self.store.clone(), }) } fn predicates_for_subject_object( &self, subject: &NamedOrBlankNode, object: &Term, ) -> Result> { let encoder = self.store.encoder(); Ok(PredicatesIterator { iter: self.store.quads_for_subject_object_graph( encoder.encode_named_or_blank_node(subject)?, encoder.encode_term(object)?, self.encoded_name, )?, store: self.store.clone(), }) } fn triples_for_predicate( &self, predicate: &NamedNode, ) -> Result> { let encoder = self.store.encoder(); Ok(TriplesIterator { iter: self.store.quads_for_predicate_graph( encoder.encode_named_node(predicate)?, self.encoded_name, )?, store: self.store.clone(), }) } fn subjects_for_predicate_object( &self, predicate: &NamedNode, object: &Term, ) -> Result> { let encoder = self.store.encoder(); Ok(SubjectsIterator { iter: self.store.quads_for_predicate_object_graph( encoder.encode_named_node(predicate)?, encoder.encode_term(object)?, self.encoded_name, )?, store: self.store.clone(), }) } fn triples_for_object( &self, object: &Term, ) -> Result> { let encoder = self.store.encoder(); Ok(TriplesIterator { iter: self .store .quads_for_object_graph(encoder.encode_term(object)?, self.encoded_name)?, store: self.store.clone(), }) } fn contains(&self, triple: &Triple) -> Result { self.store.contains( &self .store .encoder() .encode_triple_in_graph(triple, self.encoded_name)?, ) } fn insert(&self, triple: &Triple) -> Result<()> { self.store.insert( &self .store .encoder() .encode_triple_in_graph(triple, self.encoded_name)?, ) } fn remove(&self, triple: &Triple) -> Result<()> { self.store.remove( &self .store .encoder() .encode_triple_in_graph(triple, self.encoded_name)?, ) } fn len(&self) -> Result { Ok(self.store.quads_for_graph(self.encoded_name)?.count()) } fn is_empty(&self) -> Result { Ok(self.store.quads_for_graph(self.encoded_name)?.any(|_| true)) } } impl NamedGraph for StoreNamedGraph { fn name(&self) -> &NamedOrBlankNode { &self.name } } impl fmt::Display for StoreNamedGraph { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { for triple in self.iter().map_err(|_| fmt::Error)? { writeln!(fmt, "{}", triple.map_err(|_| fmt::Error)?)?; } Ok(()) } } pub struct StoreDefaultGraph { store: Arc, } impl Graph for StoreDefaultGraph { type TriplesIterator = TriplesIterator; type TriplesForSubjectIterator = TriplesIterator; type ObjectsForSubjectPredicateIterator = ObjectsIterator; type PredicatesForSubjectObjectIterator = PredicatesIterator; type TriplesForPredicateIterator = TriplesIterator; type SubjectsForPredicateObjectIterator = SubjectsIterator; type TriplesForObjectIterator = TriplesIterator; fn triples(&self) -> Result> { Ok(TriplesIterator { iter: self.store.quads_for_graph(ENCODED_DEFAULT_GRAPH)?, store: self.store.clone(), }) } fn triples_for_subject( &self, subject: &NamedOrBlankNode, ) -> Result> { let encoder = self.store.encoder(); Ok(TriplesIterator { iter: self.store.quads_for_subject_graph( encoder.encode_named_or_blank_node(subject)?, ENCODED_DEFAULT_GRAPH, )?, store: self.store.clone(), }) } fn objects_for_subject_predicate( &self, subject: &NamedOrBlankNode, predicate: &NamedNode, ) -> Result> { let encoder = self.store.encoder(); Ok(ObjectsIterator { iter: self.store.quads_for_subject_predicate_graph( encoder.encode_named_or_blank_node(subject)?, encoder.encode_named_node(predicate)?, ENCODED_DEFAULT_GRAPH, )?, store: self.store.clone(), }) } fn predicates_for_subject_object( &self, subject: &NamedOrBlankNode, object: &Term, ) -> Result> { let encoder = self.store.encoder(); Ok(PredicatesIterator { iter: self.store.quads_for_subject_object_graph( encoder.encode_named_or_blank_node(subject)?, encoder.encode_term(object)?, ENCODED_DEFAULT_GRAPH, )?, store: self.store.clone(), }) } fn triples_for_predicate( &self, predicate: &NamedNode, ) -> Result> { let encoder = self.store.encoder(); Ok(TriplesIterator { iter: self.store.quads_for_predicate_graph( encoder.encode_named_node(predicate)?, ENCODED_DEFAULT_GRAPH, )?, store: self.store.clone(), }) } fn subjects_for_predicate_object( &self, predicate: &NamedNode, object: &Term, ) -> Result> { let encoder = self.store.encoder(); Ok(SubjectsIterator { iter: self.store.quads_for_predicate_object_graph( encoder.encode_named_node(predicate)?, encoder.encode_term(object)?, ENCODED_DEFAULT_GRAPH, )?, store: self.store.clone(), }) } fn triples_for_object( &self, object: &Term, ) -> Result> { let encoder = self.store.encoder(); Ok(TriplesIterator { iter: self .store .quads_for_object_graph(encoder.encode_term(object)?, ENCODED_DEFAULT_GRAPH)?, store: self.store.clone(), }) } fn contains(&self, triple: &Triple) -> Result { self.store.contains( &self .store .encoder() .encode_triple_in_graph(triple, ENCODED_DEFAULT_GRAPH)?, ) } fn insert(&self, triple: &Triple) -> Result<()> { self.store.insert( &self .store .encoder() .encode_triple_in_graph(triple, ENCODED_DEFAULT_GRAPH)?, ) } fn remove(&self, triple: &Triple) -> Result<()> { self.store.remove( &self .store .encoder() .encode_triple_in_graph(triple, ENCODED_DEFAULT_GRAPH)?, ) } fn len(&self) -> Result { Ok(self.store.quads_for_graph(ENCODED_DEFAULT_GRAPH)?.count()) } fn is_empty(&self) -> Result { Ok(self .store .quads_for_graph(ENCODED_DEFAULT_GRAPH)? .any(|_| true)) } } impl fmt::Display for StoreDefaultGraph { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { for triple in self.iter().map_err(|_| fmt::Error)? { writeln!(fmt, "{}", triple.map_err(|_| fmt::Error)?)?; } Ok(()) } } impl Default for StoreDefaultGraph { fn default() -> Self { StoreDataset::default().default_graph() } } impl FromIterator for StoreDefaultGraph { fn from_iter>(iter: I) -> Self { let graph = Self::default(); for triple in iter { graph.insert(&triple).unwrap(); } graph } } impl<'a, S: EncodedQuadsStore + Default> FromIterator<&'a Triple> for StoreDefaultGraph { fn from_iter>(iter: I) -> Self { let graph = Self::default(); for triple in iter { graph.insert(triple).unwrap(); } graph } } pub struct StoreUnionGraph { store: Arc, } impl Graph for StoreUnionGraph { type TriplesIterator = TriplesIterator; type TriplesForSubjectIterator = TriplesIterator; type ObjectsForSubjectPredicateIterator = ObjectsIterator; type PredicatesForSubjectObjectIterator = PredicatesIterator; type TriplesForPredicateIterator = TriplesIterator; type SubjectsForPredicateObjectIterator = SubjectsIterator; type TriplesForObjectIterator = TriplesIterator; fn triples(&self) -> Result> { Ok(TriplesIterator { iter: self.store.quads()?, store: self.store.clone(), }) } fn triples_for_subject( &self, subject: &NamedOrBlankNode, ) -> Result> { let encoder = self.store.encoder(); Ok(TriplesIterator { iter: self .store .quads_for_subject(encoder.encode_named_or_blank_node(subject)?)?, store: self.store.clone(), }) } fn objects_for_subject_predicate( &self, subject: &NamedOrBlankNode, predicate: &NamedNode, ) -> Result> { let encoder = self.store.encoder(); Ok(ObjectsIterator { iter: self.store.quads_for_subject_predicate( encoder.encode_named_or_blank_node(subject)?, encoder.encode_named_node(predicate)?, )?, store: self.store.clone(), }) } fn predicates_for_subject_object( &self, subject: &NamedOrBlankNode, object: &Term, ) -> Result> { let encoder = self.store.encoder(); Ok(PredicatesIterator { iter: self.store.quads_for_subject_object( encoder.encode_named_or_blank_node(subject)?, encoder.encode_term(object)?, )?, store: self.store.clone(), }) } fn triples_for_predicate( &self, predicate: &NamedNode, ) -> Result> { let encoder = self.store.encoder(); Ok(TriplesIterator { iter: self .store .quads_for_predicate(encoder.encode_named_node(predicate)?)?, store: self.store.clone(), }) } fn subjects_for_predicate_object( &self, predicate: &NamedNode, object: &Term, ) -> Result> { let encoder = self.store.encoder(); Ok(SubjectsIterator { iter: self.store.quads_for_predicate_object( encoder.encode_named_node(predicate)?, encoder.encode_term(object)?, )?, store: self.store.clone(), }) } fn triples_for_object( &self, object: &Term, ) -> Result> { let encoder = self.store.encoder(); Ok(TriplesIterator { iter: self.store.quads_for_object(encoder.encode_term(object)?)?, store: self.store.clone(), }) } fn contains(&self, triple: &Triple) -> Result { let encoder = self.store.encoder(); Ok(self .store .quads_for_subject_predicate_object( encoder.encode_named_or_blank_node(triple.subject())?, encoder.encode_named_node(triple.predicate())?, encoder.encode_term(triple.object())?, )?.any(|_| true)) } fn insert(&self, _triple: &Triple) -> Result<()> { Err(format_err!("Union graph is not writable")) } fn remove(&self, _triple: &Triple) -> Result<()> { Err(format_err!("Union graph is not writable")) } fn len(&self) -> Result { Ok(self.store.quads()?.count()) } fn is_empty(&self) -> Result { Ok(self.store.quads()?.any(|_| true)) } } impl fmt::Display for StoreUnionGraph { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { for triple in self.iter().map_err(|_| fmt::Error)? { writeln!(fmt, "{}", triple.map_err(|_| fmt::Error)?)?; } Ok(()) } } pub struct DelegatingStringStore<'a, S: 'a + StringStore + Sized>(&'a S); impl<'a, S: StringStore> StringStore for DelegatingStringStore<'a, S> { fn insert_str(&self, value: &str) -> Result { self.0.insert_str(value) } fn get_str(&self, id: u64) -> Result { self.0.get_str(id) } fn get_url(&self, id: u64) -> Result { self.0.get_url(id) } } pub struct QuadsIterator>, S: EncodedQuadsStore> { iter: I, store: Arc, } impl>, S: EncodedQuadsStore> Iterator for QuadsIterator { type Item = Result; fn next(&mut self) -> Option> { self.iter .next() .map(|k| k.and_then(|quad| self.store.encoder().decode_quad(&quad))) } } pub struct TriplesIterator>, S: EncodedQuadsStore> { iter: I, store: Arc, } impl>, S: EncodedQuadsStore> Iterator for TriplesIterator { type Item = Result; fn next(&mut self) -> Option> { self.iter .next() .map(|k| k.and_then(|quad| self.store.encoder().decode_triple(&quad))) } } pub struct SubjectsIterator>, S: EncodedQuadsStore> { iter: I, store: Arc, } impl>, S: EncodedQuadsStore> Iterator for SubjectsIterator { type Item = Result; fn next(&mut self) -> Option> { self.iter.next().map(|k| { k.and_then(|quad| { self.store .encoder() .decode_named_or_blank_node(quad.subject) }) }) } } pub struct PredicatesIterator>, S: EncodedQuadsStore> { iter: I, store: Arc, } impl>, S: EncodedQuadsStore> Iterator for PredicatesIterator { type Item = Result; fn next(&mut self) -> Option> { self.iter .next() .map(|k| k.and_then(|quad| self.store.encoder().decode_named_node(quad.predicate))) } } pub struct ObjectsIterator>, S: EncodedQuadsStore> { iter: I, store: Arc, } impl>, S: EncodedQuadsStore> Iterator for ObjectsIterator { type Item = Result; fn next(&mut self) -> Option> { self.iter .next() .map(|k| k.and_then(|quad| self.store.encoder().decode_term(quad.object))) } }