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.HColumn; import me.prettyprint.hector.api.beans.HSuperColumn; import org.apache.cassandra.thrift.Column; import org.apache.cassandra.thrift.SuperColumn; /** * Models a SuperColumn in a protocol independant manner * * @param <SN> * SuperColumn name type * @param <N> * Column name type * @param <V> * Column value type * * @author zznate */ public final class HSuperColumnImpl<SN,N,V> implements HSuperColumn<SN, N, V> { private SN superName; private List<HColumn<N,V>> columns; private long clock; private final Serializer<SN> superNameSerializer; private final Serializer<N> nameSerializer; private final Serializer<V> valueSerializer; /** * @param <SN> SuperColumn name type * @param List<HColumn<N,V>> Column values * @param Serializer<SN> the serializer type * @param clock */ public HSuperColumnImpl(SN sName, List<HColumn<N, V>> columns, long clock, Serializer<SN> sNameSerializer, Serializer<N> nameSerializer, Serializer<V> valueSerializer) { this(sNameSerializer, nameSerializer, valueSerializer); notNull(sName, "Name is null"); notNull(columns, "Columns are null"); this.superName = sName; this.columns = columns; this.clock = clock; } public HSuperColumnImpl(SuperColumn thriftSuperColumn, Serializer<SN> sNameSerializer, Serializer<N> nameSerializer, Serializer<V> valueSerializer) { this(sNameSerializer, nameSerializer, valueSerializer); noneNull(thriftSuperColumn, sNameSerializer, nameSerializer); superName = sNameSerializer.fromByteBuffer(ByteBuffer.wrap(thriftSuperColumn.getName())); columns = fromThriftColumns(thriftSuperColumn.getColumns()); } /*package*/ HSuperColumnImpl(Serializer<SN> sNameSerializer, Serializer<N> nameSerializer, Serializer<V> valueSerializer) { noneNull(sNameSerializer, nameSerializer); this.superNameSerializer = sNameSerializer; this.nameSerializer = nameSerializer; this.valueSerializer = valueSerializer; } @Override public HSuperColumn<SN, N, V> setName(SN name) { notNull(name, "name is null"); this.superName = name; return this; } @Override public HSuperColumn<SN, N, V> setSubcolumns(List<HColumn<N, V>> subcolumns) { notNull(subcolumns, "subcolumns are null"); this.columns = subcolumns; return this; } @Override public HSuperColumn<SN, N, V> 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 SN getName() { return superName; } /** * * @return an unmodifiable list of columns */ @Override public List<HColumn<N,V>> getColumns() { return columns; } @Override public HColumn<N, V> get(int i) { return columns.get(i); } @Override public HColumn<N, V> getSubColumnByName(N subColumnName) { for (HColumn<N,V> column : columns ) { if ( nameSerializer.toByteBuffer(subColumnName).equals(column.getNameBytes()) ) { return column; } } return null; } @Override public Serializer<SN> getNameSerializer() { return superNameSerializer; } @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<N, V> c: columns) { ret.add(((HColumnImpl<N, V>) c).toThrift()); } return ret; } private List<HColumn<N, V>> fromThriftColumns(List<Column> tcolumns) { List<HColumn<N, V>> cs = new ArrayList<HColumn<N,V>>(tcolumns.size()); for (Column c: tcolumns) { cs.add(new HColumnImpl<N, V>(c, nameSerializer, valueSerializer)); } return cs; } @Override public Serializer<SN> getSuperNameSerializer() { return superNameSerializer; } @Override public Serializer<V> getValueSerializer() { return valueSerializer; } @Override public String toString() { return String.format("HSuperColumn(%s,%s)", superName, columns); } }