package me.prettyprint.cassandra.service.spring;
import java.nio.ByteBuffer;
import java.util.List;
import me.prettyprint.cassandra.model.ConfigurableConsistencyLevel;
import me.prettyprint.cassandra.model.HColumnImpl;
import me.prettyprint.cassandra.model.IndexedSlicesQuery;
import me.prettyprint.cassandra.model.MutatorImpl;
import me.prettyprint.cassandra.model.thrift.ThriftColumnQuery;
import me.prettyprint.cassandra.serializers.ByteBufferSerializer;
import me.prettyprint.cassandra.serializers.TypeInferringSerializer;
import me.prettyprint.cassandra.service.CassandraHostConfigurator;
import me.prettyprint.hector.api.Cluster;
import me.prettyprint.hector.api.ConsistencyLevelPolicy;
import me.prettyprint.hector.api.Keyspace;
import me.prettyprint.hector.api.Serializer;
import me.prettyprint.hector.api.beans.HColumn;
import me.prettyprint.hector.api.beans.HCounterColumn;
import me.prettyprint.hector.api.beans.HCounterSuperColumn;
import me.prettyprint.hector.api.beans.HSuperColumn;
import me.prettyprint.hector.api.factory.HFactory;
import me.prettyprint.hector.api.mutation.Mutator;
import me.prettyprint.hector.api.query.ColumnQuery;
import me.prettyprint.hector.api.query.CountQuery;
import me.prettyprint.hector.api.query.CounterQuery;
import me.prettyprint.hector.api.query.MultigetSliceQuery;
import me.prettyprint.hector.api.query.MultigetSubSliceQuery;
import me.prettyprint.hector.api.query.MultigetSuperSliceQuery;
import me.prettyprint.hector.api.query.RangeSlicesQuery;
import me.prettyprint.hector.api.query.RangeSubSlicesQuery;
import me.prettyprint.hector.api.query.RangeSuperSlicesQuery;
import me.prettyprint.hector.api.query.SliceCounterQuery;
import me.prettyprint.hector.api.query.SliceQuery;
import me.prettyprint.hector.api.query.SubCountQuery;
import me.prettyprint.hector.api.query.SubSliceQuery;
import me.prettyprint.hector.api.query.SuperColumnQuery;
import me.prettyprint.hector.api.query.SuperCountQuery;
import me.prettyprint.hector.api.query.SuperSliceQuery;
import org.apache.cassandra.thrift.ColumnPath;
import org.apache.commons.lang.Validate;
/**
* Implementation of the HectorTemplate
*
* @author Bozhidar Bozhanov
*
*/
public class HectorTemplateImpl implements HectorTemplate {
private String keyspaceName;
private Cluster cluster;
private Keyspace keyspace;
private ConfigurableConsistencyLevel configurableConsistencyLevelPolicy;
private String replicationStrategyClass;
private int replicationFactor;
public HectorTemplateImpl() {
}
public HectorTemplateImpl(Cluster cluster, String keyspace, int replicationFactor, String replicationStrategyClass, ConfigurableConsistencyLevel configurableConsistencyLevelPolicy) {
this.cluster = cluster;
this.keyspaceName = keyspace;
this.replicationFactor = replicationFactor;
this.replicationStrategyClass = replicationStrategyClass;
this.configurableConsistencyLevelPolicy = configurableConsistencyLevelPolicy;
initKeyspaceOperator();
}
public void init() {
initKeyspaceOperator();
}
private void initKeyspaceOperator() {
ConsistencyLevelPolicy clPolicy;
if (configurableConsistencyLevelPolicy == null) {
clPolicy = HFactory.createDefaultConsistencyLevelPolicy();
} else {
clPolicy = configurableConsistencyLevelPolicy;
}
keyspace = HFactory.createKeyspace(keyspaceName, cluster, clPolicy);
}
@Override
public <K, N, V> Mutator<K> createMutator(Serializer<K> keySerializer) {
return HFactory.createMutator(keyspace, keySerializer);
}
@Override
public <K, N, V> ColumnQuery<K, N, V> createColumnQuery() {
return new ThriftColumnQuery<K, N, V>(keyspace);
}
@Override
public <K, N, V> ColumnQuery<K, N, V> createColumnQuery(Serializer<V> valueSerializer) {
return new ThriftColumnQuery<K, N, V>(keyspace, valueSerializer);
}
@Override
public <K, N> CountQuery<K, N> createCountQuery(Serializer<K> keySerializer,
Serializer<N> nameSerializer) {
return HFactory.createCountQuery(keyspace, keySerializer, nameSerializer);
}
@Override
public <K, SN> SuperCountQuery<K, SN> createSuperCountQuery(Serializer<K> keySerializer,
Serializer<SN> superNameSerializer) {
return HFactory.createSuperCountQuery(keyspace, keySerializer, superNameSerializer);
}
@Override
public <K, SN, N> SubCountQuery<K, SN, N> createSubCountQuery(Serializer<K> keySerializer,
Serializer<SN> superNameSerializer, Serializer<N> nameSerializer) {
return HFactory.createSubCountQuery(keyspace, keySerializer, superNameSerializer,
nameSerializer);
}
@Override
public <K, SN, N, V> SuperColumnQuery<K, SN, N, V> createSuperColumnQuery(
Serializer<K> keySerializer, Serializer<SN> sNameSerializer, Serializer<N> nameSerializer,
Serializer<V> valueSerializer) {
return HFactory.createSuperColumnQuery(keyspace, keySerializer, sNameSerializer,
nameSerializer, valueSerializer);
}
@Override
public <K, N, V> MultigetSliceQuery<K, N, V> createMultigetSliceQuery(
Serializer<K> keySerializer, Serializer<N> nameSerializer, Serializer<V> valueSerializer) {
return HFactory.createMultigetSliceQuery(keyspace, keySerializer, nameSerializer,
valueSerializer);
}
@Override
public <K, SN, N, V> MultigetSuperSliceQuery<K, SN, N, V> createMultigetSuperSliceQuery(
Serializer<K> keySerializer, Serializer<SN> sNameSerializer, Serializer<N> nameSerializer,
Serializer<V> valueSerializer) {
return HFactory.createMultigetSuperSliceQuery(keyspace, keySerializer, sNameSerializer,
nameSerializer, valueSerializer);
}
@Override
public <K, SN, N, V> MultigetSubSliceQuery<K, SN, N, V> createMultigetSubSliceQuery(
Serializer<K> keySerializer, Serializer<SN> sNameSerializer, Serializer<N> nameSerializer,
Serializer<V> valueSerializer) {
return HFactory.createMultigetSubSliceQuery(keyspace, keySerializer, sNameSerializer,
nameSerializer, valueSerializer);
}
@Override
public <K, N, V> RangeSlicesQuery<K, N, V> createRangeSlicesQuery(Serializer<K> keySerializer,
Serializer<N> nameSerializer, Serializer<V> valueSerializer) {
return HFactory.createRangeSlicesQuery(keyspace, keySerializer, nameSerializer,
valueSerializer);
}
@Override
public <K, SN, N, V> RangeSuperSlicesQuery<K, SN, N, V> createRangeSuperSlicesQuery(
Serializer<K> keySerializer, Serializer<SN> sNameSerializer, Serializer<N> nameSerializer,
Serializer<V> valueSerializer) {
return HFactory.createRangeSuperSlicesQuery(keyspace, keySerializer, sNameSerializer,
nameSerializer, valueSerializer);
}
@Override
public <K, SN, N, V> RangeSubSlicesQuery<K, SN, N, V> createRangeSubSlicesQuery(
Serializer<K> keySerializer, Serializer<SN> sNameSerializer, Serializer<N> nameSerializer,
Serializer<V> valueSerializer) {
return HFactory.createRangeSubSlicesQuery(keyspace, keySerializer, sNameSerializer,
nameSerializer, valueSerializer);
}
@Override
public <K, N, V> SliceQuery<K, N, V> createSliceQuery(Serializer<K> keySerializer,
Serializer<N> nameSerializer, Serializer<V> valueSerializer) {
return HFactory.createSliceQuery(keyspace, keySerializer, nameSerializer,
valueSerializer);
}
@Override
public <K, SN, N, V> SubSliceQuery<K, SN, N, V> createSubSliceQuery(Serializer<K> keySerializer,
Serializer<SN> sNameSerializer, Serializer<N> nameSerializer, Serializer<V> valueSerializer) {
return HFactory.createSubSliceQuery(keyspace, keySerializer, sNameSerializer,
nameSerializer, valueSerializer);
}
@Override
public <K, SN, N, V> SuperSliceQuery<K, SN, N, V> createSuperSliceQuery(
Serializer<K> keySerializer, Serializer<SN> sNameSerializer, Serializer<N> nameSerializer,
Serializer<V> valueSerializer) {
return HFactory.createSuperSliceQuery(keyspace, keySerializer, sNameSerializer,
nameSerializer, valueSerializer);
}
@Override
public <SN, N, V> HSuperColumn<SN, N, V> createSuperColumn(SN name, List<HColumn<N, V>> columns,
Serializer<SN> superNameSerializer, Serializer<N> nameSerializer,
Serializer<V> valueSerializer) {
return HFactory.createSuperColumn(name, columns, createClock(), superNameSerializer,
nameSerializer, valueSerializer);
}
@Override
public <SN, N, V> HSuperColumn<SN, N, V> createSuperColumn(SN name, List<HColumn<N, V>> columns,
long clock, Serializer<SN> superNameSerializer, Serializer<N> nameSerializer,
Serializer<V> valueSerializer) {
return HFactory.createSuperColumn(name, columns, clock, superNameSerializer, nameSerializer,
valueSerializer);
}
@Override
public <N, V> HColumn<N, V> createColumn(N name, V value, long clock,
Serializer<N> nameSerializer, Serializer<V> valueSerializer) {
return HFactory.createColumn(name, value, clock, nameSerializer, valueSerializer);
}
@Override
public <N, V> HColumn<N, V> createColumn(N name, V value) {
return new HColumnImpl<N, V>(name, value, createClock());
}
@Override
public <N, V> HColumn<N, V> createColumn(N name, V value, long clock) {
return new HColumnImpl<N, V>(name, value, clock);
}
@Override
public long createClock() {
return HFactory.createClock();
}
// probably should be typed for thrift vs. avro
<N> ColumnPath createColumnPath(String columnFamilyName, N columnName,
Serializer<N> nameSerializer) {
return createColumnPath(columnFamilyName, nameSerializer.toByteBuffer(columnName));
}
private <N> ColumnPath createColumnPath(String columnFamilyName, ByteBuffer columnName) {
Validate.notNull(columnFamilyName, "columnFamilyName cannot be null");
ColumnPath columnPath = new ColumnPath(columnFamilyName);
if (columnName != null) {
columnPath.setColumn(columnName);
}
return columnPath;
}
<N> ColumnPath createColumnPath(String columnFamilyName) {
return createColumnPath(columnFamilyName, null);
}
<SN, N> ColumnPath createSuperColumnPath(String columnFamilyName, SN superColumnName,
N columnName, Serializer<SN> superNameSerializer, Serializer<N> nameSerializer) {
noNullElements(columnFamilyName, superColumnName, superNameSerializer, nameSerializer);
ColumnPath columnPath = createColumnPath(columnFamilyName, nameSerializer.toByteBuffer(columnName));
columnPath.setSuper_column(superNameSerializer.toByteBuffer(superColumnName));
return columnPath;
}
<SN> ColumnPath createSuperColumnPath(String columnFamilyName, SN superColumnName,
Serializer<SN> superNameSerializer) {
noNullElements(columnFamilyName, superNameSerializer);
ColumnPath columnPath = createColumnPath(columnFamilyName, null);
if (superColumnName != null) {
columnPath.setSuper_column(superNameSerializer.toByteBuffer(superColumnName));
}
return columnPath;
}
private void noNullElements(Object... elements) {
Validate.noNullElements(elements);
}
@Override
public <K, N, V> Mutator<K> createMutator() {
return new MutatorImpl<K>(keyspace);
}
@Override
public <K, N, V> IndexedSlicesQuery<K, N, V> createIndexSlicesQuery(Serializer<K> keySerializer,
Serializer<N> nameSerializer, Serializer<V> valueSerializer) {
return new IndexedSlicesQuery<K, N, V>(keyspace, keySerializer, nameSerializer,
valueSerializer);
}
@Override
public <SN, N, V> HSuperColumn<SN, N, V> createSuperColumn(SN name,
List<HColumn<N, V>> columns) {
return createSuperColumn(name, columns, TypeInferringSerializer.<SN>get(), TypeInferringSerializer.<N>get(), TypeInferringSerializer.<V>get());
}
@Override
public <K> SliceQuery<K, ByteBuffer, ByteBuffer> createSliceQuery() {
return createSliceQuery(TypeInferringSerializer.<K>get(), ByteBufferSerializer.get(), ByteBufferSerializer.get());
}
@Override
public <K> SuperSliceQuery<K, ByteBuffer, ByteBuffer, ByteBuffer> createSuperSliceQuery() {
return createSuperSliceQuery(TypeInferringSerializer.<K>get(), ByteBufferSerializer.get(), ByteBufferSerializer.get(), ByteBufferSerializer.get());
}
@Override
public <N> HCounterColumn<N> createCounterColumn(N name, long value, Serializer<N> nameSerializer) {
return HFactory.createCounterColumn(name, value, nameSerializer);
}
@Override
public HCounterColumn<String> createCounterColumn(String name, long value) {
return HFactory.createCounterColumn(name, value);
}
@Override
public <K, N> CounterQuery<K, N> createCounterColumnQuery(Serializer<K> keySerializer,
Serializer<N> nameSerializer) {
return HFactory.createCounterColumnQuery(keyspace, keySerializer, nameSerializer);
}
@Override
public <K, N> SliceCounterQuery<K, N> createCounterSliceQuery(Serializer<K> keySerializer,
Serializer<N> nameSerializer) {
return HFactory.createCounterSliceQuery(keyspace, keySerializer, nameSerializer);
}
@Override
public <SN, N> HCounterSuperColumn<SN, N> createCounterSuperColumn(SN name, List<HCounterColumn<N>> columns,
Serializer<SN> superNameSerializer, Serializer<N> nameSerializer) {
return HFactory.createCounterSuperColumn(name, columns, superNameSerializer, nameSerializer);
}
@Override
public String getKeyspaceName() {
return keyspaceName;
}
public void setKeyspaceName(String keyspace) {
this.keyspaceName = keyspace;
}
public Keyspace getKeyspace() {
return keyspace;
}
public void setKeyspace(Keyspace keyspace) {
this.keyspace = keyspace;
}
public ConfigurableConsistencyLevel getConfigurableConsistencyLevelPolicy() {
return configurableConsistencyLevelPolicy;
}
public void setConfigurableConsistencyLevelPolicy(
ConfigurableConsistencyLevel configurableConsistencyLevelPolicy) {
this.configurableConsistencyLevelPolicy = configurableConsistencyLevelPolicy;
}
@Override
public String getReplicationStrategyClass() {
return replicationStrategyClass;
}
public void setReplicationStrategyClass(String replicationStrategyClass) {
this.replicationStrategyClass = replicationStrategyClass;
}
@Override
public int getReplicationFactor() {
return replicationFactor;
}
public void setReplicationFactor(int replicationFactor) {
this.replicationFactor = replicationFactor;
}
@Override
public Cluster getCluster() {
return cluster;
}
public void setCluster(Cluster cluster) {
this.cluster = cluster;
}
}