diff --git a/lib/src/sparql/mod.rs b/lib/src/sparql/mod.rs index 75b5474a..4ff9587d 100644 --- a/lib/src/sparql/mod.rs +++ b/lib/src/sparql/mod.rs @@ -2,10 +2,12 @@ //! This is a work in progress!!! use model::Dataset; +use sparql::algebra::Query; use sparql::algebra::QueryResult; use sparql::eval::SimpleEvaluator; use sparql::parser::read_sparql_query; use std::io::Read; +use std::sync::Arc; use store::encoded::EncodedQuadsStore; use store::encoded::StoreDataset; use Result; @@ -17,12 +19,32 @@ mod plan; pub mod xml_results; pub trait SparqlDataset: Dataset { - fn query(&self, query: impl Read) -> Result; + type PreparedQuery: PreparedQuery; + fn prepare_query(&self, query: impl Read) -> Result; +} + +pub trait PreparedQuery { + fn exec(&self) -> Result; } impl SparqlDataset for StoreDataset { - fn query(&self, query: impl Read) -> Result { - let query = read_sparql_query(query, None)?; - SimpleEvaluator::new(self.encoded()).evaluate(&query) + type PreparedQuery = SimplePreparedQuery; + + fn prepare_query(&self, query: impl Read) -> Result> { + Ok(SimplePreparedQuery { + query: read_sparql_query(query, None)?, + store: self.encoded(), + }) + } +} + +pub struct SimplePreparedQuery { + query: Query, + store: Arc, +} + +impl PreparedQuery for SimplePreparedQuery { + fn exec(&self) -> Result { + SimpleEvaluator::new(self.store.clone()).evaluate(&self.query) } } diff --git a/lib/tests/sparql_test_cases.rs b/lib/tests/sparql_test_cases.rs index 460efb92..347c49ef 100644 --- a/lib/tests/sparql_test_cases.rs +++ b/lib/tests/sparql_test_cases.rs @@ -16,6 +16,7 @@ use rudf::sparql::algebra::Query; use rudf::sparql::algebra::QueryResult; use rudf::sparql::parser::read_sparql_query; use rudf::sparql::xml_results::read_xml_results; +use rudf::sparql::PreparedQuery; use rudf::sparql::SparqlDataset; use rudf::store::isomorphism::GraphIsomorphism; use rudf::store::MemoryDataset; @@ -210,7 +211,10 @@ fn sparql_w3c_query_evaluation_testsuite() { .unwrap() .for_each(|triple| named_graph.insert(&triple.unwrap()).unwrap()); } - match data.query(client.get(&test.query).unwrap()) { + match data + .prepare_query(client.get(&test.query).unwrap()) + .and_then(|p| p.exec()) + { Err(error) => assert!( false, "Failure to parse query of {} with error: {}",