diff --git a/lib/src/sparql/eval.rs b/lib/src/sparql/eval.rs index 3e411d72..6777f57e 100644 --- a/lib/src/sparql/eval.rs +++ b/lib/src/sparql/eval.rs @@ -479,13 +479,13 @@ impl<'a, S: StoreConnection + 'a> SimpleEvaluator { } } - fn evaluate_service( - &self, + fn evaluate_service<'b>( + &'b self, service_name: &PatternValue, graph_pattern: &GraphPattern, - variables: &[Variable], + variables: &'b [Variable], from: EncodedTuple, - ) -> Result { + ) -> Result> { let service_name = self.dataset .decode_named_node(get_pattern_value(service_name, &[]).ok_or_else(|| { @@ -497,13 +497,14 @@ impl<'a, S: StoreConnection + 'a> SimpleEvaluator { service_name ) })?; - let encoded = self.encode_bindings(variables, service(graph_pattern.clone())?); - let collected = encoded.collect::>(); - Ok(Box::new(JoinIterator { - left: vec![from], - right_iter: Box::new(collected.into_iter()), - buffered_results: vec![], - })) + Ok(Box::new( + self.encode_bindings(variables, service(graph_pattern.clone())?) + .flat_map(move |binding| { + binding + .map(|binding| combine_tuples(&binding, &from)) + .transpose() + }), + )) } fn accumulator_for_aggregate<'b>( @@ -1633,7 +1634,6 @@ impl<'a, S: StoreConnection + 'a> SimpleEvaluator { where 'a: 'b, { - let mut encoder = self.dataset.encoder(); let (binding_variables, iter) = BindingsIterator::destruct(iter); let mut combined_variables = variables.to_vec(); for v in binding_variables.clone() { @@ -1642,6 +1642,7 @@ impl<'a, S: StoreConnection + 'a> SimpleEvaluator { } } Box::new(iter.map(move |terms| { + let mut encoder = self.dataset.encoder(); let mut encoded_terms = vec![None; combined_variables.len()]; for (i, term_option) in terms?.into_iter().enumerate() { match term_option {