package eu.play_project.dcep.distributedetalis.join; import java.util.ArrayList; import java.util.List; import org.ontoware.aifbcommons.collection.ClosableIterator; import org.ontoware.rdf2go.model.QueryResultTable; import org.ontoware.rdf2go.model.QueryRow; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; /** * This is a data structure that is used to represent a query result. * * @author Ningyuan Pan * */ public class ResultRegistry implements SelectResults { // number of row in result private int size; // variables in select (column names) private List<String> variables; // result data private List<List> result = new ArrayList<List>(); public ResultRegistry(){ } @Override public int getSize(){ return size; } /* (non-Javadoc) * @see eu.play_project.dcep.distributedetalis.join.SelectResults#getVariables() */ @Override public List<String> getVariables(){ return this.variables; } @Override public void setVariables(List<String> variables){ this.variables = variables; } /* (non-Javadoc) * @see eu.play_project.dcep.distributedetalis.join.SelectResults#getResult() */ @Override public List<List> getResult(){ return result; } @Override public void setResult(List<List> result){ this.result = result; this.size = result.size(); } /** * Create a {@link ResultRegistry} from a Jena {@link ResultSet}. */ public static ResultRegistry makeResult(ResultSet rs){ final Logger logger = LoggerFactory.getLogger(ResultRegistry.class); ResultRegistry result = new ResultRegistry(); if(rs == null){ result.variables = new ArrayList<String>(0); result.size = 0; return result; } result.variables = rs.getResultVars(); //TODO size = 0?? // result has duplicated entries ??? //size = rw.getRowNumber(); //logger.info("size: "+size); int colNum = result.variables.size(); result.size = 0; QuerySolution qs; while(rs.hasNext()){ qs = rs.next(); List<String> data = new ArrayList<String>(colNum); for(int i = 0; i < colNum; i++){ data.add(qs.get(result.variables.get(i)).toString()); } result.getResult().add(data); result.size++; } logger.debug("Found {} results for historical query.", result.size); return result; } /** * Create a {@link ResultRegistry} from a RDF2Go {@link QueryResultTable}. */ public static ResultRegistry makeResult(QueryResultTable queryResult){ final Logger logger = LoggerFactory.getLogger(ResultRegistry.class); ResultRegistry result = new ResultRegistry(); result.variables = queryResult.getVariables(); int colNum = result.variables.size(); result.size = 0; ClosableIterator<QueryRow> it = queryResult.iterator(); while(it.hasNext()){ QueryRow qr = it.next(); List<String> data = new ArrayList<String>(colNum); for (String var : result.variables) { data.add(qr.getValue(var).toString()); } result.getResult().add(data); result.size++; } logger.debug("Found {} results for historical query.", result.size); return result; } }