package com.buschmais.xo.neo4j.remote.impl.datastore;
import java.util.LinkedHashMap;
import java.util.Map;
import org.neo4j.driver.v1.Record;
import org.neo4j.driver.v1.StatementResult;
import com.buschmais.xo.api.ResultIterator;
import com.buschmais.xo.neo4j.api.annotation.Cypher;
import com.buschmais.xo.neo4j.spi.helper.Converter;
import com.buschmais.xo.spi.datastore.DatastoreQuery;
public class RemoteDatastoreCypherQuery implements DatastoreQuery<Cypher> {
private final StatementExecutor statementExecutor;
private final Converter parameterConverter;
private final Converter valueConverter;
public RemoteDatastoreCypherQuery(StatementExecutor statementExecutor, Converter parameterConverter, Converter valueConverter) {
this.statementExecutor = statementExecutor;
this.parameterConverter = parameterConverter;
this.valueConverter = valueConverter;
}
@Override
public ResultIterator<Map<String, Object>> execute(Cypher query, Map<String, Object> parameters) {
return execute(query.value(), parameters);
}
@Override
public ResultIterator<Map<String, Object>> execute(String query, Map<String, Object> parameters) {
StatementResult result = statementExecutor.execute(query, parameterConverter.<Map<String, Object>> convert(parameters));
return new ResultIterator<Map<String, Object>>() {
@Override
public boolean hasNext() {
return result.hasNext();
}
@Override
public Map<String, Object> next() {
Record record = result.next();
Map<String, Object> row = record.asMap();
Map<String, Object> result = new LinkedHashMap<>(row.size(), 1);
for (Map.Entry<String, Object> entry : row.entrySet()) {
String column = entry.getKey();
Object value = entry.getValue();
result.put(column, valueConverter.convert(value));
}
return result;
}
@Override
public void close() {
result.consume();
}
};
}
}