package me.prettyprint.cassandra.model; import java.nio.ByteBuffer; import java.util.Map; import me.prettyprint.cassandra.connection.HConnectionManager; import me.prettyprint.cassandra.service.FailoverPolicy; import me.prettyprint.cassandra.service.KeyspaceService; import me.prettyprint.cassandra.service.Operation; import me.prettyprint.cassandra.service.OperationType; import me.prettyprint.cassandra.service.VirtualKeyspaceOperation; import me.prettyprint.cassandra.service.VirtualKeyspaceServiceImpl; import me.prettyprint.hector.api.ConsistencyLevelPolicy; import me.prettyprint.hector.api.HConsistencyLevel; import me.prettyprint.hector.api.Serializer; import me.prettyprint.hector.api.exceptions.HectorException; public class ExecutingVirtualKeyspace<E> extends ExecutingKeyspace { E keyPrefix; Serializer<E> keyPrefixSerializer; ByteBuffer prefixBytes; public ExecutingVirtualKeyspace(String keyspace, E keyPrefix, Serializer<E> keyPrefixSerializer, HConnectionManager connectionManager, ConsistencyLevelPolicy consistencyLevelPolicy, FailoverPolicy failoverPolicy) { super(keyspace, connectionManager, consistencyLevelPolicy, failoverPolicy); this.keyPrefix = keyPrefix; this.keyPrefixSerializer = keyPrefixSerializer; prefixBytes = keyPrefixSerializer.toByteBuffer(keyPrefix); } public ExecutingVirtualKeyspace(String keyspace, E keyPrefix, Serializer<E> keyPrefixSerializer, HConnectionManager connectionManager, ConsistencyLevelPolicy consistencyLevelPolicy, FailoverPolicy failoverPolicy, Map<String, String> credentials) { super(keyspace, connectionManager, consistencyLevelPolicy, failoverPolicy, credentials); this.keyPrefix = keyPrefix; this.keyPrefixSerializer = keyPrefixSerializer; prefixBytes = keyPrefixSerializer.toByteBuffer(keyPrefix); } @Override public <T> ExecutionResult<T> doExecute(KeyspaceOperationCallback<T> koc) throws HectorException { return doExecute(koc, null); } @Override public <T> ExecutionResult<T> doExecute(KeyspaceOperationCallback<T> koc, final HConsistencyLevel level) throws HectorException { KeyspaceService ks = null; try { final ConsistencyLevelPolicy policy; if(level != null) { policy = new ConsistencyLevelPolicy() { @Override public HConsistencyLevel get(OperationType op, String cfName) { return level; } @Override public HConsistencyLevel get(OperationType op) { return level; } }; } else { policy = consistencyLevelPolicy; } ks = new VirtualKeyspaceServiceImpl(keyspace, keyPrefix, keyPrefixSerializer, policy, connectionManager, failoverPolicy, credentials); return koc.doInKeyspaceAndMeasure(ks); } finally { if (ks != null) { // connectionManager.releaseClient(ks.getClient()); } } } @Override public <T> ExecutionResult<T> doExecuteOperation(Operation<T> operation) throws HectorException { operation.applyConnectionParams(keyspace, consistencyLevelPolicy, failoverPolicy, credentials); connectionManager.operateWithFailover(new VirtualKeyspaceOperation<T>( operation, prefixBytes)); return operation.getExecutionResult(); } }