/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 2008.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.sail.rdbms.iteration;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import org.openrdf.model.Value;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.algebra.evaluation.QueryBindingSet;
import org.openrdf.sail.rdbms.RdbmsValueFactory;
import org.openrdf.sail.rdbms.algebra.ColumnVar;
import org.openrdf.sail.rdbms.exceptions.RdbmsQueryEvaluationException;
import org.openrdf.sail.rdbms.iteration.base.RdbmIterationBase;
import org.openrdf.sail.rdbms.model.RdbmsResource;
import org.openrdf.sail.rdbms.model.RdbmsValue;
import org.openrdf.sail.rdbms.schema.IdSequence;
import org.openrdf.sail.rdbms.schema.ValueTable;
/**
* Converts a {@link ResultSet} into a {@link BindingSet} in an iteration.
*
* @author James Leigh
*
*/
public class RdbmsBindingIteration extends RdbmIterationBase<BindingSet, QueryEvaluationException> {
private BindingSet bindings;
private Collection<ColumnVar> projections;
private RdbmsValueFactory vf;
private IdSequence ids;
public RdbmsBindingIteration(PreparedStatement stmt)
throws SQLException
{
super(stmt);
}
public void setBindings(BindingSet bindings) {
this.bindings = bindings;
}
public void setProjections(Collection<ColumnVar> proj) {
this.projections = proj;
}
public void setValueFactory(RdbmsValueFactory vf) {
this.vf = vf;
}
public void setIdSequence(IdSequence ids) {
this.ids = ids;
}
@Override
protected BindingSet convert(ResultSet rs)
throws SQLException
{
QueryBindingSet result = new QueryBindingSet(bindings);
for (ColumnVar var : projections) {
String name = var.getName();
if (var != null && !result.hasBinding(name)) {
Value value = var.getValue();
if (value == null) {
value = createValue(rs, var.getIndex() + 1);
}
if (value != null) {
result.addBinding(var.getName(), value);
}
}
}
return result;
}
@Override
protected QueryEvaluationException convertSQLException(SQLException e) {
return new RdbmsQueryEvaluationException(e);
}
private RdbmsResource createResource(ResultSet rs, int index)
throws SQLException
{
Number id = ids.idOf(rs.getLong(index));
if (id.longValue() == ValueTable.NIL_ID)
return null;
return vf.getRdbmsResource(id, rs.getString(index + 1));
}
private RdbmsValue createValue(ResultSet rs, int index)
throws SQLException
{
Number id = ids.idOf(rs.getLong(index));
if (ids.isLiteral(id)) {
String label = rs.getString(index + 1);
String language = rs.getString(index + 2);
String datatype = rs.getString(index + 3);
return vf.getRdbmsLiteral(id, label, language, datatype);
}
return createResource(rs, index);
}
}