package org.opennms.newts.cassandra.search.support;
import static com.datastax.driver.core.querybuilder.QueryBuilder.unloggedBatch;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.opennms.newts.cassandra.ContextConfigurations;
import com.datastax.driver.core.RegularStatement;
import com.datastax.driver.core.Statement;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
public class StatementUtils {
public static List<Statement> getStatements(ContextConfigurations contextConfigurations, int maxBatchSize,
Set<StatementGenerator> generators) {
List<Statement> statementsToExecute = Lists.newArrayList();
Map<String, List<Statement>> statementsByKey = Maps.newHashMap();
for (StatementGenerator generator : generators) {
Statement statement = generator.toStatement()
.setConsistencyLevel(contextConfigurations.getWriteConsistency(generator.getContext()));
String key = generator.getKey();
if (key == null) {
// Don't try batching these
statementsToExecute.add(statement);
continue;
}
// Group these by key
List<Statement> statementsForKey = statementsByKey.get(key);
if (statementsForKey == null) {
statementsForKey = Lists.newArrayList();
statementsByKey.put(key, statementsForKey);
}
statementsForKey.add(statement);
}
// Consolidate the grouped statements into batches
for (List<Statement> statementsForKey: statementsByKey.values()) {
for (List<Statement> partition : Lists.partition(statementsForKey, maxBatchSize)) {
statementsToExecute.add(unloggedBatch(partition.toArray(new RegularStatement[partition.size()])));
}
}
return statementsToExecute;
}
}