package fr.ippon.tatami.repository.cassandra; import fr.ippon.tatami.repository.TagCounterRepository; import me.prettyprint.cassandra.model.thrift.ThriftCounterColumnQuery; import me.prettyprint.cassandra.serializers.StringSerializer; import me.prettyprint.hector.api.Keyspace; import me.prettyprint.hector.api.factory.HFactory; import me.prettyprint.hector.api.mutation.Mutator; import me.prettyprint.hector.api.query.CounterQuery; import org.springframework.stereotype.Repository; import javax.inject.Inject; import static fr.ippon.tatami.config.ColumnFamilyKeys.TAG_COUNTER_CF; /** * Cassandra implementation of the Tag Counter repository. * <p/> * Structure : * - Key = tag + domain * - Name = TAG_COUNTER * - Value = count * * @author Julien Dubois */ @Repository public class CassandraTagCounterRepository implements TagCounterRepository { private static final String TAG_COUNTER = "TAG_COUNTER"; @Inject private Keyspace keyspaceOperator; @Override public long getTagCounter(String domain, String tag) { CounterQuery<String, String> counter = new ThriftCounterColumnQuery<String, String>(keyspaceOperator, StringSerializer.get(), StringSerializer.get()); counter.setColumnFamily(TAG_COUNTER_CF).setKey(getKey(domain, tag)).setName(TAG_COUNTER); return counter.execute().get().getValue(); } @Override public void incrementTagCounter(String domain, String tag) { Mutator<String> mutator = HFactory.createMutator(keyspaceOperator, StringSerializer.get()); mutator.incrementCounter(getKey(domain, tag), TAG_COUNTER_CF, TAG_COUNTER, 1); } @Override public void decrementTagCounter(String domain, String tag) { Mutator<String> mutator = HFactory.createMutator(keyspaceOperator, StringSerializer.get()); mutator.decrementCounter(getKey(domain, tag), TAG_COUNTER_CF, TAG_COUNTER, 1); } @Override public void deleteTagCounter(String domain, String tag) { Mutator<String> mutator = HFactory.createMutator(keyspaceOperator, StringSerializer.get()); mutator.addCounterDeletion(getKey(domain, tag), TAG_COUNTER_CF, TAG_COUNTER, StringSerializer.get()); mutator.execute(); } /** * Generates the key for this column family. */ private String getKey(String domain, String tag) { return tag.toLowerCase() + "-" + domain; } }