package org.aksw.jena_sparql_api.batch.reader; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import org.aksw.jena_sparql_api.batch.step.F_TripleToQuad; import org.aksw.jena_sparql_api.core.QueryExecutionFactory; import org.aksw.jena_sparql_api.pagination.core.PagingQuery; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.batch.item.data.AbstractPaginatedDataItemReader; import org.springframework.beans.factory.InitializingBean; import com.google.common.collect.Iterators; import org.apache.jena.graph.Triple; import org.apache.jena.query.Query; import org.apache.jena.query.QueryExecution; import org.apache.jena.sparql.core.Quad; /** * Item reader that reads a SPARQL SELECT query using pagination * * @author raven * * @param <T> */ public class ItemReaderQuad extends AbstractPaginatedDataItemReader<Quad> implements InitializingBean { private static final Logger logger = LoggerFactory.getLogger(ItemReaderQuad.class); private Query query; private QueryExecutionFactory qef; // TODO Validation is not part of the reader but of the processor! //private Predicate<Quad> predicate; public static int nextId = 0; private int id; public ItemReaderQuad() { super(); setName(this.getClass().getName()); this.id = ++nextId; } public Query getQuery() { return query; } public void setQuery(Query query) { this.query = query; } public QueryExecutionFactory getQef() { return qef; } public void setQef(QueryExecutionFactory qef) { this.qef = qef; } @Override public void afterPropertiesSet() throws Exception { // TODO Assert that properties are valid //System.out.println("TODO validate settings"); } public ItemReaderQuad(QueryExecutionFactory qef, Query query) { //, Predicate<Quad> predicate) { setName(this.getClass().getName()); this.qef = qef; this.query = query; //this.predicate = predicate; } @Override protected Iterator<Quad> doPageRead() { //long limit = (long)this.pageSize; long offset = this.page * this.pageSize; logger.info("[START] ItemReader " + id + " on page " + this.page); PagingQuery pagingQuery = new PagingQuery(this.pageSize, this.query); Iterator<Query> itQuery = pagingQuery.createQueryIterator(offset, null); Query query = itQuery.next(); // logger.info("[START] ItemReader " + id + " on page " + this.page); // // long offset = this.getCurrentItemCount(); // Long limit = maxItemCount != null ? (long)maxItemCount - this.getCurrentItemCount() : null; // // PagingQuery pagingQuery = new PagingQuery(this.pageSize, this.query); // Iterator<Query> itQuery = pagingQuery.createQueryIterator(offset, limit); // Query query = itQuery.next(); Iterator<Quad> result; if(query == null) { Collection<Quad> tmp = Collections.emptyList(); return tmp.iterator(); } else { QueryExecution qe = qef.createQueryExecution(query); Iterator<Triple> triplesIt = qe.execConstructTriples(); result = Iterators.transform(triplesIt, F_TripleToQuad.fn); // if(predicate != null) { // result = Iterators.filter(result, predicate); // } } logger.info("[DONE] ItemReader " + id + " on page " + this.page); return result; } }