package com.feedly.cassandra;
import static org.junit.Assert.*;
import java.util.HashSet;
import java.util.Set;
import me.prettyprint.hector.api.ddl.ColumnDefinition;
import me.prettyprint.hector.api.ddl.ColumnFamilyDefinition;
import me.prettyprint.hector.api.ddl.ColumnIndexType;
import org.apache.cassandra.db.compaction.LeveledCompactionStrategy;
import org.apache.cassandra.io.compress.CompressionParameters;
import org.apache.cassandra.io.compress.DeflateCompressor;
import org.apache.cassandra.io.compress.SnappyCompressor;
import org.junit.Test;
import com.feedly.cassandra.anno.ColumnFamily;
import com.feedly.cassandra.entity.enhance.CompositeIndexedBean;
import com.feedly.cassandra.entity.enhance.CounterBean;
import com.feedly.cassandra.entity.enhance.IndexedBean;
import com.feedly.cassandra.entity.enhance.ListBean;
import com.feedly.cassandra.entity.enhance.ParentCounterBean;
import com.feedly.cassandra.entity.enhance.PartitionedIndexBean;
import com.feedly.cassandra.entity.enhance.SampleBean;
import com.feedly.cassandra.entity.enhance.SampleBean2;
import com.feedly.cassandra.entity.enhance.TtlBean;
import com.feedly.cassandra.entity.upd_enhance.SampleBean2Upgrade;
import com.feedly.cassandra.test.CassandraServiceTestBase;
public class PersistenceManagerSchemaTest extends CassandraServiceTestBase
{
@Test
public void testSimpleTable()
{
PersistenceManager pm = new PersistenceManager();
configurePersistenceManager(pm);
pm.setPackagePrefixes(new String[] {SampleBean.class.getPackage().getName()});
pm.init();
String expected = SampleBean.class.getAnnotation(ColumnFamily.class).name();
for(ColumnFamilyDefinition cfdef : cluster.describeKeyspace(KEYSPACE).getCfDefs())
{
if(cfdef.getName().equals(expected))
{
assertTrue(cfdef.getCompressionOptions() == null || cfdef.getCompressionOptions().isEmpty());
return;
}
}
fail("SampleBean's table not found");
}
@Test
public void testCounterTable()
{
PersistenceManager pm = new PersistenceManager();
configurePersistenceManager(pm);
pm.setPackagePrefixes(new String[] {SampleBean.class.getPackage().getName()});
pm.init();
Set<String> counterTables = new HashSet<String>();
for(ColumnFamilyDefinition cfdef : cluster.describeKeyspace(KEYSPACE).getCfDefs())
{
assertFalse(cfdef.getName().equals(CounterBean.class.getAnnotation(ColumnFamily.class).name()));
if(cfdef.getName().endsWith("_cntr"))
counterTables.add(cfdef.getName());
}
Set<String> expected = new HashSet<String>();
expected.add(CounterBean.class.getAnnotation(ColumnFamily.class).name() + "_cntr");
expected.add(ParentCounterBean.class.getAnnotation(ColumnFamily.class).name() + "_cntr");
assertEquals(expected, counterTables);
}
@Test
public void testCompressionOptions()
{
PersistenceManager pm = new PersistenceManager();
configurePersistenceManager(pm);
pm.setPackagePrefixes(new String[] {ListBean.class.getPackage().getName()});
pm.init();
String expected = ListBean.class.getAnnotation(ColumnFamily.class).name();
for(ColumnFamilyDefinition cfdef : cluster.describeKeyspace(KEYSPACE).getCfDefs())
{
if(cfdef.getName().equals(expected))
{
assertEquals("8", cfdef.getCompressionOptions().get(CompressionParameters.CHUNK_LENGTH_KB));
assertEquals(DeflateCompressor.class.getName(), cfdef.getCompressionOptions().get(CompressionParameters.SSTABLE_COMPRESSION));
return;
}
}
fail("SampleBean's table not found");
}
@Test
public void testHashIndexes()
{
PersistenceManager pm = new PersistenceManager();
configurePersistenceManager(pm);
pm.setPackagePrefixes(new String[] {IndexedBean.class.getPackage().getName()});
pm.init();
assertHashIndexes();
/*
* rerun, make sure
*/
pm = new PersistenceManager();
configurePersistenceManager(pm);
pm.setPackagePrefixes(new String[] {IndexedBean.class.getPackage().getName()});
pm.init();
assertHashIndexes();
}
private void assertHashIndexes()
{
boolean foundIndexBean = false, foundCompositeIndexBean = false;
for(ColumnFamilyDefinition cfdef : cluster.describeKeyspace(KEYSPACE).getCfDefs())
{
boolean isIndexBean = cfdef.getName().equals(IndexedBean.class.getAnnotation(ColumnFamily.class).name());
boolean isCompositeIndexBean = cfdef.getName().equals(CompositeIndexedBean.class.getAnnotation(ColumnFamily.class).name());
if(isIndexBean || isCompositeIndexBean)
{
assertEquals(2, cfdef.getColumnMetadata().size());
for(ColumnDefinition col : cfdef.getColumnMetadata())
{
assertEquals(ColumnIndexType.KEYS, col.getIndexType());
}
}
foundIndexBean = foundIndexBean || isIndexBean;
foundCompositeIndexBean = foundCompositeIndexBean || isCompositeIndexBean;
}
assertTrue(foundIndexBean);
assertTrue(foundCompositeIndexBean);
}
@Test
public void testRangeIndexes()
{
PersistenceManager pm = new PersistenceManager();
configurePersistenceManager(pm);
pm.setPackagePrefixes(new String[] {IndexedBean.class.getPackage().getName()});
pm.init();
String indexBeanName = IndexedBean.class.getAnnotation(ColumnFamily.class).name();
String ttlBeanName = TtlBean.class.getAnnotation(ColumnFamily.class).name();
String compositeIndexBeanName = CompositeIndexedBean.class.getAnnotation(ColumnFamily.class).name();
String partitionedIndexBeanName = PartitionedIndexBean.class.getAnnotation(ColumnFamily.class).name();
boolean foundIndexBeanIdx = false, foundTtlBeanIdx = false, foundCompositeIndexBeanIdx = false, foundPartitionedIndexBeanIdx = false;
boolean foundWal = false;
for(ColumnFamilyDefinition cfdef : cluster.describeKeyspace(KEYSPACE).getCfDefs())
{
String name = cfdef.getName();
if(name.endsWith("_idx"))
{
if(name.equals(indexBeanName + "_idx"))
foundIndexBeanIdx = true;
else if(name.equals(compositeIndexBeanName + "_idx"))
foundCompositeIndexBeanIdx = true;
else if(name.equals(partitionedIndexBeanName + "_idx"))
foundPartitionedIndexBeanIdx = true;
else if(name.equals(ttlBeanName + "_idx"))
foundTtlBeanIdx = true;
else
fail("unrecognized index table " + name);
}
else if(name.endsWith(PersistenceManager.CF_IDXWAL))
{
assertEquals(0, cfdef.getGcGraceSeconds());
assertEquals(LeveledCompactionStrategy.class.getName(), cfdef.getCompactionStrategy());
foundWal = true;
}
}
assertTrue(foundCompositeIndexBeanIdx);
assertTrue(foundIndexBeanIdx);
assertTrue(foundTtlBeanIdx);
assertTrue(foundWal);
assertTrue(foundPartitionedIndexBeanIdx);
}
@Test
public void testUpdate()
{
PersistenceManager pm = new PersistenceManager();
configurePersistenceManager(pm);
pm.setPackagePrefixes(new String[] {SampleBean2.class.getPackage().getName()});
pm.init();
pm = new PersistenceManager();
configurePersistenceManager(pm);
//points to same physical table as sample bean, should convert table to compressed and add an index on strVal
pm.setPackagePrefixes(new String[] {SampleBean2Upgrade.class.getPackage().getName()});
pm.init();
String expected = SampleBean2.class.getAnnotation(ColumnFamily.class).name();
for(ColumnFamilyDefinition cfdef : cluster.describeKeyspace(KEYSPACE).getCfDefs())
{
if(cfdef.getName().equals(expected))
{
assertEquals(SnappyCompressor.class.getName(), cfdef.getCompressionOptions().get(CompressionParameters.SSTABLE_COMPRESSION));
assertEquals(3, cfdef.getColumnMetadata().size());
assertEquals(ColumnIndexType.KEYS, cfdef.getColumnMetadata().get(0).getIndexType());
return;
}
}
}
}