package org.aksw.jena_sparql_api.core; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.aksw.commons.collections.PrefetchIterator; import org.apache.jena.graph.Node; import org.apache.jena.graph.Triple; import org.apache.jena.query.ResultSet; import org.apache.jena.sparql.engine.binding.Binding; import org.apache.jena.sparql.syntax.Template; /** * @author Claus Stadler * <p/> * Date: 11/5/11 * Time: 2:16 PM */ public class ConstructIterator extends PrefetchIterator<Triple> { private Template template; private ResultSet rs; public ConstructIterator(Template template, ResultSet rs) { this.template = template; this.rs = rs; } /** * Returns an iterator over the triples generated by instancing the * template with each of the result set rows. * * Duplicates are not removed; this can be achieved by * wrapping this iterator with a UniqueIterator. * * TODO We could do some optimization by factoring out constant triples from the * template. * * @return * @throws Exception */ @Override protected Iterator<Triple> prefetch() throws Exception { // Build each template substitution as triples. while(rs.hasNext()) { Set<Triple> set = new HashSet<Triple>(); Map<Node, Node> bNodeMap = new HashMap<Node, Node>(); Binding binding = rs.nextBinding(); template.subst(set, bNodeMap, binding); return set.iterator(); } return null; } @Override public void close() { super.close(); //rs.close(); } }