/*
* Copyright (c) 2010 Mysema Ltd.
* All rights reserved.
*
*/
package com.mysema.rdfbean.virtuoso;
import java.io.Writer;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mysema.commons.lang.CloseableIterator;
import com.mysema.commons.lang.IteratorAdapter;
import com.mysema.rdfbean.model.Format;
import com.mysema.rdfbean.model.NODE;
import com.mysema.rdfbean.model.RepositoryException;
import com.mysema.rdfbean.model.STMT;
import com.mysema.rdfbean.model.STMTComparator;
import com.mysema.rdfbean.model.io.RDFWriter;
import com.mysema.rdfbean.model.io.WriterUtils;
/**
* @author tiwe
*
*/
public class GraphQueryImpl extends AbstractQueryImpl {
private static final Logger logger = LoggerFactory.getLogger(GraphQueryImpl.class);
private final Converter converter;
public GraphQueryImpl(Connection connection, Converter converter, int prefetch, String query) {
super(connection, prefetch, query);
this.converter = converter;
}
@Override
public boolean getBoolean() {
throw new UnsupportedOperationException();
}
@Override
public ResultType getResultType() {
return ResultType.TRIPLES;
}
@Override
public CloseableIterator<STMT> getTriples() {
try {
rs = executeQuery(query, false);
List<STMT> stmts = IteratorAdapter.asList(new GraphResultIterator(stmt, rs, query, converter));
Collections.sort(stmts, STMTComparator.DEFAULT);
return new IteratorAdapter<STMT>(stmts.iterator());
} catch (SQLException e) {
logger.error(query);
close();
throw new RepositoryException(e);
}
}
@Override
public CloseableIterator<Map<String, NODE>> getTuples() {
throw new UnsupportedOperationException();
}
@Override
public List<String> getVariables() {
throw new UnsupportedOperationException();
}
@Override
public void streamTriples(Writer writer, String contentType) {
Format format = Format.getFormat(contentType, Format.RDFXML);
RDFWriter rdfWriter = WriterUtils.createWriter(format, writer);
CloseableIterator<STMT> stmts = getTriples();
try {
rdfWriter.begin();
while (stmts.hasNext()) {
rdfWriter.handle(stmts.next());
}
rdfWriter.end();
} finally {
stmts.close();
}
}
}