package com.netflix.astyanax.cql.writes;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.datastax.driver.core.BoundStatement;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.Session;
public class BatchedStatements {
private static final Logger LOG = LoggerFactory.getLogger(BatchedStatements.class);
private List<String> batchQueries = new ArrayList<String>();
private List<Object> batchValues = new ArrayList<Object>();
public BatchedStatements() {
}
public List<String> getBatchQueries() {
return this.batchQueries;
}
public List<Object> getBatchValues() {
return this.batchValues;
}
public void addBatchQuery(String query) {
batchQueries.add(query);
}
public void addBatchValues(List<Object> values) {
batchValues.addAll(values);
}
public void addBatchValues(Object ... values) {
for (Object value : values) {
batchValues.add(value);
}
}
public void addBatch(String query, Object ... values) {
batchQueries.add(query);
for (Object value : values) {
batchValues.add(value);
}
}
public void addBatch(String query, List<Object> values) {
batchQueries.add(query);
batchValues.addAll(values);
}
public void addBatch(BatchedStatements otherBatch) {
batchQueries.addAll(otherBatch.getBatchQueries());
batchValues.addAll(otherBatch.getBatchValues());
}
public BoundStatement getBoundStatement(Session session, boolean atomicBatch) {
String query = getBatchQuery(atomicBatch);
PreparedStatement statement = session.prepare(query);
BoundStatement boundStatement = new BoundStatement(statement);
Object[] valueArr = batchValues.toArray();
boundStatement.bind(valueArr);
return boundStatement;
}
public String getBatchQuery(boolean atomicBatch) {
StringBuilder sb = new StringBuilder();
boolean isBatch = batchQueries.size() > 1;
if (isBatch) {
if (atomicBatch) {
sb.append("BEGIN BATCH ");
} else {
sb.append("BEGIN UNLOGGED BATCH ");
}
}
for (String query : batchQueries) {
sb.append(query);
}
if (isBatch) {
sb.append(" APPLY BATCH; ");
}
String query = sb.toString();
if (LOG.isDebugEnabled()) {
LOG.debug("Query : " + query);
LOG.debug("Bind values: " + batchValues);
}
return query;
}
}