package me.prettyprint.cassandra.service; import me.prettyprint.hector.api.Keyspace; import me.prettyprint.hector.api.Serializer; import me.prettyprint.hector.api.beans.HCounterColumn; import me.prettyprint.hector.api.factory.HFactory; import me.prettyprint.hector.api.mutation.Mutator; import me.prettyprint.hector.api.query.SliceCounterQuery; /** * Resets each counter counter column in the row to zero. This class is subject to the limitations of counter columns. * See the <a href="http://wiki.apache.org/cassandra/Counters">Cassandra Wiki</a> for more information on the * limitations. * * @author thrykol */ public class ClearCounterRow<K, N> { private Keyspace keyspace; private Serializer<K> keySerializer; private Serializer<N> nameSerializer; private K rowKey; private String cf; private int mutateInterval = 100; private int count = 100; public ClearCounterRow(Keyspace keyspace, Serializer<K> keySerializer, Serializer<N> nameSerializer) { this.keyspace = keyspace; this.keySerializer =keySerializer; this.nameSerializer = nameSerializer; } /** * Column family the row is part of. * * @param cf Column family name * @return <code>this</code> */ public ClearCounterRow<K, N> setColumnFamily(String cf) { this.cf = cf; return this; } /** * Key of the source row. * * @param rowKey Row key * @return <code>this</code> */ public ClearCounterRow<K, N> setRowKey(K rowKey) { this.rowKey = rowKey; return this; } /** * Set the mutate interval. * * @param interval Mutation interval * @return <code>this</code> */ public ClearCounterRow<K, N> setMutateInterval(int interval) { this.mutateInterval = interval; return this; } /** * Set the number of columns to retrieve per slice. * * @param count The number of columns to retrieve per slice * @return <this> */ public ClearCounterRow<K, N> setCount(int count) { this.count = count; return this; } /** * Clear the counter columns. */ public void clear() { Mutator<K> mutator = HFactory.createMutator(this.keyspace, this.keySerializer, new BatchSizeHint(1, this.mutateInterval)); SliceCounterQuery<K, N> query = HFactory.createCounterSliceQuery(this.keyspace, this.keySerializer, this.nameSerializer). setColumnFamily(this.cf). setKey(this.rowKey); SliceCounterIterator<K, N> iterator = new SliceCounterIterator<K, N>(query, null, (N) null, false, this.count); while(iterator.hasNext()) { HCounterColumn<N> column = iterator.next(); mutator.incrementCounter(this.rowKey, this.cf, column.getName(), column.getValue() * -1); } mutator.execute(); } }