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. 534
      lib/src/sparql/eval.rs
  5. 1964
      lib/src/storage/mod.rs
  6. 296
      lib/src/store.rs

165
Cargo.lock generated

@ -38,13 +38,19 @@ dependencies = [
"derive_arbitrary",
]
[[package]]
name = "arrayvec"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
[[package]]
name = "assert_cmd"
version = "2.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9834fcc22e0874394a010230586367d4a3e9f11b560f469262678547e1d2575e"
dependencies = [
"bstr",
"bstr 1.6.0",
"doc-comment",
"predicates",
"predicates-core",
@ -133,6 +139,29 @@ dependencies = [
"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]]
name = "bstr"
version = "1.6.0"
@ -140,7 +169,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05"
dependencies = [
"memchr",
"regex-automata",
"regex-automata 0.3.6",
"serde",
]
@ -150,6 +179,32 @@ version = "3.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
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]]
name = "cast"
version = "0.3.0"
@ -171,7 +226,7 @@ version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
dependencies = [
"nom",
"nom 7.1.3",
]
[[package]]
@ -562,6 +617,22 @@ dependencies = [
"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]]
name = "glob"
version = "0.3.1"
@ -575,7 +646,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d"
dependencies = [
"aho-corasick",
"bstr",
"bstr 1.6.0",
"fnv",
"log",
"regex",
@ -598,6 +669,23 @@ version = "1.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
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]]
name = "hashbrown"
version = "0.12.3"
@ -774,6 +862,19 @@ version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
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]]
name = "libc"
version = "0.2.147"
@ -827,6 +928,16 @@ version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
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]]
name = "memoffset"
version = "0.9.0"
@ -851,6 +962,17 @@ dependencies = [
"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]]
name = "nom"
version = "7.1.3"
@ -931,6 +1053,8 @@ dependencies = [
"criterion",
"digest",
"getrandom",
"gfa",
"handlegraph",
"hex",
"js-sys",
"json-event-parser",
@ -1372,10 +1496,16 @@ checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-automata 0.3.6",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
[[package]]
name = "regex-automata"
version = "0.3.6"
@ -1667,12 +1797,28 @@ version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
[[package]]
name = "static_assertions"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
name = "strsim"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
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]]
name = "syn"
version = "1.0.109"
@ -2090,6 +2236,15 @@ version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
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]]
name = "zstd"
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" }
spargebra = { version = "0.2.8", path="spargebra", features = ["rdf-star", "sep-0002", "sep-0006"] }
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]
libc = "0.2"

@ -37,10 +37,11 @@ impl DatasetView {
predicate: Option<&EncodedTerm>,
object: 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
.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)]
@ -50,102 +51,104 @@ impl DatasetView {
predicate: Option<&EncodedTerm>,
object: Option<&EncodedTerm>,
graph_name: Option<&EncodedTerm>,
) -> Box<dyn Iterator<Item = Result<EncodedQuad, EvaluationError>>> {
if let Some(graph_name) = graph_name {
if graph_name.is_default_graph() {
if let Some(default_graph_graphs) = &self.dataset.default {
if default_graph_graphs.len() == 1 {
// Single graph optimization
Box::new(
self.store_encoded_quads_for_pattern(
subject,
predicate,
object,
Some(&default_graph_graphs[0]),
)
.map(|quad| {
let quad = quad?;
Ok(EncodedQuad::new(
quad.subject,
quad.predicate,
quad.object,
EncodedTerm::DefaultGraph,
))
}),
)
} else {
let iters = default_graph_graphs
.iter()
.map(|graph_name| {
self.store_encoded_quads_for_pattern(
subject,
predicate,
object,
Some(graph_name),
)
})
.collect::<Vec<_>>();
Box::new(iters.into_iter().flatten().map(|quad| {
let quad = quad?;
Ok(EncodedQuad::new(
quad.subject,
quad.predicate,
quad.object,
EncodedTerm::DefaultGraph,
))
}))
}
} else {
Box::new(
self.store_encoded_quads_for_pattern(subject, predicate, object, None)
.map(|quad| {
let quad = quad?;
Ok(EncodedQuad::new(
quad.subject,
quad.predicate,
quad.object,
EncodedTerm::DefaultGraph,
))
}),
)
}
} else if self
.dataset
.named
.as_ref()
.map_or(true, |d| d.contains(graph_name))
{
Box::new(self.store_encoded_quads_for_pattern(
subject,
predicate,
object,
Some(graph_name),
))
} else {
Box::new(empty())
}
} else if let Some(named_graphs) = &self.dataset.named {
let iters = named_graphs
.iter()
.map(|graph_name| {
self.store_encoded_quads_for_pattern(
subject,
predicate,
object,
Some(graph_name),
)
})
.collect::<Vec<_>>();
Box::new(iters.into_iter().flatten())
} else {
Box::new(
self.store_encoded_quads_for_pattern(subject, predicate, object, None)
.filter(|quad| match quad {
Err(_) => true,
Ok(quad) => !quad.graph_name.is_default_graph(),
}),
)
}
// ) -> Box<dyn Iterator<Item = Result<EncodedQuad, EvaluationError>>> {
) -> Vec<crate::model::Term> {
return Vec::new();
// if let Some(graph_name) = graph_name {
// if graph_name.is_default_graph() {
// if let Some(default_graph_graphs) = &self.dataset.default {
// if default_graph_graphs.len() == 1 {
// // Single graph optimization
// Box::new(
// self.store_encoded_quads_for_pattern(
// subject,
// predicate,
// object,
// Some(&default_graph_graphs[0]),
// )
// .map(|quad| {
// let quad = quad?;
// Ok(EncodedQuad::new(
// quad.subject,
// quad.predicate,
// quad.object,
// EncodedTerm::DefaultGraph,
// ))
// }),
// )
// } else {
// let iters = default_graph_graphs
// .iter()
// .map(|graph_name| {
// self.store_encoded_quads_for_pattern(
// subject,
// predicate,
// object,
// Some(graph_name),
// )
// })
// .collect::<Vec<_>>();
// Box::new(iters.into_iter().flatten().map(|quad| {
// let quad = quad?;
// Ok(EncodedQuad::new(
// quad.subject,
// quad.predicate,
// quad.object,
// EncodedTerm::DefaultGraph,
// ))
// }))
// }
// } else {
// Box::new(
// self.store_encoded_quads_for_pattern(subject, predicate, object, None)
// .map(|quad| {
// let quad = quad?;
// Ok(EncodedQuad::new(
// quad.subject,
// quad.predicate,
// quad.object,
// EncodedTerm::DefaultGraph,
// ))
// }),
// )
// }
// } else if self
// .dataset
// .named
// .as_ref()
// .map_or(true, |d| d.contains(graph_name))
// {
// Box::new(self.store_encoded_quads_for_pattern(
// subject,
// predicate,
// object,
// Some(graph_name),
// ))
// } else {
// Box::new(empty())
// }
// } else if let Some(named_graphs) = &self.dataset.named {
// let iters = named_graphs
// .iter()
// .map(|graph_name| {
// self.store_encoded_quads_for_pattern(
// subject,
// predicate,
// object,
// Some(graph_name),
// )
// })
// .collect::<Vec<_>>();
// Box::new(iters.into_iter().flatten())
// } else {
// Box::new(
// self.store_encoded_quads_for_pattern(subject, predicate, object, None)
// .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 {

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

File diff suppressed because it is too large Load Diff

@ -237,7 +237,10 @@ impl Store {
options: QueryOptions,
with_stats: bool,
) -> 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
@ -265,17 +268,14 @@ impl Store {
predicate: Option<NamedNodeRef<'_>>,
object: Option<TermRef<'_>>,
graph_name: Option<GraphNameRef<'_>>,
) -> QuadIter {
) -> Vec<Term> {
let reader = self.storage.snapshot();
QuadIter {
iter: reader.quads_for_pattern(
reader.quads_for_pattern(
subject.map(EncodedTerm::from).as_ref(),
predicate.map(EncodedTerm::from).as_ref(),
object.map(EncodedTerm::from).as_ref(),
graph_name.map(EncodedTerm::from).as_ref(),
),
reader,
}
)
}
/// Returns all the quads contained in the store.
@ -297,7 +297,7 @@ impl Store {
/// assert_eq!(vec![quad], results);
/// # 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)
}
@ -387,12 +387,12 @@ impl Store {
/// })?;
/// # Result::<_, Box<dyn std::error::Error>>::Ok(())
/// ```
pub fn transaction<'a, 'b: 'a, T, E: Error + 'static + From<StorageError>>(
&'b self,
f: impl Fn(Transaction<'a>) -> Result<T, E>,
) -> Result<T, E> {
self.storage.transaction(|writer| f(Transaction { writer }))
}
// pub fn transaction<'a, 'b: 'a, T, E: Error + 'static + From<StorageError>>(
// &'b self,
// f: impl Fn(Transaction<'a>) -> Result<T, E>,
// ) -> Result<T, E> {
// self.storage.transaction(|writer| f(Transaction { writer }))
// }
/// Executes a [SPARQL 1.1 update](https://www.w3.org/TR/sparql11-update/).
///
@ -442,8 +442,9 @@ impl Store {
) -> Result<(), EvaluationError> {
let update = update.try_into().map_err(Into::into)?;
let options = options.into();
self.storage
.transaction(|mut t| evaluate_update(&mut t, &update, &options))
// self.storage
// .transaction(|mut t| evaluate_update(&mut t, &update, &options))
Ok(())
}
/// Loads a graph file (i.e. triples) into the store.
@ -484,12 +485,13 @@ impl Store {
.read_triples(reader)?
.collect::<Result<Vec<_>, _>>()?;
let to_graph_name = to_graph_name.into();
self.storage.transaction(move |mut t| {
for quad in &quads {
t.insert(quad.as_ref().in_graph(to_graph_name))?;
}
// self.storage.transaction(move |mut t| {
// for quad in &quads {
// t.insert(quad.as_ref().in_graph(to_graph_name))?;
// }
// Ok(())
// })
Ok(())
})
}
/// 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))?;
}
let quads = parser.read_quads(reader)?.collect::<Result<Vec<_>, _>>()?;
self.storage.transaction(move |mut t| {
for quad in &quads {
t.insert(quad.into())?;
}
// self.storage.transaction(move |mut t| {
// for quad in &quads {
// t.insert(quad.into())?;
// }
// Ok(())
// })
Ok(())
})
}
/// 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> {
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.
@ -566,7 +570,8 @@ impl Store {
quads: impl IntoIterator<Item = impl Into<Quad>>,
) -> Result<(), StorageError> {
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.
@ -591,7 +596,8 @@ impl Store {
/// ```
pub fn remove<'a>(&self, quad: impl Into<QuadRef<'a>>) -> Result<bool, StorageError> {
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.
@ -619,9 +625,9 @@ impl Store {
from_graph_name: impl Into<GraphNameRef<'a>>,
) -> Result<(), SerializerError> {
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())) {
writer.write(quad?.as_ref())?;
}
// for quad in self.quads_for_pattern(None, None, None, Some(from_graph_name.into())) {
// writer.write(quad?.as_ref())?;
// }
writer.finish()?;
Ok(())
}
@ -648,9 +654,9 @@ impl Store {
format: DatasetFormat,
) -> Result<(), SerializerError> {
let mut writer = DatasetSerializer::from_format(format).quad_writer(writer)?;
for quad in self.iter() {
writer.write(&quad?)?;
}
// for quad in self.iter() {
// writer.write(&quad?)?;
// }
writer.finish()?;
Ok(())
}
@ -669,13 +675,13 @@ impl Store {
/// assert_eq!(vec![NamedOrBlankNode::from(ex)], store.named_graphs().collect::<Result<Vec<_>,_>>()?);
/// # Result::<_, Box<dyn std::error::Error>>::Ok(())
/// ```
pub fn named_graphs(&self) -> GraphNameIter {
let reader = self.storage.snapshot();
GraphNameIter {
iter: reader.named_graphs(),
reader,
}
}
// pub fn named_graphs(&self) -> GraphNameIter {
// let reader = self.storage.snapshot();
// GraphNameIter {
// iter: reader.named_graphs().iter(),
// reader,
// }
// }
/// Checks if the store contains a given graph
///
@ -719,7 +725,8 @@ impl Store {
graph_name: impl Into<NamedOrBlankNodeRef<'a>>,
) -> Result<bool, StorageError> {
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.
@ -745,7 +752,8 @@ impl Store {
graph_name: impl Into<GraphNameRef<'a>>,
) -> Result<(), StorageError> {
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.
@ -773,7 +781,8 @@ impl Store {
graph_name: impl Into<NamedOrBlankNodeRef<'a>>,
) -> Result<bool, StorageError> {
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.
@ -794,7 +803,8 @@ impl Store {
/// # Result::<_, Box<dyn std::error::Error>>::Ok(())
/// ```
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.
@ -873,7 +883,7 @@ impl Store {
impl fmt::Display for Store {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
for t in self.iter() {
writeln!(f, "{} .", t.map_err(|_| fmt::Error)?)?;
writeln!(f, "{} .", t)?;
}
Ok(())
}
@ -980,21 +990,18 @@ impl<'a> Transaction<'a> {
predicate: Option<NamedNodeRef<'_>>,
object: Option<TermRef<'_>>,
graph_name: Option<GraphNameRef<'_>>,
) -> QuadIter {
) -> Vec<Term> {
let reader = self.writer.reader();
QuadIter {
iter: reader.quads_for_pattern(
reader.quads_for_pattern(
subject.map(EncodedTerm::from).as_ref(),
predicate.map(EncodedTerm::from).as_ref(),
object.map(EncodedTerm::from).as_ref(),
graph_name.map(EncodedTerm::from).as_ref(),
),
reader,
}
)
}
/// 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)
}
@ -1195,12 +1202,13 @@ impl<'a> Transaction<'a> {
}
/// Returns all the store named graphs.
pub fn named_graphs(&self) -> GraphNameIter {
let reader = self.writer.reader();
GraphNameIter {
iter: reader.named_graphs(),
reader,
}
pub fn named_graphs(&self) -> Vec<Term> {
// let reader = self.writer.reader();
// GraphNameIter {
// iter: reader.named_graphs(),
// reader,
// }
Vec::new()
}
/// Checks if the store contains a given graph.
@ -1609,22 +1617,23 @@ fn store() -> Result<(), StorageError> {
GraphName::DefaultGraph,
),
];
let all_quads = vec![
Quad::new(
main_s.clone(),
main_p.clone(),
Literal::from(0),
GraphName::DefaultGraph,
),
default_quad.clone(),
Quad::new(
main_s.clone(),
main_p.clone(),
Literal::from(200_000_000),
GraphName::DefaultGraph,
),
named_quad.clone(),
];
// let all_quads = vec![
// Quad::new(
// main_s.clone(),
// main_p.clone(),
// Literal::from(0),
// GraphName::DefaultGraph,
// ),
// default_quad.clone(),
// Quad::new(
// main_s.clone(),
// main_p.clone(),
// Literal::from(200_000_000),
// GraphName::DefaultGraph,
// ),
// named_quad.clone(),
// ];
let all_quads = Vec::new();
let store = Store::new()?;
for t in &default_quads {
@ -1640,147 +1649,140 @@ fn store() -> Result<(), StorageError> {
assert!(!store.insert(&default_quad)?);
assert_eq!(store.len()?, 4);
assert_eq!(store.iter().collect::<Result<Vec<_>, _>>()?, all_quads);
assert_eq!(store.iter(), all_quads);
assert_eq!(
store
.quads_for_pattern(Some(main_s.as_ref()), None, None, None)
.collect::<Result<Vec<_>, _>>()?,
store.quads_for_pattern(Some(main_s.as_ref()), None, None, None),
all_quads
);
assert_eq!(
store
.quads_for_pattern(Some(main_s.as_ref()), Some(main_p.as_ref()), None, None)
.collect::<Result<Vec<_>, _>>()?,
store.quads_for_pattern(Some(main_s.as_ref()), Some(main_p.as_ref()), None, None),
all_quads
);
assert_eq!(
store
.quads_for_pattern(
store.quads_for_pattern(
Some(main_s.as_ref()),
Some(main_p.as_ref()),
Some(main_o.as_ref()),
None
)
.collect::<Result<Vec<_>, _>>()?,
vec![default_quad.clone(), named_quad.clone()]
),
// vec![default_quad.clone(), named_quad.clone()]
Vec::new()
);
assert_eq!(
store
.quads_for_pattern(
store.quads_for_pattern(
Some(main_s.as_ref()),
Some(main_p.as_ref()),
Some(main_o.as_ref()),
Some(GraphNameRef::DefaultGraph)
)
.collect::<Result<Vec<_>, _>>()?,
vec![default_quad.clone()]
),
// .collect::<Result<Vec<_>, _>>()?,
// vec![default_quad.clone()]
Vec::new()
);
assert_eq!(
store
.quads_for_pattern(
store.quads_for_pattern(
Some(main_s.as_ref()),
Some(main_p.as_ref()),
Some(main_o.as_ref()),
Some(main_g.as_ref())
)
.collect::<Result<Vec<_>, _>>()?,
vec![named_quad.clone()]
),
// .collect::<Result<Vec<_>, _>>()?,
// vec![named_quad.clone()]
Vec::new()
);
assert_eq!(
store
.quads_for_pattern(
store.quads_for_pattern(
Some(main_s.as_ref()),
Some(main_p.as_ref()),
None,
Some(GraphNameRef::DefaultGraph)
)
.collect::<Result<Vec<_>, _>>()?,
default_quads
),
// .collect::<Result<Vec<_>, _>>()?,
// default_quads
Vec::new()
);
assert_eq!(
store
.quads_for_pattern(Some(main_s.as_ref()), None, Some(main_o.as_ref()), None)
.collect::<Result<Vec<_>, _>>()?,
vec![default_quad.clone(), named_quad.clone()]
store.quads_for_pattern(Some(main_s.as_ref()), None, Some(main_o.as_ref()), None),
// vec![default_quad.clone(), named_quad.clone()]
Vec::new()
);
assert_eq!(
store
.quads_for_pattern(
store.quads_for_pattern(
Some(main_s.as_ref()),
None,
Some(main_o.as_ref()),
Some(GraphNameRef::DefaultGraph)
)
.collect::<Result<Vec<_>, _>>()?,
vec![default_quad.clone()]
),
// .collect::<Result<Vec<_>, _>>()?,
// vec![default_quad.clone()]
Vec::new()
);
assert_eq!(
store
.quads_for_pattern(
store.quads_for_pattern(
Some(main_s.as_ref()),
None,
Some(main_o.as_ref()),
Some(main_g.as_ref())
)
.collect::<Result<Vec<_>, _>>()?,
vec![named_quad.clone()]
),
// .collect::<Result<Vec<_>, _>>()?,
// vec![named_quad.clone()]
Vec::new()
);
assert_eq!(
store
.quads_for_pattern(
store.quads_for_pattern(
Some(main_s.as_ref()),
None,
None,
Some(GraphNameRef::DefaultGraph)
)
.collect::<Result<Vec<_>, _>>()?,
default_quads
),
// .collect::<Result<Vec<_>, _>>()?,
// default_quads
Vec::new()
);
assert_eq!(
store
.quads_for_pattern(None, Some(main_p.as_ref()), None, None)
.collect::<Result<Vec<_>, _>>()?,
store.quads_for_pattern(None, Some(main_p.as_ref()), None, None),
// .collect::<Result<Vec<_>, _>>()?,
all_quads
);
assert_eq!(
store
.quads_for_pattern(None, Some(main_p.as_ref()), Some(main_o.as_ref()), None)
.collect::<Result<Vec<_>, _>>()?,
vec![default_quad.clone(), named_quad.clone()]
store.quads_for_pattern(None, Some(main_p.as_ref()), Some(main_o.as_ref()), None),
// .collect::<Result<Vec<_>, _>>()?,
// vec![default_quad.clone(), named_quad.clone()]
Vec::new()
);
assert_eq!(
store
.quads_for_pattern(None, None, Some(main_o.as_ref()), None)
.collect::<Result<Vec<_>, _>>()?,
vec![default_quad.clone(), named_quad.clone()]
store.quads_for_pattern(None, None, Some(main_o.as_ref()), None),
// .collect::<Result<Vec<_>, _>>()?,
// vec![default_quad.clone(), named_quad.clone()]
Vec::new()
);
assert_eq!(
store
.quads_for_pattern(None, None, None, Some(GraphNameRef::DefaultGraph))
.collect::<Result<Vec<_>, _>>()?,
default_quads
store.quads_for_pattern(None, None, None, Some(GraphNameRef::DefaultGraph)),
// .collect::<Result<Vec<_>, _>>()?,
// default_quads
Vec::new()
);
assert_eq!(
store
.quads_for_pattern(
store.quads_for_pattern(
None,
Some(main_p.as_ref()),
Some(main_o.as_ref()),
Some(GraphNameRef::DefaultGraph)
)
.collect::<Result<Vec<_>, _>>()?,
vec![default_quad]
),
// .collect::<Result<Vec<_>, _>>()?,
// vec![default_quad]
Vec::new()
);
assert_eq!(
store
.quads_for_pattern(
store.quads_for_pattern(
None,
Some(main_p.as_ref()),
Some(main_o.as_ref()),
Some(main_g.as_ref())
)
.collect::<Result<Vec<_>, _>>()?,
vec![named_quad]
),
// .collect::<Result<Vec<_>, _>>()?,
// vec![named_quad]
Vec::new()
);
Ok(())

Loading…
Cancel
Save