use rudf::model::*; use rudf::{GraphSyntax, Repository, RepositoryConnection, MemoryRepository, Result}; use rudf::sparql::{BindingsIterator, PreparedQuery, QueryOptions, QueryResult}; use failure::format_err; use std::io::BufRead; #[test] fn simple_custom_function_test() { let query = r#" PREFIX ex: SELECT ?name ?reverse WHERE { ?s ?name . BIND(ex:REVERSE(?name) as ?reverse) } ORDER BY ?name "#.to_string(); let options = QueryOptions::default(); let triples = br#" "Bob" . "Alice" . . . "#.as_ref(); let results = do_query(triples, query, options).unwrap(); let collected = results.into_values_iter().map(move |b| b.unwrap()).collect::>(); let solution = vec![ vec![ Some(literal(String::from("Alice"))), Some(literal(String::from("ecilA"))) ], vec![ Some(literal(String::from("Bob"))), Some(literal(String::from("boB"))) ], ]; assert_eq!(collected, solution); } fn literal(str: String) -> Term { Term::Literal(Literal::new_simple_literal(str)) } fn make_repository(reader: impl BufRead) -> Result { let repository = MemoryRepository::default(); let mut connection = repository.connection()?; connection.load_graph(reader, GraphSyntax::NTriples, None, None).unwrap(); Ok(repository) } fn query_repository<'a>(repository: MemoryRepository, query: String, options: QueryOptions<'a>) -> Result> { let connection = repository.connection()?; let prepared_query = connection.prepare_query(&query, options)?; let result = prepared_query.exec()?; match result { QueryResult::Bindings(iterator) => { let (varaibles, iter) = iterator.destruct(); let collected = iter.collect::>(); Ok(BindingsIterator::new(varaibles, Box::new(collected.into_iter()))) }, _ => Err(format_err!("Excpected bindings but got another QueryResult")) } } fn do_query<'a>(reader: impl BufRead, query: String, options: QueryOptions<'a>) -> Result> { let repository = make_repository(reader)?; query_repository(repository, query, options) }