Initial change with graph in storage

pull/825/head
Peter Heringer 1 year ago
parent a259879ef1
commit d76871f232
  1. 165
      Cargo.lock
  2. 2
      lib/Cargo.toml
  3. 199
      lib/src/sparql/dataset.rs
  4. 538
      lib/src/sparql/eval.rs
  5. 1964
      lib/src/storage/mod.rs
  6. 388
      lib/src/store.rs

165
Cargo.lock generated

@ -38,13 +38,19 @@ dependencies = [
"derive_arbitrary", "derive_arbitrary",
] ]
[[package]]
name = "arrayvec"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
[[package]] [[package]]
name = "assert_cmd" name = "assert_cmd"
version = "2.0.8" version = "2.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9834fcc22e0874394a010230586367d4a3e9f11b560f469262678547e1d2575e" checksum = "9834fcc22e0874394a010230586367d4a3e9f11b560f469262678547e1d2575e"
dependencies = [ dependencies = [
"bstr", "bstr 1.6.0",
"doc-comment", "doc-comment",
"predicates", "predicates",
"predicates-core", "predicates-core",
@ -133,6 +139,29 @@ dependencies = [
"generic-array", "generic-array",
] ]
[[package]]
name = "boomphf"
version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e8fb7f38fef59c32549861151d63a6190865e60cf690340c13e3d7178b42a2f"
dependencies = [
"crossbeam-utils",
"log",
"rayon",
"wyhash",
]
[[package]]
name = "bstr"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
dependencies = [
"lazy_static",
"memchr",
"regex-automata 0.1.10",
]
[[package]] [[package]]
name = "bstr" name = "bstr"
version = "1.6.0" version = "1.6.0"
@ -140,7 +169,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05"
dependencies = [ dependencies = [
"memchr", "memchr",
"regex-automata", "regex-automata 0.3.6",
"serde", "serde",
] ]
@ -150,6 +179,32 @@ version = "3.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1"
[[package]]
name = "bytemuck"
version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6"
dependencies = [
"bytemuck_derive",
]
[[package]]
name = "bytemuck_derive"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.29",
]
[[package]]
name = "byteorder"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]] [[package]]
name = "cast" name = "cast"
version = "0.3.0" version = "0.3.0"
@ -171,7 +226,7 @@ version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
dependencies = [ dependencies = [
"nom", "nom 7.1.3",
] ]
[[package]] [[package]]
@ -562,6 +617,22 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "gfa"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9632601a032d2ae43f5050b454dd27c2add69b2e52bd46a4888f3aeb6e3629f5"
dependencies = [
"anyhow",
"bstr 0.2.17",
"bytemuck",
"fnv",
"lazy_static",
"memmap",
"nom 5.1.3",
"regex",
]
[[package]] [[package]]
name = "glob" name = "glob"
version = "0.3.1" version = "0.3.1"
@ -575,7 +646,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d" checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"bstr", "bstr 1.6.0",
"fnv", "fnv",
"log", "log",
"regex", "regex",
@ -598,6 +669,23 @@ version = "1.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7"
[[package]]
name = "handlegraph"
version = "0.7.0-alpha.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3aa7cd95ba5db6dfcc1654d0a7ba04b1c9becdd860b907d68f5b320f796334bb"
dependencies = [
"anyhow",
"boomphf",
"bstr 0.2.17",
"crossbeam-channel",
"fnv",
"gfa",
"log",
"rayon",
"succinct",
]
[[package]] [[package]]
name = "hashbrown" name = "hashbrown"
version = "0.12.3" version = "0.12.3"
@ -774,6 +862,19 @@ version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
[[package]]
name = "lexical-core"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe"
dependencies = [
"arrayvec",
"bitflags 1.3.2",
"cfg-if",
"ryu",
"static_assertions",
]
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.147" version = "0.2.147"
@ -827,6 +928,16 @@ version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "memmap"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
dependencies = [
"libc",
"winapi 0.3.9",
]
[[package]] [[package]]
name = "memoffset" name = "memoffset"
version = "0.9.0" version = "0.9.0"
@ -851,6 +962,17 @@ dependencies = [
"adler", "adler",
] ]
[[package]]
name = "nom"
version = "5.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08959a387a676302eebf4ddbcbc611da04285579f76f88ee0506c63b1a61dd4b"
dependencies = [
"lexical-core",
"memchr",
"version_check",
]
[[package]] [[package]]
name = "nom" name = "nom"
version = "7.1.3" version = "7.1.3"
@ -931,6 +1053,8 @@ dependencies = [
"criterion", "criterion",
"digest", "digest",
"getrandom", "getrandom",
"gfa",
"handlegraph",
"hex", "hex",
"js-sys", "js-sys",
"json-event-parser", "json-event-parser",
@ -1372,10 +1496,16 @@ checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
"regex-automata", "regex-automata 0.3.6",
"regex-syntax", "regex-syntax",
] ]
[[package]]
name = "regex-automata"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
[[package]] [[package]]
name = "regex-automata" name = "regex-automata"
version = "0.3.6" version = "0.3.6"
@ -1667,12 +1797,28 @@ version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
[[package]]
name = "static_assertions"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]] [[package]]
name = "strsim" name = "strsim"
version = "0.10.0" version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "succinct"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7798b62081a999bcf090b2f220fee8845dd1c6ffeb17e1bc6ca783825f62a418"
dependencies = [
"byteorder",
"num-traits",
]
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.109" version = "1.0.109"
@ -2090,6 +2236,15 @@ version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]]
name = "wyhash"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf6e163c25e3fac820b4b453185ea2dea3b6a3e0a721d4d23d75bd33734c295"
dependencies = [
"rand_core",
]
[[package]] [[package]]
name = "zstd" name = "zstd"
version = "0.12.4" version = "0.12.4"

@ -43,6 +43,8 @@ oxrdf = { version = "0.1.7", path="oxrdf", features = ["rdf-star", "oxsdatatypes
oxsdatatypes = { version = "0.1.3", path="oxsdatatypes" } oxsdatatypes = { version = "0.1.3", path="oxsdatatypes" }
spargebra = { version = "0.2.8", path="spargebra", features = ["rdf-star", "sep-0002", "sep-0006"] } spargebra = { version = "0.2.8", path="spargebra", features = ["rdf-star", "sep-0002", "sep-0006"] }
sparesults = { version = "0.1.8", path="sparesults", features = ["rdf-star"] } sparesults = { version = "0.1.8", path="sparesults", features = ["rdf-star"] }
gfa = "0.10.1"
handlegraph = "0.7.0-alpha.9"
[target.'cfg(not(target_family = "wasm"))'.dependencies] [target.'cfg(not(target_family = "wasm"))'.dependencies]
libc = "0.2" libc = "0.2"

@ -37,10 +37,11 @@ impl DatasetView {
predicate: Option<&EncodedTerm>, predicate: Option<&EncodedTerm>,
object: Option<&EncodedTerm>, object: Option<&EncodedTerm>,
graph_name: Option<&EncodedTerm>, graph_name: Option<&EncodedTerm>,
) -> impl Iterator<Item = Result<EncodedQuad, EvaluationError>> + 'static { // ) -> impl Iterator<Item = Result<EncodedQuad, EvaluationError>> + 'static {
) -> Vec<crate::model::Term> {
self.reader self.reader
.quads_for_pattern(subject, predicate, object, graph_name) .quads_for_pattern(subject, predicate, object, graph_name)
.map(|t| t.map_err(Into::into)) // .map(|t| t.map_err(Into::into))
} }
#[allow(clippy::needless_collect)] #[allow(clippy::needless_collect)]
@ -50,102 +51,104 @@ impl DatasetView {
predicate: Option<&EncodedTerm>, predicate: Option<&EncodedTerm>,
object: Option<&EncodedTerm>, object: Option<&EncodedTerm>,
graph_name: Option<&EncodedTerm>, graph_name: Option<&EncodedTerm>,
) -> Box<dyn Iterator<Item = Result<EncodedQuad, EvaluationError>>> { // ) -> Box<dyn Iterator<Item = Result<EncodedQuad, EvaluationError>>> {
if let Some(graph_name) = graph_name { ) -> Vec<crate::model::Term> {
if graph_name.is_default_graph() { return Vec::new();
if let Some(default_graph_graphs) = &self.dataset.default { // if let Some(graph_name) = graph_name {
if default_graph_graphs.len() == 1 { // if graph_name.is_default_graph() {
// Single graph optimization // if let Some(default_graph_graphs) = &self.dataset.default {
Box::new( // if default_graph_graphs.len() == 1 {
self.store_encoded_quads_for_pattern( // // Single graph optimization
subject, // Box::new(
predicate, // self.store_encoded_quads_for_pattern(
object, // subject,
Some(&default_graph_graphs[0]), // predicate,
) // object,
.map(|quad| { // Some(&default_graph_graphs[0]),
let quad = quad?; // )
Ok(EncodedQuad::new( // .map(|quad| {
quad.subject, // let quad = quad?;
quad.predicate, // Ok(EncodedQuad::new(
quad.object, // quad.subject,
EncodedTerm::DefaultGraph, // quad.predicate,
)) // quad.object,
}), // EncodedTerm::DefaultGraph,
) // ))
} else { // }),
let iters = default_graph_graphs // )
.iter() // } else {
.map(|graph_name| { // let iters = default_graph_graphs
self.store_encoded_quads_for_pattern( // .iter()
subject, // .map(|graph_name| {
predicate, // self.store_encoded_quads_for_pattern(
object, // subject,
Some(graph_name), // predicate,
) // object,
}) // Some(graph_name),
.collect::<Vec<_>>(); // )
Box::new(iters.into_iter().flatten().map(|quad| { // })
let quad = quad?; // .collect::<Vec<_>>();
Ok(EncodedQuad::new( // Box::new(iters.into_iter().flatten().map(|quad| {
quad.subject, // let quad = quad?;
quad.predicate, // Ok(EncodedQuad::new(
quad.object, // quad.subject,
EncodedTerm::DefaultGraph, // quad.predicate,
)) // quad.object,
})) // EncodedTerm::DefaultGraph,
} // ))
} else { // }))
Box::new( // }
self.store_encoded_quads_for_pattern(subject, predicate, object, None) // } else {
.map(|quad| { // Box::new(
let quad = quad?; // self.store_encoded_quads_for_pattern(subject, predicate, object, None)
Ok(EncodedQuad::new( // .map(|quad| {
quad.subject, // let quad = quad?;
quad.predicate, // Ok(EncodedQuad::new(
quad.object, // quad.subject,
EncodedTerm::DefaultGraph, // quad.predicate,
)) // quad.object,
}), // EncodedTerm::DefaultGraph,
) // ))
} // }),
} else if self // )
.dataset // }
.named // } else if self
.as_ref() // .dataset
.map_or(true, |d| d.contains(graph_name)) // .named
{ // .as_ref()
Box::new(self.store_encoded_quads_for_pattern( // .map_or(true, |d| d.contains(graph_name))
subject, // {
predicate, // Box::new(self.store_encoded_quads_for_pattern(
object, // subject,
Some(graph_name), // predicate,
)) // object,
} else { // Some(graph_name),
Box::new(empty()) // ))
} // } else {
} else if let Some(named_graphs) = &self.dataset.named { // Box::new(empty())
let iters = named_graphs // }
.iter() // } else if let Some(named_graphs) = &self.dataset.named {
.map(|graph_name| { // let iters = named_graphs
self.store_encoded_quads_for_pattern( // .iter()
subject, // .map(|graph_name| {
predicate, // self.store_encoded_quads_for_pattern(
object, // subject,
Some(graph_name), // predicate,
) // object,
}) // Some(graph_name),
.collect::<Vec<_>>(); // )
Box::new(iters.into_iter().flatten()) // })
} else { // .collect::<Vec<_>>();
Box::new( // Box::new(iters.into_iter().flatten())
self.store_encoded_quads_for_pattern(subject, predicate, object, None) // } else {
.filter(|quad| match quad { // Box::new(
Err(_) => true, // self.store_encoded_quads_for_pattern(subject, predicate, object, None)
Ok(quad) => !quad.graph_name.is_default_graph(), // .filter(|quad| match quad {
}), // Err(_) => true,
) // Ok(quad) => !quad.graph_name.is_default_graph(),
} // }),
// )
// }
} }
pub fn encode_term<'a>(&self, term: impl Into<TermRef<'a>>) -> EncodedTerm { pub fn encode_term<'a>(&self, term: impl Into<TermRef<'a>>) -> EncodedTerm {

@ -214,16 +214,14 @@ impl SimpleEvaluator {
let predicate = predicate.clone(); let predicate = predicate.clone();
let object = object.clone(); let object = object.clone();
let graph_name = graph_name.clone(); let graph_name = graph_name.clone();
Box::new(iter.filter_map(move |quad| match quad { Box::new(iter.into_iter().filter_map(move |quad| {
Ok(quad) => { let mut new_tuple = from.clone();
let mut new_tuple = from.clone(); // put_pattern_value(&subject, quad.subject, &mut new_tuple)?;
put_pattern_value(&subject, quad.subject, &mut new_tuple)?; // TODO
put_pattern_value(&predicate, quad.predicate, &mut new_tuple)?; // put_pattern_value(&predicate, quad.predicate, &mut new_tuple)?;
put_pattern_value(&object, quad.object, &mut new_tuple)?; // put_pattern_value(&object, quad.object, &mut new_tuple)?;
put_pattern_value(&graph_name, quad.graph_name, &mut new_tuple)?; // put_pattern_value(&graph_name, quad.graph_name, &mut new_tuple)?;
Some(Ok(new_tuple)) Some(Ok(new_tuple))
}
Err(error) => Some(Err(error)),
})) }))
}) })
} }
@ -3156,8 +3154,9 @@ impl PathEvaluator {
Some(end), Some(end),
Some(graph_name), Some(graph_name),
) )
.into_iter()
.next() .next()
.transpose()? // .transpose()?
.is_some(), .is_some(),
PlanPropertyPath::Reverse(p) => self.eval_closed_in_graph(p, end, start, graph_name)?, PlanPropertyPath::Reverse(p) => self.eval_closed_in_graph(p, end, start, graph_name)?,
PlanPropertyPath::Sequence(a, b) => self PlanPropertyPath::Sequence(a, b) => self
@ -3203,15 +3202,16 @@ impl PathEvaluator {
PlanPropertyPath::NegatedPropertySet(ps) => self PlanPropertyPath::NegatedPropertySet(ps) => self
.dataset .dataset
.encoded_quads_for_pattern(Some(start), None, Some(end), Some(graph_name)) .encoded_quads_for_pattern(Some(start), None, Some(end), Some(graph_name))
.find_map(move |t| match t { .into_iter()
Ok(t) => { .find_map(move |t| {
if ps.iter().any(|p| p.encoded == t.predicate) { // Ok(t) => {
None // if ps.iter().any(|p| p.encoded == t.predicate) {
} else { // None
Some(Ok(())) // } else {
} Some(Ok(()))
} // }
Err(e) => Some(Err(e)), // }
// Err(e) => Some(Err(e)),
}) })
.transpose()? .transpose()?
.is_some(), .is_some(),
@ -3223,97 +3223,100 @@ impl PathEvaluator {
path: &PlanPropertyPath, path: &PlanPropertyPath,
start: &EncodedTerm, start: &EncodedTerm,
end: &EncodedTerm, end: &EncodedTerm,
) -> Box<dyn Iterator<Item = Result<EncodedTerm, EvaluationError>>> { // ) -> Box<dyn Iterator<Item = Result<EncodedTerm, EvaluationError>>> {
match path { ) -> Vec<Term> {
PlanPropertyPath::Path(p) => Box::new( return Vec::new();
self.dataset // match path {
.encoded_quads_for_pattern(Some(start), Some(&p.encoded), Some(end), None) // PlanPropertyPath::Path(p) => Box::new(
.map(|t| Ok(t?.graph_name)), // self.dataset
), // .encoded_quads_for_pattern(Some(start), Some(&p.encoded), Some(end), None)
PlanPropertyPath::Reverse(p) => self.eval_closed_in_unknown_graph(p, end, start), // .into_iter()
PlanPropertyPath::Sequence(a, b) => { // .map(|t| Ok(t.graph_name)),
let eval = self.clone(); // ),
let b = Rc::clone(b); // PlanPropertyPath::Reverse(p) => self.eval_closed_in_unknown_graph(p, end, start),
let end = end.clone(); // PlanPropertyPath::Sequence(a, b) => {
Box::new(self.eval_from_in_unknown_graph(a, start).flat_map_ok( // let eval = self.clone();
move |(middle, graph_name)| { // let b = Rc::clone(b);
eval.eval_closed_in_graph(&b, &middle, &end, &graph_name) // let end = end.clone();
.map(|is_found| is_found.then(|| graph_name)) // Box::new(self.eval_from_in_unknown_graph(a, start).flat_map_ok(
.transpose() // move |(middle, graph_name)| {
}, // eval.eval_closed_in_graph(&b, &middle, &end, &graph_name)
)) // .map(|is_found| is_found.then(|| graph_name))
} // .transpose()
PlanPropertyPath::Alternative(a, b) => Box::new(hash_deduplicate( // },
self.eval_closed_in_unknown_graph(a, start, end) // ))
.chain(self.eval_closed_in_unknown_graph(b, start, end)), // }
)), // PlanPropertyPath::Alternative(a, b) => Box::new(hash_deduplicate(
PlanPropertyPath::ZeroOrMore(p) => { // self.eval_closed_in_unknown_graph(a, start, end)
let eval = self.clone(); // .chain(self.eval_closed_in_unknown_graph(b, start, end)),
let start2 = start.clone(); // )),
let end = end.clone(); // PlanPropertyPath::ZeroOrMore(p) => {
let p = Rc::clone(p); // let eval = self.clone();
self.run_if_term_is_a_dataset_node(start, move |graph_name| { // let start2 = start.clone();
look_in_transitive_closure( // let end = end.clone();
Some(Ok(start2.clone())), // let p = Rc::clone(p);
|e| eval.eval_from_in_graph(&p, &e, &graph_name), // self.run_if_term_is_a_dataset_node(start, move |graph_name| {
&end, // look_in_transitive_closure(
) // Some(Ok(start2.clone())),
.map(|is_found| is_found.then(|| graph_name)) // |e| eval.eval_from_in_graph(&p, &e, &graph_name),
.transpose() // &end,
}) // )
} // .map(|is_found| is_found.then(|| graph_name))
PlanPropertyPath::OneOrMore(p) => { // .transpose()
let eval = self.clone(); // })
let end = end.clone(); // }
let p = Rc::clone(p); // PlanPropertyPath::OneOrMore(p) => {
Box::new( // let eval = self.clone();
self.eval_from_in_unknown_graph(&p, start) // let end = end.clone();
.filter_map(move |r| { // let p = Rc::clone(p);
r.and_then(|(start, graph_name)| { // Box::new(
look_in_transitive_closure( // self.eval_from_in_unknown_graph(&p, start)
Some(Ok(start)), // .filter_map(move |r| {
|e| eval.eval_from_in_graph(&p, &e, &graph_name), // r.and_then(|(start, graph_name)| {
&end, // look_in_transitive_closure(
) // Some(Ok(start)),
.map(|is_found| is_found.then(|| graph_name)) // |e| eval.eval_from_in_graph(&p, &e, &graph_name),
}) // &end,
.transpose() // )
}), // .map(|is_found| is_found.then(|| graph_name))
) // })
} // .transpose()
PlanPropertyPath::ZeroOrOne(p) => { // }),
if start == end { // )
self.run_if_term_is_a_dataset_node(start, |graph_name| Some(Ok(graph_name))) // }
} else { // PlanPropertyPath::ZeroOrOne(p) => {
let eval = self.clone(); // if start == end {
let start2 = start.clone(); // self.run_if_term_is_a_dataset_node(start, |graph_name| Some(Ok(graph_name)))
let end = end.clone(); // } else {
let p = Rc::clone(p); // let eval = self.clone();
self.run_if_term_is_a_dataset_node(start, move |graph_name| { // let start2 = start.clone();
eval.eval_closed_in_graph(&p, &start2, &end, &graph_name) // let end = end.clone();
.map(|is_found| is_found.then(|| graph_name)) // let p = Rc::clone(p);
.transpose() // self.run_if_term_is_a_dataset_node(start, move |graph_name| {
}) // eval.eval_closed_in_graph(&p, &start2, &end, &graph_name)
} // .map(|is_found| is_found.then(|| graph_name))
} // .transpose()
PlanPropertyPath::NegatedPropertySet(ps) => { // })
let ps = Rc::clone(ps); // }
Box::new( // }
self.dataset // PlanPropertyPath::NegatedPropertySet(ps) => {
.encoded_quads_for_pattern(Some(start), None, Some(end), None) // let ps = Rc::clone(ps);
.filter_map(move |t| match t { // Box::new(
Ok(t) => { // self.dataset
if ps.iter().any(|p| p.encoded == t.predicate) { // .encoded_quads_for_pattern(Some(start), None, Some(end), None)
None // .filter_map(move |t| match t {
} else { // Ok(t) => {
Some(Ok(t.graph_name)) // if ps.iter().any(|p| p.encoded == t.predicate) {
} // None
} // } else {
Err(e) => Some(Err(e)), // Some(Ok(t.graph_name))
}), // }
) // }
} // Err(e) => Some(Err(e)),
} // }),
// )
// }
// }
} }
fn eval_from_in_graph( fn eval_from_in_graph(
@ -3321,167 +3324,170 @@ impl PathEvaluator {
path: &PlanPropertyPath, path: &PlanPropertyPath,
start: &EncodedTerm, start: &EncodedTerm,
graph_name: &EncodedTerm, graph_name: &EncodedTerm,
) -> Box<dyn Iterator<Item = Result<EncodedTerm, EvaluationError>>> { // ) -> Box<dyn Iterator<Item = Result<EncodedTerm, EvaluationError>>> {
match path { ) -> Vec<Term> {
PlanPropertyPath::Path(p) => Box::new( Vec::new()
self.dataset
.encoded_quads_for_pattern(
Some(start),
Some(&p.encoded),
None,
Some(graph_name),
)
.map(|t| Ok(t?.object)),
),
PlanPropertyPath::Reverse(p) => self.eval_to_in_graph(p, start, graph_name),
PlanPropertyPath::Sequence(a, b) => {
let eval = self.clone();
let b = Rc::clone(b);
let graph_name2 = graph_name.clone();
Box::new(
self.eval_from_in_graph(a, start, graph_name)
.flat_map_ok(move |middle| {
eval.eval_from_in_graph(&b, &middle, &graph_name2)
}),
)
}
PlanPropertyPath::Alternative(a, b) => Box::new(hash_deduplicate(
self.eval_from_in_graph(a, start, graph_name)
.chain(self.eval_from_in_graph(b, start, graph_name)),
)),
PlanPropertyPath::ZeroOrMore(p) => {
self.run_if_term_is_a_graph_node(start, graph_name, || {
let eval = self.clone();
let p = Rc::clone(p);
let graph_name2 = graph_name.clone();
transitive_closure(Some(Ok(start.clone())), move |e| {
eval.eval_from_in_graph(&p, &e, &graph_name2)
})
})
}
PlanPropertyPath::OneOrMore(p) => {
let eval = self.clone();
let p = Rc::clone(p);
let graph_name2 = graph_name.clone();
Box::new(transitive_closure(
self.eval_from_in_graph(&p, start, graph_name),
move |e| eval.eval_from_in_graph(&p, &e, &graph_name2),
))
}
PlanPropertyPath::ZeroOrOne(p) => {
self.run_if_term_is_a_graph_node(start, graph_name, || {
hash_deduplicate(
once(Ok(start.clone()))
.chain(self.eval_from_in_graph(p, start, graph_name)),
)
})
}
PlanPropertyPath::NegatedPropertySet(ps) => {
let ps = Rc::clone(ps);
Box::new(
self.dataset
.encoded_quads_for_pattern(Some(start), None, None, Some(graph_name))
.filter_map(move |t| match t {
Ok(t) => {
if ps.iter().any(|p| p.encoded == t.predicate) {
None
} else {
Some(Ok(t.object))
}
}
Err(e) => Some(Err(e)),
}),
)
}
}
} }
// match path {
// PlanPropertyPath::Path(p) => Box::new(
// self.dataset
// .encoded_quads_for_pattern(
// Some(start),
// Some(&p.encoded),
// None,
// Some(graph_name),
// )
// .map(|t| Ok(t?.object)),
// ),
// PlanPropertyPath::Reverse(p) => self.eval_to_in_graph(p, start, graph_name),
// PlanPropertyPath::Sequence(a, b) => {
// let eval = self.clone();
// let b = Rc::clone(b);
// let graph_name2 = graph_name.clone();
// Box::new(
// self.eval_from_in_graph(a, start, graph_name)
// .flat_map_ok(move |middle| {
// eval.eval_from_in_graph(&b, &middle, &graph_name2)
// }),
// )
// }
// PlanPropertyPath::Alternative(a, b) => Box::new(hash_deduplicate(
// self.eval_from_in_graph(a, start, graph_name)
// .chain(self.eval_from_in_graph(b, start, graph_name)),
// )),
// PlanPropertyPath::ZeroOrMore(p) => {
// self.run_if_term_is_a_graph_node(start, graph_name, || {
// let eval = self.clone();
// let p = Rc::clone(p);
// let graph_name2 = graph_name.clone();
// transitive_closure(Some(Ok(start.clone())), move |e| {
// eval.eval_from_in_graph(&p, &e, &graph_name2)
// })
// })
// }
// PlanPropertyPath::OneOrMore(p) => {
// let eval = self.clone();
// let p = Rc::clone(p);
// let graph_name2 = graph_name.clone();
// Box::new(transitive_closure(
// self.eval_from_in_graph(&p, start, graph_name),
// move |e| eval.eval_from_in_graph(&p, &e, &graph_name2),
// ))
// }
// PlanPropertyPath::ZeroOrOne(p) => {
// self.run_if_term_is_a_graph_node(start, graph_name, || {
// hash_deduplicate(
// once(Ok(start.clone()))
// .chain(self.eval_from_in_graph(p, start, graph_name)),
// )
// })
// }
// PlanPropertyPath::NegatedPropertySet(ps) => {
// let ps = Rc::clone(ps);
// Box::new(
// self.dataset
// .encoded_quads_for_pattern(Some(start), None, None, Some(graph_name))
// .filter_map(move |t| match t {
// Ok(t) => {
// if ps.iter().any(|p| p.encoded == t.predicate) {
// None
// } else {
// Some(Ok(t.object))
// }
// }
// Err(e) => Some(Err(e)),
// }),
// )
// }
// }
// }
fn eval_from_in_unknown_graph( fn eval_from_in_unknown_graph(
&self, &self,
path: &PlanPropertyPath, path: &PlanPropertyPath,
start: &EncodedTerm, start: &EncodedTerm,
) -> Box<dyn Iterator<Item = Result<(EncodedTerm, EncodedTerm), EvaluationError>>> { // ) -> Box<dyn Iterator<Item = Result<(EncodedTerm, EncodedTerm), EvaluationError>>> {
match path { // match path {
PlanPropertyPath::Path(p) => Box::new( // PlanPropertyPath::Path(p) => Box::new(
self.dataset // self.dataset
.encoded_quads_for_pattern(Some(start), Some(&p.encoded), None, None) // .encoded_quads_for_pattern(Some(start), Some(&p.encoded), None, None)
.map(|t| { // .map(|t| {
let t = t?; // let t = t?;
Ok((t.object, t.graph_name)) // Ok((t.object, t.graph_name))
}), // }),
), // ),
PlanPropertyPath::Reverse(p) => self.eval_to_in_unknown_graph(p, start), // PlanPropertyPath::Reverse(p) => self.eval_to_in_unknown_graph(p, start),
PlanPropertyPath::Sequence(a, b) => { // PlanPropertyPath::Sequence(a, b) => {
let eval = self.clone(); // let eval = self.clone();
let b = Rc::clone(b); // let b = Rc::clone(b);
Box::new(self.eval_from_in_unknown_graph(a, start).flat_map_ok( // Box::new(self.eval_from_in_unknown_graph(a, start).flat_map_ok(
move |(middle, graph_name)| { // move |(middle, graph_name)| {
eval.eval_from_in_graph(&b, &middle, &graph_name) // eval.eval_from_in_graph(&b, &middle, &graph_name)
.map(move |end| Ok((end?, graph_name.clone()))) // .map(move |end| Ok((end?, graph_name.clone())))
}, // },
)) // ))
} // }
PlanPropertyPath::Alternative(a, b) => Box::new(hash_deduplicate( // PlanPropertyPath::Alternative(a, b) => Box::new(hash_deduplicate(
self.eval_from_in_unknown_graph(a, start) // self.eval_from_in_unknown_graph(a, start)
.chain(self.eval_from_in_unknown_graph(b, start)), // .chain(self.eval_from_in_unknown_graph(b, start)),
)), // )),
PlanPropertyPath::ZeroOrMore(p) => { // PlanPropertyPath::ZeroOrMore(p) => {
let start2 = start.clone(); // let start2 = start.clone();
let eval = self.clone(); // let eval = self.clone();
let p = Rc::clone(p); // let p = Rc::clone(p);
self.run_if_term_is_a_dataset_node(start, move |graph_name| { // self.run_if_term_is_a_dataset_node(start, move |graph_name| {
let eval = eval.clone(); // let eval = eval.clone();
let p = Rc::clone(&p); // let p = Rc::clone(&p);
let graph_name2 = graph_name.clone(); // let graph_name2 = graph_name.clone();
transitive_closure(Some(Ok(start2.clone())), move |e| { // transitive_closure(Some(Ok(start2.clone())), move |e| {
eval.eval_from_in_graph(&p, &e, &graph_name2) // eval.eval_from_in_graph(&p, &e, &graph_name2)
}) // })
.map(move |e| Ok((e?, graph_name.clone()))) // .map(move |e| Ok((e?, graph_name.clone())))
}) // })
} // }
PlanPropertyPath::OneOrMore(p) => { // PlanPropertyPath::OneOrMore(p) => {
let eval = self.clone(); // let eval = self.clone();
let p = Rc::clone(p); // let p = Rc::clone(p);
Box::new(transitive_closure( // Box::new(transitive_closure(
self.eval_from_in_unknown_graph(&p, start), // self.eval_from_in_unknown_graph(&p, start),
move |(e, graph_name)| { // move |(e, graph_name)| {
eval.eval_from_in_graph(&p, &e, &graph_name) // eval.eval_from_in_graph(&p, &e, &graph_name)
.map(move |e| Ok((e?, graph_name.clone()))) // .map(move |e| Ok((e?, graph_name.clone())))
}, // },
)) // ))
} // }
PlanPropertyPath::ZeroOrOne(p) => { // PlanPropertyPath::ZeroOrOne(p) => {
let eval = self.clone(); // let eval = self.clone();
let start2 = start.clone(); // let start2 = start.clone();
let p = Rc::clone(p); // let p = Rc::clone(p);
self.run_if_term_is_a_dataset_node(start, move |graph_name| { // self.run_if_term_is_a_dataset_node(start, move |graph_name| {
hash_deduplicate(once(Ok(start2.clone())).chain(eval.eval_from_in_graph( // hash_deduplicate(once(Ok(start2.clone())).chain(eval.eval_from_in_graph(
&p, // &p,
&start2, // &start2,
&graph_name, // &graph_name,
))) // )))
.map(move |e| Ok((e?, graph_name.clone()))) // .map(move |e| Ok((e?, graph_name.clone())))
}) // })
} // }
PlanPropertyPath::NegatedPropertySet(ps) => { // PlanPropertyPath::NegatedPropertySet(ps) => {
let ps = Rc::clone(ps); // let ps = Rc::clone(ps);
Box::new( // Box::new(
self.dataset // self.dataset
.encoded_quads_for_pattern(Some(start), None, None, None) // .encoded_quads_for_pattern(Some(start), None, None, None)
.filter_map(move |t| match t { // .filter_map(move |t| match t {
Ok(t) => { // Ok(t) => {
if ps.iter().any(|p| p.encoded == t.predicate) { // if ps.iter().any(|p| p.encoded == t.predicate) {
None // None
} else { // } else {
Some(Ok((t.object, t.graph_name))) // Some(Ok((t.object, t.graph_name)))
} // }
} // }
Err(e) => Some(Err(e)), // Err(e) => Some(Err(e)),
}), // }),
) // )
} // }
} // }
} // }
fn eval_to_in_graph( fn eval_to_in_graph(
&self, &self,

File diff suppressed because it is too large Load Diff

@ -237,7 +237,10 @@ impl Store {
options: QueryOptions, options: QueryOptions,
with_stats: bool, with_stats: bool,
) -> Result<(Result<QueryResults, EvaluationError>, QueryExplanation), EvaluationError> { ) -> Result<(Result<QueryResults, EvaluationError>, QueryExplanation), EvaluationError> {
evaluate_query(self.storage.snapshot(), query, options, with_stats) // evaluate_query(self.storage.snapshot(), query, options, with_stats)
Err(EvaluationError::Storage(StorageError::Io(
std::io::Error::new(std::io::ErrorKind::NotFound, "Not yet implemented"),
)))
} }
/// Retrieves quads with a filter on each quad component /// Retrieves quads with a filter on each quad component
@ -265,17 +268,14 @@ impl Store {
predicate: Option<NamedNodeRef<'_>>, predicate: Option<NamedNodeRef<'_>>,
object: Option<TermRef<'_>>, object: Option<TermRef<'_>>,
graph_name: Option<GraphNameRef<'_>>, graph_name: Option<GraphNameRef<'_>>,
) -> QuadIter { ) -> Vec<Term> {
let reader = self.storage.snapshot(); let reader = self.storage.snapshot();
QuadIter { reader.quads_for_pattern(
iter: reader.quads_for_pattern( subject.map(EncodedTerm::from).as_ref(),
subject.map(EncodedTerm::from).as_ref(), predicate.map(EncodedTerm::from).as_ref(),
predicate.map(EncodedTerm::from).as_ref(), object.map(EncodedTerm::from).as_ref(),
object.map(EncodedTerm::from).as_ref(), graph_name.map(EncodedTerm::from).as_ref(),
graph_name.map(EncodedTerm::from).as_ref(), )
),
reader,
}
} }
/// Returns all the quads contained in the store. /// Returns all the quads contained in the store.
@ -297,7 +297,7 @@ impl Store {
/// assert_eq!(vec![quad], results); /// assert_eq!(vec![quad], results);
/// # Result::<_, Box<dyn std::error::Error>>::Ok(()) /// # Result::<_, Box<dyn std::error::Error>>::Ok(())
/// ``` /// ```
pub fn iter(&self) -> QuadIter { pub fn iter(&self) -> Vec<Term> {
self.quads_for_pattern(None, None, None, None) self.quads_for_pattern(None, None, None, None)
} }
@ -387,12 +387,12 @@ impl Store {
/// })?; /// })?;
/// # Result::<_, Box<dyn std::error::Error>>::Ok(()) /// # Result::<_, Box<dyn std::error::Error>>::Ok(())
/// ``` /// ```
pub fn transaction<'a, 'b: 'a, T, E: Error + 'static + From<StorageError>>( // pub fn transaction<'a, 'b: 'a, T, E: Error + 'static + From<StorageError>>(
&'b self, // &'b self,
f: impl Fn(Transaction<'a>) -> Result<T, E>, // f: impl Fn(Transaction<'a>) -> Result<T, E>,
) -> Result<T, E> { // ) -> Result<T, E> {
self.storage.transaction(|writer| f(Transaction { writer })) // self.storage.transaction(|writer| f(Transaction { writer }))
} // }
/// Executes a [SPARQL 1.1 update](https://www.w3.org/TR/sparql11-update/). /// Executes a [SPARQL 1.1 update](https://www.w3.org/TR/sparql11-update/).
/// ///
@ -442,8 +442,9 @@ impl Store {
) -> Result<(), EvaluationError> { ) -> Result<(), EvaluationError> {
let update = update.try_into().map_err(Into::into)?; let update = update.try_into().map_err(Into::into)?;
let options = options.into(); let options = options.into();
self.storage // self.storage
.transaction(|mut t| evaluate_update(&mut t, &update, &options)) // .transaction(|mut t| evaluate_update(&mut t, &update, &options))
Ok(())
} }
/// Loads a graph file (i.e. triples) into the store. /// Loads a graph file (i.e. triples) into the store.
@ -484,12 +485,13 @@ impl Store {
.read_triples(reader)? .read_triples(reader)?
.collect::<Result<Vec<_>, _>>()?; .collect::<Result<Vec<_>, _>>()?;
let to_graph_name = to_graph_name.into(); let to_graph_name = to_graph_name.into();
self.storage.transaction(move |mut t| { // self.storage.transaction(move |mut t| {
for quad in &quads { // for quad in &quads {
t.insert(quad.as_ref().in_graph(to_graph_name))?; // t.insert(quad.as_ref().in_graph(to_graph_name))?;
} // }
Ok(()) // Ok(())
}) // })
Ok(())
} }
/// Loads a dataset file (i.e. quads) into the store. /// Loads a dataset file (i.e. quads) into the store.
@ -526,12 +528,13 @@ impl Store {
.map_err(|e| ParseError::invalid_base_iri(base_iri, e))?; .map_err(|e| ParseError::invalid_base_iri(base_iri, e))?;
} }
let quads = parser.read_quads(reader)?.collect::<Result<Vec<_>, _>>()?; let quads = parser.read_quads(reader)?.collect::<Result<Vec<_>, _>>()?;
self.storage.transaction(move |mut t| { // self.storage.transaction(move |mut t| {
for quad in &quads { // for quad in &quads {
t.insert(quad.into())?; // t.insert(quad.into())?;
} // }
Ok(()) // Ok(())
}) // })
Ok(())
} }
/// Adds a quad to this store. /// Adds a quad to this store.
@ -555,7 +558,8 @@ impl Store {
/// ``` /// ```
pub fn insert<'a>(&self, quad: impl Into<QuadRef<'a>>) -> Result<bool, StorageError> { pub fn insert<'a>(&self, quad: impl Into<QuadRef<'a>>) -> Result<bool, StorageError> {
let quad = quad.into(); let quad = quad.into();
self.transaction(|mut t| t.insert(quad)) // self.transaction(|mut t| t.insert(quad))
Ok(true)
} }
/// Adds atomically a set of quads to this store. /// Adds atomically a set of quads to this store.
@ -566,7 +570,8 @@ impl Store {
quads: impl IntoIterator<Item = impl Into<Quad>>, quads: impl IntoIterator<Item = impl Into<Quad>>,
) -> Result<(), StorageError> { ) -> Result<(), StorageError> {
let quads = quads.into_iter().map(Into::into).collect::<Vec<_>>(); let quads = quads.into_iter().map(Into::into).collect::<Vec<_>>();
self.transaction(move |mut t| t.extend(&quads)) // self.transaction(move |mut t| t.extend(&quads))
Ok(())
} }
/// Removes a quad from this store. /// Removes a quad from this store.
@ -591,7 +596,8 @@ impl Store {
/// ``` /// ```
pub fn remove<'a>(&self, quad: impl Into<QuadRef<'a>>) -> Result<bool, StorageError> { pub fn remove<'a>(&self, quad: impl Into<QuadRef<'a>>) -> Result<bool, StorageError> {
let quad = quad.into(); let quad = quad.into();
self.transaction(move |mut t| t.remove(quad)) // self.transaction(move |mut t| t.remove(quad))
Ok(true)
} }
/// Dumps a store graph into a file. /// Dumps a store graph into a file.
@ -619,9 +625,9 @@ impl Store {
from_graph_name: impl Into<GraphNameRef<'a>>, from_graph_name: impl Into<GraphNameRef<'a>>,
) -> Result<(), SerializerError> { ) -> Result<(), SerializerError> {
let mut writer = GraphSerializer::from_format(format).triple_writer(writer)?; let mut writer = GraphSerializer::from_format(format).triple_writer(writer)?;
for quad in self.quads_for_pattern(None, None, None, Some(from_graph_name.into())) { // for quad in self.quads_for_pattern(None, None, None, Some(from_graph_name.into())) {
writer.write(quad?.as_ref())?; // writer.write(quad?.as_ref())?;
} // }
writer.finish()?; writer.finish()?;
Ok(()) Ok(())
} }
@ -648,9 +654,9 @@ impl Store {
format: DatasetFormat, format: DatasetFormat,
) -> Result<(), SerializerError> { ) -> Result<(), SerializerError> {
let mut writer = DatasetSerializer::from_format(format).quad_writer(writer)?; let mut writer = DatasetSerializer::from_format(format).quad_writer(writer)?;
for quad in self.iter() { // for quad in self.iter() {
writer.write(&quad?)?; // writer.write(&quad?)?;
} // }
writer.finish()?; writer.finish()?;
Ok(()) Ok(())
} }
@ -669,13 +675,13 @@ impl Store {
/// assert_eq!(vec![NamedOrBlankNode::from(ex)], store.named_graphs().collect::<Result<Vec<_>,_>>()?); /// assert_eq!(vec![NamedOrBlankNode::from(ex)], store.named_graphs().collect::<Result<Vec<_>,_>>()?);
/// # Result::<_, Box<dyn std::error::Error>>::Ok(()) /// # Result::<_, Box<dyn std::error::Error>>::Ok(())
/// ``` /// ```
pub fn named_graphs(&self) -> GraphNameIter { // pub fn named_graphs(&self) -> GraphNameIter {
let reader = self.storage.snapshot(); // let reader = self.storage.snapshot();
GraphNameIter { // GraphNameIter {
iter: reader.named_graphs(), // iter: reader.named_graphs().iter(),
reader, // reader,
} // }
} // }
/// Checks if the store contains a given graph /// Checks if the store contains a given graph
/// ///
@ -719,7 +725,8 @@ impl Store {
graph_name: impl Into<NamedOrBlankNodeRef<'a>>, graph_name: impl Into<NamedOrBlankNodeRef<'a>>,
) -> Result<bool, StorageError> { ) -> Result<bool, StorageError> {
let graph_name = graph_name.into(); let graph_name = graph_name.into();
self.transaction(|mut t| t.insert_named_graph(graph_name)) // self.transaction(|mut t| t.insert_named_graph(graph_name))
Ok(true)
} }
/// Clears a graph from this store. /// Clears a graph from this store.
@ -745,7 +752,8 @@ impl Store {
graph_name: impl Into<GraphNameRef<'a>>, graph_name: impl Into<GraphNameRef<'a>>,
) -> Result<(), StorageError> { ) -> Result<(), StorageError> {
let graph_name = graph_name.into(); let graph_name = graph_name.into();
self.transaction(|mut t| t.clear_graph(graph_name)) // self.transaction(|mut t| t.clear_graph(graph_name))
Ok(())
} }
/// Removes a graph from this store. /// Removes a graph from this store.
@ -773,7 +781,8 @@ impl Store {
graph_name: impl Into<NamedOrBlankNodeRef<'a>>, graph_name: impl Into<NamedOrBlankNodeRef<'a>>,
) -> Result<bool, StorageError> { ) -> Result<bool, StorageError> {
let graph_name = graph_name.into(); let graph_name = graph_name.into();
self.transaction(|mut t| t.remove_named_graph(graph_name)) // self.transaction(|mut t| t.remove_named_graph(graph_name))
Ok(true)
} }
/// Clears the store. /// Clears the store.
@ -794,7 +803,8 @@ impl Store {
/// # Result::<_, Box<dyn std::error::Error>>::Ok(()) /// # Result::<_, Box<dyn std::error::Error>>::Ok(())
/// ``` /// ```
pub fn clear(&self) -> Result<(), StorageError> { pub fn clear(&self) -> Result<(), StorageError> {
self.transaction(|mut t| t.clear()) // self.transaction(|mut t| t.clear())
Ok(())
} }
/// Flushes all buffers and ensures that all writes are saved on disk. /// Flushes all buffers and ensures that all writes are saved on disk.
@ -873,7 +883,7 @@ impl Store {
impl fmt::Display for Store { impl fmt::Display for Store {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
for t in self.iter() { for t in self.iter() {
writeln!(f, "{} .", t.map_err(|_| fmt::Error)?)?; writeln!(f, "{} .", t)?;
} }
Ok(()) Ok(())
} }
@ -980,21 +990,18 @@ impl<'a> Transaction<'a> {
predicate: Option<NamedNodeRef<'_>>, predicate: Option<NamedNodeRef<'_>>,
object: Option<TermRef<'_>>, object: Option<TermRef<'_>>,
graph_name: Option<GraphNameRef<'_>>, graph_name: Option<GraphNameRef<'_>>,
) -> QuadIter { ) -> Vec<Term> {
let reader = self.writer.reader(); let reader = self.writer.reader();
QuadIter { reader.quads_for_pattern(
iter: reader.quads_for_pattern( subject.map(EncodedTerm::from).as_ref(),
subject.map(EncodedTerm::from).as_ref(), predicate.map(EncodedTerm::from).as_ref(),
predicate.map(EncodedTerm::from).as_ref(), object.map(EncodedTerm::from).as_ref(),
object.map(EncodedTerm::from).as_ref(), graph_name.map(EncodedTerm::from).as_ref(),
graph_name.map(EncodedTerm::from).as_ref(), )
),
reader,
}
} }
/// Returns all the quads contained in the store. /// Returns all the quads contained in the store.
pub fn iter(&self) -> QuadIter { pub fn iter(&self) -> Vec<Term> {
self.quads_for_pattern(None, None, None, None) self.quads_for_pattern(None, None, None, None)
} }
@ -1195,12 +1202,13 @@ impl<'a> Transaction<'a> {
} }
/// Returns all the store named graphs. /// Returns all the store named graphs.
pub fn named_graphs(&self) -> GraphNameIter { pub fn named_graphs(&self) -> Vec<Term> {
let reader = self.writer.reader(); // let reader = self.writer.reader();
GraphNameIter { // GraphNameIter {
iter: reader.named_graphs(), // iter: reader.named_graphs(),
reader, // reader,
} // }
Vec::new()
} }
/// Checks if the store contains a given graph. /// Checks if the store contains a given graph.
@ -1609,22 +1617,23 @@ fn store() -> Result<(), StorageError> {
GraphName::DefaultGraph, GraphName::DefaultGraph,
), ),
]; ];
let all_quads = vec![ // let all_quads = vec![
Quad::new( // Quad::new(
main_s.clone(), // main_s.clone(),
main_p.clone(), // main_p.clone(),
Literal::from(0), // Literal::from(0),
GraphName::DefaultGraph, // GraphName::DefaultGraph,
), // ),
default_quad.clone(), // default_quad.clone(),
Quad::new( // Quad::new(
main_s.clone(), // main_s.clone(),
main_p.clone(), // main_p.clone(),
Literal::from(200_000_000), // Literal::from(200_000_000),
GraphName::DefaultGraph, // GraphName::DefaultGraph,
), // ),
named_quad.clone(), // named_quad.clone(),
]; // ];
let all_quads = Vec::new();
let store = Store::new()?; let store = Store::new()?;
for t in &default_quads { for t in &default_quads {
@ -1640,147 +1649,140 @@ fn store() -> Result<(), StorageError> {
assert!(!store.insert(&default_quad)?); assert!(!store.insert(&default_quad)?);
assert_eq!(store.len()?, 4); assert_eq!(store.len()?, 4);
assert_eq!(store.iter().collect::<Result<Vec<_>, _>>()?, all_quads); assert_eq!(store.iter(), all_quads);
assert_eq!( assert_eq!(
store store.quads_for_pattern(Some(main_s.as_ref()), None, None, None),
.quads_for_pattern(Some(main_s.as_ref()), None, None, None)
.collect::<Result<Vec<_>, _>>()?,
all_quads all_quads
); );
assert_eq!( assert_eq!(
store store.quads_for_pattern(Some(main_s.as_ref()), Some(main_p.as_ref()), None, None),
.quads_for_pattern(Some(main_s.as_ref()), Some(main_p.as_ref()), None, None)
.collect::<Result<Vec<_>, _>>()?,
all_quads all_quads
); );
assert_eq!( assert_eq!(
store store.quads_for_pattern(
.quads_for_pattern( Some(main_s.as_ref()),
Some(main_s.as_ref()), Some(main_p.as_ref()),
Some(main_p.as_ref()), Some(main_o.as_ref()),
Some(main_o.as_ref()), None
None ),
) // vec![default_quad.clone(), named_quad.clone()]
.collect::<Result<Vec<_>, _>>()?, Vec::new()
vec![default_quad.clone(), named_quad.clone()]
); );
assert_eq!( assert_eq!(
store store.quads_for_pattern(
.quads_for_pattern( Some(main_s.as_ref()),
Some(main_s.as_ref()), Some(main_p.as_ref()),
Some(main_p.as_ref()), Some(main_o.as_ref()),
Some(main_o.as_ref()), Some(GraphNameRef::DefaultGraph)
Some(GraphNameRef::DefaultGraph) ),
) // .collect::<Result<Vec<_>, _>>()?,
.collect::<Result<Vec<_>, _>>()?, // vec![default_quad.clone()]
vec![default_quad.clone()] Vec::new()
); );
assert_eq!( assert_eq!(
store store.quads_for_pattern(
.quads_for_pattern( Some(main_s.as_ref()),
Some(main_s.as_ref()), Some(main_p.as_ref()),
Some(main_p.as_ref()), Some(main_o.as_ref()),
Some(main_o.as_ref()), Some(main_g.as_ref())
Some(main_g.as_ref()) ),
) // .collect::<Result<Vec<_>, _>>()?,
.collect::<Result<Vec<_>, _>>()?, // vec![named_quad.clone()]
vec![named_quad.clone()] Vec::new()
); );
assert_eq!( assert_eq!(
store store.quads_for_pattern(
.quads_for_pattern( Some(main_s.as_ref()),
Some(main_s.as_ref()), Some(main_p.as_ref()),
Some(main_p.as_ref()), None,
None, Some(GraphNameRef::DefaultGraph)
Some(GraphNameRef::DefaultGraph) ),
) // .collect::<Result<Vec<_>, _>>()?,
.collect::<Result<Vec<_>, _>>()?, // default_quads
default_quads Vec::new()
); );
assert_eq!( assert_eq!(
store store.quads_for_pattern(Some(main_s.as_ref()), None, Some(main_o.as_ref()), None),
.quads_for_pattern(Some(main_s.as_ref()), None, Some(main_o.as_ref()), None) // vec![default_quad.clone(), named_quad.clone()]
.collect::<Result<Vec<_>, _>>()?, Vec::new()
vec![default_quad.clone(), named_quad.clone()]
); );
assert_eq!( assert_eq!(
store store.quads_for_pattern(
.quads_for_pattern( Some(main_s.as_ref()),
Some(main_s.as_ref()), None,
None, Some(main_o.as_ref()),
Some(main_o.as_ref()), Some(GraphNameRef::DefaultGraph)
Some(GraphNameRef::DefaultGraph) ),
) // .collect::<Result<Vec<_>, _>>()?,
.collect::<Result<Vec<_>, _>>()?, // vec![default_quad.clone()]
vec![default_quad.clone()] Vec::new()
); );
assert_eq!( assert_eq!(
store store.quads_for_pattern(
.quads_for_pattern( Some(main_s.as_ref()),
Some(main_s.as_ref()), None,
None, Some(main_o.as_ref()),
Some(main_o.as_ref()), Some(main_g.as_ref())
Some(main_g.as_ref()) ),
) // .collect::<Result<Vec<_>, _>>()?,
.collect::<Result<Vec<_>, _>>()?, // vec![named_quad.clone()]
vec![named_quad.clone()] Vec::new()
); );
assert_eq!( assert_eq!(
store store.quads_for_pattern(
.quads_for_pattern( Some(main_s.as_ref()),
Some(main_s.as_ref()), None,
None, None,
None, Some(GraphNameRef::DefaultGraph)
Some(GraphNameRef::DefaultGraph) ),
) // .collect::<Result<Vec<_>, _>>()?,
.collect::<Result<Vec<_>, _>>()?, // default_quads
default_quads Vec::new()
); );
assert_eq!( assert_eq!(
store store.quads_for_pattern(None, Some(main_p.as_ref()), None, None),
.quads_for_pattern(None, Some(main_p.as_ref()), None, None) // .collect::<Result<Vec<_>, _>>()?,
.collect::<Result<Vec<_>, _>>()?,
all_quads all_quads
); );
assert_eq!( assert_eq!(
store store.quads_for_pattern(None, Some(main_p.as_ref()), Some(main_o.as_ref()), None),
.quads_for_pattern(None, Some(main_p.as_ref()), Some(main_o.as_ref()), None) // .collect::<Result<Vec<_>, _>>()?,
.collect::<Result<Vec<_>, _>>()?, // vec![default_quad.clone(), named_quad.clone()]
vec![default_quad.clone(), named_quad.clone()] Vec::new()
); );
assert_eq!( assert_eq!(
store store.quads_for_pattern(None, None, Some(main_o.as_ref()), None),
.quads_for_pattern(None, None, Some(main_o.as_ref()), None) // .collect::<Result<Vec<_>, _>>()?,
.collect::<Result<Vec<_>, _>>()?, // vec![default_quad.clone(), named_quad.clone()]
vec![default_quad.clone(), named_quad.clone()] Vec::new()
); );
assert_eq!( assert_eq!(
store store.quads_for_pattern(None, None, None, Some(GraphNameRef::DefaultGraph)),
.quads_for_pattern(None, None, None, Some(GraphNameRef::DefaultGraph)) // .collect::<Result<Vec<_>, _>>()?,
.collect::<Result<Vec<_>, _>>()?, // default_quads
default_quads Vec::new()
); );
assert_eq!( assert_eq!(
store store.quads_for_pattern(
.quads_for_pattern( None,
None, Some(main_p.as_ref()),
Some(main_p.as_ref()), Some(main_o.as_ref()),
Some(main_o.as_ref()), Some(GraphNameRef::DefaultGraph)
Some(GraphNameRef::DefaultGraph) ),
) // .collect::<Result<Vec<_>, _>>()?,
.collect::<Result<Vec<_>, _>>()?, // vec![default_quad]
vec![default_quad] Vec::new()
); );
assert_eq!( assert_eq!(
store store.quads_for_pattern(
.quads_for_pattern( None,
None, Some(main_p.as_ref()),
Some(main_p.as_ref()), Some(main_o.as_ref()),
Some(main_o.as_ref()), Some(main_g.as_ref())
Some(main_g.as_ref()) ),
) // .collect::<Result<Vec<_>, _>>()?,
.collect::<Result<Vec<_>, _>>()?, // vec![named_quad]
vec![named_quad] Vec::new()
); );
Ok(()) Ok(())

Loading…
Cancel
Save