package com.netflix.astyanax.cql.direct;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import com.datastax.driver.core.BoundStatement;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.ResultSetFuture;
import com.datastax.driver.core.Session;
import com.google.common.util.concurrent.ListenableFuture;
import com.netflix.astyanax.Serializer;
import com.netflix.astyanax.connectionpool.OperationResult;
import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
import com.netflix.astyanax.cql.CqlOperationResultImpl;
import com.netflix.astyanax.cql.CqlPreparedStatement;
import com.netflix.astyanax.cql.CqlStatementResult;
import com.netflix.astyanax.cql.util.AsyncOperationResult;
/**
* Impl of {@link CqlPreparedStatement} using java driver.
* it manages a {@link Session} object that is used when actually performing the real query with the
* driver underneath.
*
* @author poberai
*/
public class DirectCqlPreparedStatement implements CqlPreparedStatement {
private final Session session;
private final PreparedStatement pStmt;
private final List<Object> bindValues = new ArrayList<Object>();
public DirectCqlPreparedStatement(Session session, PreparedStatement pStmt) {
this.session = session;
this.pStmt = pStmt;
}
@Override
public OperationResult<CqlStatementResult> execute() throws ConnectionException {
BoundStatement bStmt = pStmt.bind(bindValues.toArray());
ResultSet resultSet = session.execute(bStmt);
CqlStatementResult result = new DirectCqlStatementResultImpl(resultSet);
return new CqlOperationResultImpl<CqlStatementResult>(resultSet, result);
}
@Override
public ListenableFuture<OperationResult<CqlStatementResult>> executeAsync() throws ConnectionException {
BoundStatement bStmt = pStmt.bind(bindValues.toArray());
ResultSetFuture rsFuture = session.executeAsync(bStmt);
return new AsyncOperationResult<CqlStatementResult>(rsFuture) {
@Override
public OperationResult<CqlStatementResult> getOperationResult(ResultSet rs) {
CqlStatementResult result = new DirectCqlStatementResultImpl(rs);
return new CqlOperationResultImpl<CqlStatementResult>(rs, result); }
};
}
@Override
public <V> CqlPreparedStatement withByteBufferValue(V value, Serializer<V> serializer) {
bindValues.add(value);
return this;
}
@Override
public CqlPreparedStatement withValue(ByteBuffer value) {
bindValues.add(value);
return this;
}
@Override
public CqlPreparedStatement withValues(List<ByteBuffer> values) {
bindValues.addAll(values);
return this;
}
@Override
public CqlPreparedStatement withStringValue(String value) {
bindValues.add(value);
return this;
}
@Override
public CqlPreparedStatement withIntegerValue(Integer value) {
bindValues.add(value);
return this;
}
@Override
public CqlPreparedStatement withBooleanValue(Boolean value) {
bindValues.add(value);
return this;
}
@Override
public CqlPreparedStatement withDoubleValue(Double value) {
bindValues.add(value);
return this;
}
@Override
public CqlPreparedStatement withLongValue(Long value) {
bindValues.add(value);
return this;
}
@Override
public CqlPreparedStatement withFloatValue(Float value) {
bindValues.add(value);
return this;
}
@Override
public CqlPreparedStatement withShortValue(Short value) {
bindValues.add(value);
return this;
}
@Override
public CqlPreparedStatement withUUIDValue(UUID value) {
bindValues.add(value);
return this;
}
public PreparedStatement getInnerPreparedStatement() {
return pStmt;
}
}