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