package me.prettyprint.cassandra.model;
import static me.prettyprint.cassandra.utils.Assert.noneNull;
import static me.prettyprint.cassandra.utils.Assert.notNull;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import me.prettyprint.hector.api.Serializer;
import me.prettyprint.hector.api.beans.HCounterColumn;
import me.prettyprint.hector.api.beans.HCounterSuperColumn;
import org.apache.cassandra.thrift.CounterColumn;
import org.apache.cassandra.thrift.CounterSuperColumn;
/**
* Models a CounterSuperColumn in a protocol independent manner.
*
* @param <SN>
* CounterSuperColumn name type
* @param <N>
* CounterColumn name type
*
* @author patricioe
*/
public final class HCounterSuperColumnImpl<SN,N> implements HCounterSuperColumn<SN, N> {
private SN superName;
private List<HCounterColumn<N>> counterColumns;
private final Serializer<SN> superNameSerializer;
private final Serializer<N> nameSerializer;
/**
* @param sName<SN> CounterSuperColumn name type
* @param List<HCounterColumn<N,V>> CounterColumn values
* @param Serializer<SN> the serializer type
*/
public HCounterSuperColumnImpl(SN sName, List<HCounterColumn<N>> counterColumns,
Serializer<SN> sNameSerializer, Serializer<N> nameSerializer) {
this(sNameSerializer, nameSerializer);
notNull(sName, "Name is null");
notNull(counterColumns, "Columns are null");
this.superName = sName;
this.counterColumns = counterColumns;
}
public HCounterSuperColumnImpl(CounterSuperColumn thriftCounterSuperColumn, Serializer<SN> sNameSerializer,
Serializer<N> nameSerializer) {
this(sNameSerializer, nameSerializer);
noneNull(thriftCounterSuperColumn, sNameSerializer, nameSerializer);
superName = sNameSerializer.fromByteBuffer(ByteBuffer.wrap(thriftCounterSuperColumn.getName()));
counterColumns = fromThriftColumns(thriftCounterSuperColumn.getColumns());
}
public HCounterSuperColumnImpl(Serializer<SN> sNameSerializer, Serializer<N> nameSerializer) {
noneNull(sNameSerializer, nameSerializer);
this.superNameSerializer = sNameSerializer;
this.nameSerializer = nameSerializer;
}
public HCounterSuperColumn<SN, N> addSubCounterColumn(HCounterColumn<N> counterColumn) {
if ( counterColumns == null )
counterColumns = new ArrayList<HCounterColumn<N>>();
counterColumns.add(counterColumn);
return this;
}
@Override
public HCounterSuperColumn<SN, N> setName(SN name) {
notNull(name, "name is null");
this.superName = name;
return this;
}
@Override
public HCounterSuperColumn<SN, N> setSubcolumns(List<HCounterColumn<N>> counterSubcolumns) {
notNull(counterSubcolumns, "subcolumns are null");
this.counterColumns = counterSubcolumns;
return this;
}
@Override
public int getSize() {
return counterColumns == null ? 0 : counterColumns.size();
}
@Override
public SN getName() {
return superName;
}
/**
*
* @return an unmodifiable list of counterColumns
*/
@Override
public List<HCounterColumn<N>> getColumns() {
return counterColumns;
}
@Override
public HCounterColumn<N> get(int i) {
return counterColumns.get(i);
}
@Override
public Serializer<SN> getNameSerializer() {
return superNameSerializer;
}
@Override
public byte[] getNameBytes() {
return superNameSerializer.toByteBuffer(getName()).array();
}
public ByteBuffer getNameByteBuffer() {
return superNameSerializer.toByteBuffer(getName());
}
public CounterSuperColumn toThrift() {
if (superName == null || counterColumns == null) {
return null;
}
return new CounterSuperColumn(superNameSerializer.toByteBuffer(superName), toThriftColumn());
}
private List<CounterColumn> toThriftColumn() {
List<CounterColumn> ret = new ArrayList<CounterColumn>(counterColumns.size());
for (HCounterColumn<N> c: counterColumns) {
ret.add(((HCounterColumnImpl<N>) c).toThrift());
}
return ret;
}
private List<HCounterColumn<N>> fromThriftColumns(List<CounterColumn> tcolumns) {
List<HCounterColumn<N>> cs = new ArrayList<HCounterColumn<N>>(tcolumns.size());
for (CounterColumn c: tcolumns) {
cs.add(new HCounterColumnImpl<N>(c, nameSerializer));
}
return cs;
}
@Override
public Serializer<SN> getSuperNameSerializer() {
return superNameSerializer;
}
@Override
public String toString() {
return String.format("HCounterSuperColumn(%s,%s)", superName, counterColumns);
}
}