package org.neo4j.jdbc.embedded;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.neo4j.cypher.javacompat.ExecutionEngine;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.helpers.collection.IteratorWrapper;
import org.neo4j.jdbc.ExecutionResult;
import org.neo4j.jdbc.QueryExecutor;
import org.neo4j.jdbc.Version;
import org.neo4j.kernel.GraphDatabaseAPI;
/**
* @author mh
* @since 15.06.12
*/
public class EmbeddedQueryExecutor implements QueryExecutor {
private final ExecutionEngine executionEngine;
private final GraphDatabaseService gds;
public EmbeddedQueryExecutor(GraphDatabaseService gds) {
this.gds = gds;
executionEngine = new ExecutionEngine(gds);
}
@Override
public ExecutionResult executeQuery(final String query, Map<String, Object> parameters) throws Exception {
final Map<String, Object> params = parameters == null ? Collections.<String, Object>emptyMap() : parameters;
final org.neo4j.cypher.javacompat.ExecutionResult result = executionEngine.execute(query, params);
final List<String> columns = result.columns();
final int cols = columns.size();
final Object[] resultRow = new Object[cols];
return new ExecutionResult(columns,new IteratorWrapper<Object[],Map<String,Object>>(result.iterator()) {
@Override
public boolean hasNext() {
try {
return super.hasNext();
} catch(Exception e) {
return handleException(e, query);
}
}
protected Object[] underlyingObjectToObject(Map<String, Object> row) {
for (int i = 0; i < cols; i++) {
resultRow[i]=row.get(columns.get(i));
}
return resultRow;
}
});
}
private boolean handleException(Exception cause, String query) {
final SQLException sqlException = new SQLException("Error executing query: " + query, cause);
throw new RuntimeException(sqlException);
}
@Override
public void stop() throws Exception {
// don't own the db, will be stopped when driver's stopped
}
@Override
public Version getVersion() {
return new Version(((GraphDatabaseAPI)gds).getKernelData().version().getVersion());
}
}