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); } }