package me.prettyprint.cassandra.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import me.prettyprint.cassandra.BaseEmbededServerSetupTest;
import me.prettyprint.cassandra.serializers.StringSerializer;
import me.prettyprint.cassandra.serializers.UUIDSerializer;
import me.prettyprint.cassandra.service.template.SliceFilter;
import me.prettyprint.cassandra.utils.TimeUUIDUtils;
import me.prettyprint.hector.api.Cluster;
import me.prettyprint.hector.api.Keyspace;
import me.prettyprint.hector.api.beans.HCounterColumn;
import me.prettyprint.hector.api.factory.HFactory;
import static me.prettyprint.hector.api.factory.HFactory.*;
import me.prettyprint.hector.api.mutation.Mutator;
import me.prettyprint.hector.api.query.SliceCounterQuery;
import org.junit.After;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class SliceCounterIteratorTest extends BaseEmbededServerSetupTest {
private static final UUIDSerializer us = UUIDSerializer.get();
private static final StringSerializer se = new StringSerializer();
private static final String CF = "Counter1";
private static final String KEY = "key";
private static final SliceCounterIterator.SliceCounterFinish<UUID> FINISH = new SliceCounterIterator.SliceCounterFinish<UUID>() {
@Override
public UUID function() {
return TimeUUIDUtils.getUniqueTimeUUIDinMillis();
}
};
private Cluster cluster;
private Keyspace keyspace;
@Before
public void setUp() {
cluster = getOrCreateCluster("Test Cluster", "127.0.0.1:9170");
keyspace = createKeyspace("Keyspace1", cluster);
Mutator<String> m = createMutator(keyspace, se);
for (int i = 0; i < 1000; i++) {
m.addCounter(KEY, CF, createCounterColumn(TimeUUIDUtils.getUniqueTimeUUIDinMillis(), 1, us));
}
m.execute();
}
@After
public void tearDown() {
Mutator<String> m = createMutator(keyspace, se);
m.addDeletion(KEY, CF);
m.execute();
}
@Test
public void testIterator() {
SliceCounterQuery<String, UUID> query = HFactory.createCounterSliceQuery(keyspace, se, us).setKey(KEY).setColumnFamily(CF);
SliceCounterIterator<String, UUID> it = new SliceCounterIterator<String, UUID>(query, null, FINISH, false, 100);
Map<UUID, Long> results = new HashMap<UUID, Long>();
while (it.hasNext()) {
HCounterColumn<UUID> c = it.next();
results.put(c.getName(), c.getValue());
}
assertEquals(1000, results.size());
}
@Test
public void testModificationIterator() {
Mutator mutator = HFactory.createMutator(keyspace, se);
SliceCounterQuery<String, UUID> query = HFactory.createCounterSliceQuery(keyspace, se, us).setKey(KEY).setColumnFamily(CF);
SliceCounterIterator<String, UUID> it = new SliceCounterIterator<String, UUID>(query, null, FINISH, false, 100);
Map<UUID, Long> results = new HashMap<UUID, Long>();
while (it.hasNext()) {
HCounterColumn<UUID> c = it.next();
results.put(c.getName(), c.getValue());
mutator.addDeletion(KEY, CF, c.getName(), us);
mutator.execute();
}
assertEquals(1000, results.size());
}
@Test
public void testFilter() {
cluster.truncate(keyspace.getKeyspaceName(), CF);
Mutator<String> m = createMutator(keyspace, se);
for (int i = 0; i < 500; i++) {
m.addCounter(KEY, CF, createCounterColumn("a" + i, 1, se));
m.addCounter(KEY, CF, createCounterColumn("b" + i, 1, se));
m.addCounter(KEY, CF, createCounterColumn("c" + i, 1, se));
}
m.execute();
SliceCounterQuery<String, String> query = HFactory.createCounterSliceQuery(keyspace, se, se).setKey(KEY).setColumnFamily(CF);
SliceCounterIterator<String, String> it = new SliceCounterIterator<String, String>(query, "a", "d", false, 100).setFilter(new SliceFilter<HCounterColumn<String>>() {
@Override
public boolean accept(HCounterColumn<String> column)
{
return !column.getName().startsWith("b");
}
});
List<String> results = new ArrayList<String>(1000);
while(it.hasNext()) {
HCounterColumn<String> c = it.next();
String name = c.getName();
assertFalse(name.equals("b"));
results.add(name);
}
assertEquals(1000, results.size());
}
}