package com.mysema.rdfbean.sesame;
import java.util.HashMap;
import java.util.Map;
import org.openrdf.model.Value;
import org.openrdf.query.BindingSet;
import org.openrdf.result.TupleResult;
import org.openrdf.store.StoreException;
import com.mysema.commons.lang.CloseableIterator;
import com.mysema.rdfbean.model.NODE;
import com.mysema.rdfbean.model.RepositoryException;
/**
* @author tiwe
*
*/
public class TupleResultIterator implements CloseableIterator<Map<String, NODE>> {
private final TupleResult tupleResult;
private final Map<String, NODE> bindings;
private final SesameDialect dialect;
public TupleResultIterator(TupleResult tupleResult, Map<String, NODE> bindings, SesameDialect dialect) {
this.tupleResult = tupleResult;
this.bindings = bindings;
this.dialect = dialect;
}
@Override
public void close() {
try {
tupleResult.close();
} catch (StoreException e1) {
throw new RepositoryException(e1);
}
}
@Override
public boolean hasNext() {
try {
return tupleResult.hasNext();
} catch (StoreException e) {
throw new RepositoryException(e);
}
}
@Override
public Map<String, NODE> next() {
try {
BindingSet bindingSet = tupleResult.next();
Map<String, NODE> row = new HashMap<String, NODE>();
for (String name : tupleResult.getBindingNames()) {
Value value = bindingSet.getValue(name);
if (value != null) {
row.put(name, dialect.getNODE(value));
} else if (bindings.containsKey(name)) {
row.put(name, bindings.get(name));
}
}
return row;
} catch (StoreException e) {
throw new RepositoryException(e);
}
}
@Override
public void remove() {
}
}