package me.xhh.hector07;
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.cassandra.model.HColumnImpl;
import me.prettyprint.hector.api.Serializer;
import me.prettyprint.hector.api.beans.HColumn;
import me.prettyprint.hector.api.beans.HSuperColumn;
import org.apache.cassandra.thrift.Column;
import org.apache.cassandra.thrift.SuperColumn;
/**
* Super column whose name and value are String type, and super name is Long type.
*/
public final class StringLongSuperColumn implements HSuperColumn<Long, String, String> {
private Long superName;
private List<HColumn<String,String>> columns;
private long clock;
private final Serializer<Long> superNameSerializer;
private Serializer<String> stringSerializer;
public StringLongSuperColumn(Long sName, List<HColumn<String, String>> columns, long clock) {
this();
notNull(sName, "Name is null");
notNull(columns, "Columns are null");
this.superName = sName;
this.columns = columns;
this.clock = clock;
}
public StringLongSuperColumn(SuperColumn thriftSuperColumn) {
this();
noneNull(thriftSuperColumn);
superName = superNameSerializer.fromByteBuffer(ByteBuffer.wrap(thriftSuperColumn.getName()));
columns = fromThriftColumns(thriftSuperColumn.getColumns());
}
/*package*/ StringLongSuperColumn() {
this.superNameSerializer = DBUtil.LONG_SERIALIZER;
this.stringSerializer = DBUtil.STRING_SERIALIZER;
}
@Override
public HSuperColumn<Long, String, String> setName(Long name) {
notNull(name, "name is null");
this.superName = name;
return this;
}
@Override
public HSuperColumn<Long, String, String> setSubcolumns(List<HColumn<String, String>> subcolumns) {
notNull(subcolumns, "subcolumns are null");
this.columns = subcolumns;
return this;
}
@Override
public HSuperColumn<Long, String, String> setClock(long clock) {
this.clock = clock;
return this;
}
@Override
public long getClock() {
return clock;
}
@Override
public int getSize() {
return columns == null ? 0 : columns.size();
}
@Override
public Long getName() {
return superName;
}
/**
*
* @return an unmodifiable list of columns
*/
@Override
public List<HColumn<String,String>> getColumns() {
return columns;
}
@Override
public HColumn<String, String> get(int i) {
return columns.get(i);
}
@Override
public Serializer<Long> getNameSerializer() {
// TODO: bug of HSuperColumnImpl.getNameSerializer in hector's API.
throw new UnsupportedOperationException("TODO: bug of HSuperColumnImpl.getNameSerializer in hector's API.");
// return stringSerializer;
}
@Override
public byte[] getNameBytes() {
return superNameSerializer.toByteBuffer(getName()).array();
}
public ByteBuffer getNameByteBuffer() {
return superNameSerializer.toByteBuffer(getName());
}
public SuperColumn toThrift() {
if (superName == null || columns == null) {
return null;
}
return new SuperColumn(superNameSerializer.toByteBuffer(superName), toThriftColumn());
}
private List<Column> toThriftColumn() {
List<Column> ret = new ArrayList<Column>(columns.size());
for (HColumn<String, String> c: columns) {
ret.add(((HColumnImpl<String, String>) c).toThrift());
}
return ret;
}
private List<HColumn<String, String>> fromThriftColumns(List<Column> tcolumns) {
List<HColumn<String, String>> cs = new ArrayList<HColumn<String,String>>(tcolumns.size());
for (Column c: tcolumns) {
cs.add(new HColumnImpl<String, String>(c, stringSerializer, stringSerializer));
}
return cs;
}
@Override
public Serializer<Long> getSuperNameSerializer() {
return superNameSerializer;
}
@Override
public Serializer<String> getValueSerializer() {
return stringSerializer;
}
@Override
public String toString() {
return String.format("StringLongSuperColumn(%s,%s)", superName, columns);
}
}