/*
* (c) Copyright 2006 Hewlett-Packard Development Company, LP
* All rights reserved.
* [See end of file]
*/
package com.hp.hpl.squirrelrdf.rdb;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.NoSuchElementException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.hp.hpl.jena.graph.Node;
import com.hp.hpl.jena.graph.impl.LiteralLabel;
import com.hp.hpl.jena.query.engine1.ExecutionContext;
/**
* ResultSetIterator
*
* Iterate over a ResultSet, mapping to rdf nodes as it goes.
*
* @author Damian Steer <pldms@mac.com>
*/
public class ResultSetIterator implements Iterator<Map<String, Node>>
{
final static Log log = LogFactory.getLog(ResultSetIterator.class);
private ResultSet resultset;
private ProcessedPattern pattern;
private boolean hasMoreResults;
private ExecutionContext context;
/**
* Create a new result set wrapper
* @param context
*
* @throws SQLException
*
*/
public ResultSetIterator(ResultSet resultset, ProcessedPattern pattern, ExecutionContext context)
throws SQLException
{
this.resultset = resultset;
this.pattern = pattern;
this.hasMoreResults = resultset.next();
this.context = context;
}
public void remove()
{
throw new UnsupportedOperationException("Remove is not supported");
}
public boolean hasNext()
{
return hasMoreResults;
}
public Map<String, Node> next()
{
if (!hasMoreResults)
throw new NoSuchElementException("No more results");
try
{
return getNextBinding();
}
catch (SQLException e)
{
log.error("Error getting next result", e);
throw new RuntimeException(e);
}
}
/**
* Get next binding, mapping results to rdf nodes
*
* @throws SQLException
*/
private Map<String, Node> getNextBinding() throws SQLException
{
Map<String, Node> binding = new HashMap<String, Node>();
for (String var : pattern.getVariables())
{
Object val = resultset.getObject(var);
if (val == null)
continue;
// xsd:strings are just annoying...
Node nodeVal;
if (val instanceof String)
nodeVal = Node.createLiteral((String) val);
else
{
LiteralLabel ll = new LiteralLabel(val);
nodeVal = Node.createLiteral(ll);
}
binding.put(var, nodeVal);
}
for (Node subject: pattern.getSubjects()) // bind subjects
{
if (subject.isConcrete()) continue; // nothing to do...
Table table = pattern.getTableForSubject(subject);
if (!table.hasPrimaryKeys()) // No row -> bnode mapping possible
{
binding.put(subject.getName(), Node.createAnon());
}
else
{
Map<String, Object> attvals = new HashMap<String, Object>();
for (Col col: table.getPrimaryCols())
{
Object value = resultset.getObject(subject.getName() + "$" + col.getName() + "$prim");
attvals.put(col.getName(), value);
}
Node node = table.keysToNode(attvals);
binding.put(subject.getName(), node);
}
}
hasMoreResults = resultset.next();
if (!hasMoreResults) resultset.close();
return binding;
}
}
/*
* (c) Copyright 2006 Hewlett-Packard Development Company, LP All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer. 2. Redistributions in
* binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution. 3. The name of the author may not
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/