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.HColumn;
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.SliceQuery;
import org.junit.After;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class ColumnSliceIteratorTest extends BaseEmbededServerSetupTest {
private static final UUIDSerializer us = UUIDSerializer.get();
private static final StringSerializer se = new StringSerializer();
private static final String CF = "Standard1";
private static final String KEY = "key";
private static final ColumnSliceIterator.ColumnSliceFinish<UUID> FINISH = new ColumnSliceIterator.ColumnSliceFinish<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.addInsertion(KEY, CF, createColumn(TimeUUIDUtils.getUniqueTimeUUIDinMillis(), String.valueOf(i), us, se));
}
m.execute();
}
@After
public void tearDown() {
Mutator<String> m = createMutator(keyspace, se);
m.addDeletion(KEY, CF);
m.execute();
}
@Test
public void testIterator() {
SliceQuery<String, UUID, String> query = HFactory.createSliceQuery(keyspace, se, us, se).setKey(KEY).setColumnFamily(CF);
ColumnSliceIterator<String, UUID, String> it = new ColumnSliceIterator<String, UUID, String>(query, null, FINISH, false, 100);
Map<UUID, String> results = new HashMap<UUID, String>();
while (it.hasNext()) {
HColumn<UUID, String> c = it.next();
results.put(c.getName(), c.getValue());
}
assertEquals(1000, results.size());
}
@Test
public void testModificationIterator() {
Mutator mutator = HFactory.createMutator(keyspace, se);
SliceQuery<String, UUID, String> query = HFactory.createSliceQuery(keyspace, se, us, se).setKey(KEY).setColumnFamily(CF);
ColumnSliceIterator<String, UUID, String> it = new ColumnSliceIterator<String, UUID, String>(query, null, FINISH, false, 100);
Map<UUID, String> results = new HashMap<UUID, String>();
while (it.hasNext()) {
HColumn<UUID, String> 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.addInsertion(KEY, CF, createColumn("a" + i, String.valueOf(i), se, se));
m.addInsertion(KEY, CF, createColumn("b" + i, String.valueOf(i), se, se));
m.addInsertion(KEY, CF, createColumn("c" + i, String.valueOf(i), se, se));
}
m.execute();
SliceQuery<String, String, String> query = HFactory.createSliceQuery(keyspace, se, se, se)
.setKey(KEY)
.setColumnFamily(CF);
ColumnSliceIterator<String, String, String> it = new ColumnSliceIterator<String, String, String>(query, "a", "d", false, 2).
setFilter(new SliceFilter<HColumn<String, String>>() {
@Override
public boolean accept(HColumn<String, String> column) {
return !column.getName().startsWith("b");
}
});
List<String> results = new ArrayList<String>(1000);
while (it.hasNext()) {
HColumn<String, String> c = it.next();
String name = c.getName();
assertFalse(name.equals("b"));
results.add(name);
}
assertEquals(1000, results.size());
}
}