package me.prettyprint.cassandra.service.template; import java.nio.ByteBuffer; import java.util.Date; import java.util.UUID; import me.prettyprint.cassandra.serializers.*; import me.prettyprint.hector.api.ColumnFactory; import me.prettyprint.hector.api.Serializer; import me.prettyprint.hector.api.beans.Composite; import me.prettyprint.hector.api.beans.DynamicComposite; import me.prettyprint.hector.api.beans.HColumn; import me.prettyprint.hector.api.mutation.Mutator; /** * This provides an interface of updating a specified row, most likely with the * contents of an object. This would likely by implemented as an anonymous inner * class with access to a final object in scope. It would update the given row * with the object's data. * * For more complex behaviour, subclasses should implementat update() to simply make * consecutive calls to various set****() methods which already have the * contextual information they need to update the correct row. * * The downside of this approach is that the updater is essentially stateful and * cannot be used concurrently. The alternative is to pass an object in to * update() as a parameter with the setter methods, leaving the updater to be * stateless. * * @author david * @author zznate * * @param <K> * the key's data type * @param <N> * the standard or super column's data type */ public class ColumnFamilyUpdater<K, N> extends AbstractTemplateUpdater<K,N> { /** * Constructs a ColumnFamilyUpdater with the provided {@link ColumnFamilyTemplate} * and {@link ColumnFactory}. A {@link Mutator} is created internally for this updater. * @param template * @param columnFactory */ public ColumnFamilyUpdater(ColumnFamilyTemplate<K, N> template, ColumnFactory columnFactory) { super(template, columnFactory, template.createMutator()); } /** * Same as 2-arg version, except we use the provided {@link Mutator} * @param template * @param columnFactory * @param mutator */ public ColumnFamilyUpdater(ColumnFamilyTemplate<K, N> template, ColumnFactory columnFactory, Mutator<K> mutator) { super(template, columnFactory, mutator); } public void deleteColumn(N columnName) { mutator.addDeletion(getCurrentKey(), template.getColumnFamily(), columnName, template.getTopSerializer(), clock); } public void setString(N columnName, String value) { addInsertion(columnName,value,StringSerializer.get(), globalTtl); } public void setString(N columnName, String value, int ttl) { addInsertion(columnName,value,StringSerializer.get(),ttl); } public void setUUID(N columnName, UUID value) { addInsertion(columnName, value, UUIDSerializer.get(), globalTtl); } public void setUUID(N columnName, UUID value, int ttl) { addInsertion(columnName, value, UUIDSerializer.get(), ttl); } public void setLong(N columnName, Long value) { addInsertion(columnName, value, LongSerializer.get(), globalTtl); } public void setLong(N columnName, Long value, int ttl) { addInsertion(columnName, value, LongSerializer.get(), ttl); } public void setInteger(N columnName, Integer value) { addInsertion(columnName, value, IntegerSerializer.get(), globalTtl); } public void setInteger(N columnName, Integer value, int ttl) { addInsertion(columnName, value, IntegerSerializer.get(), ttl); } public void setFloat(N columnName, Float value) { addInsertion(columnName, value, FloatSerializer.get(), globalTtl); } public void setFloat(N columnName, Float value, int ttl) { addInsertion(columnName, value, FloatSerializer.get(), ttl); } public void setDouble(N columnName, Double value) { addInsertion(columnName, value, DoubleSerializer.get(), globalTtl); } public void setDouble(N columnName, Double value, int ttl) { addInsertion(columnName, value, DoubleSerializer.get(), ttl); } public void setBoolean(N columnName, Boolean value) { addInsertion(columnName, value, BooleanSerializer.get(), globalTtl); } public void setBoolean(N columnName, Boolean value, int ttl) { addInsertion(columnName, value, BooleanSerializer.get(), ttl); } public void setByteArray(N columnName, byte[] value) { addInsertion(columnName, value, BytesArraySerializer.get(), globalTtl); } public void setByteArray(N columnName, byte[] value, int ttl) { addInsertion(columnName, value, BytesArraySerializer.get(), ttl); } public void setByteBuffer(N columnName, ByteBuffer value) { addInsertion(columnName, value, ByteBufferSerializer.get(), globalTtl); } public void setByteBuffer(N columnName, ByteBuffer value, int ttl) { addInsertion(columnName, value, ByteBufferSerializer.get(), globalTtl); } public void setDate(N columnName, Date value) { addInsertion(columnName, value, DateSerializer.get(), globalTtl); } public <V> void setFloat(N columnName, float value) { addInsertion(columnName, value, FloatSerializer.get(), globalTtl); } public <V> void setComposite(N columnName, Composite composite) { addInsertion(columnName, composite, CompositeSerializer.get(), globalTtl); } public <V> void setComposite(N columnName, Composite composite, int ttl) { addInsertion(columnName, composite, CompositeSerializer.get(), ttl); } public <V> void setDynamicComposite(N columnName, DynamicComposite composite) { addInsertion(columnName, composite, DynamicCompositeSerializer.get(), globalTtl); } public <V> void setDynamicComposite(N columnName, DynamicComposite composite, int ttl) { addInsertion(columnName, composite, DynamicCompositeSerializer.get(), ttl); } public <V> void setValue(N columnName, V value, Serializer<V> serializer) { addInsertion(columnName, value, serializer, globalTtl); } public <V> void setValue(N columnName, V value, Serializer<V> serializer, int ttl) { addInsertion(columnName, value, serializer, ttl); } private <V> void addInsertion(N columnName, V value, Serializer<V> valueSerializer, int ttl) { HColumn<N,V> column = columnFactory.createColumn(columnName, value, clock, template.getTopSerializer(), valueSerializer); if(ttl > DEF_TTL) { column.setTtl(ttl); } mutator.addInsertion(getCurrentKey(), template.getColumnFamily(), column); } public <V> void setColumn(HColumn<N, V> column) { mutator.addInsertion(getCurrentKey(), template.getColumnFamily(), column); } }