package cassandra.schema; import java.io.FileInputStream; import java.util.ArrayList; import java.util.List; import java.util.Properties; import me.prettyprint.cassandra.model.BasicColumnDefinition; import me.prettyprint.cassandra.serializers.StringSerializer; import me.prettyprint.hector.api.Cluster; import me.prettyprint.hector.api.ddl.ColumnDefinition; import me.prettyprint.hector.api.ddl.ColumnFamilyDefinition; import me.prettyprint.hector.api.ddl.ComparatorType; import me.prettyprint.hector.api.ddl.KeyspaceDefinition; import me.prettyprint.hector.api.factory.HFactory; /** * Database schema builds automatically if the keyspaces do not exist. * * @author Michael Vogiatzis * */ public class Schema { private static final String TWEETS = "tw"; private static final String LINKS = "links"; private static final String SIMPLESTRATEGY = "org.apache.cassandra.locator.SimpleStrategy"; private static int replFactor; static String host; static String clusterName; static Cluster cluster; /** * @param args */ public static void main(String[] args) { Properties prop = new Properties(); replFactor = 1; try { prop.load(Schema.class.getClassLoader().getResourceAsStream("config.properties")); replFactor = Integer.valueOf(prop.getProperty("REPL_FACTOR")); host = String.valueOf(prop.getProperty("HOST")); clusterName = String.valueOf(prop.getProperty("CLUSTERNAME")); System.out.println("Replication factor: " + replFactor); System.out.println("Host: " + host); System.out.println("Cluster name: " + clusterName); } catch (Exception ex) { ex.printStackTrace(); } cluster = HFactory.getOrCreateCluster(clusterName, host); KeyspaceDefinition keyspaceDef = cluster.describeKeyspace(TWEETS); if (keyspaceDef == null) { createTweetsTable(); } keyspaceDef = cluster.describeKeyspace(LINKS); if (keyspaceDef == null) { createLinksTable(); } } private static void createTweetsTable() { final String QF_ID = "id"; // Column Family tweets final String CF_TWEET = "t"; final String QF_TEXT = "txt"; ColumnFamilyDefinition cfTweet = HFactory.createColumnFamilyDefinition( TWEETS, CF_TWEET, ComparatorType.UTF8TYPE); cfTweet.setKeyValidationClass(ComparatorType.LONGTYPE.getTypeName()); List<ColumnDefinition> tweetMetaData = new ArrayList<ColumnDefinition>(); BasicColumnDefinition t_txt = new BasicColumnDefinition(); t_txt.setName(StringSerializer.get().toByteBuffer(QF_TEXT)); t_txt.setValidationClass(ComparatorType.UTF8TYPE.getClassName()); tweetMetaData.add(t_txt); cfTweet.addColumnDefinition(t_txt); List<ColumnFamilyDefinition> cfDefs = new ArrayList<ColumnFamilyDefinition>(); cfDefs.add(cfTweet); KeyspaceDefinition tweetsDef = HFactory.createKeyspaceDefinition( TWEETS, SIMPLESTRATEGY, replFactor, cfDefs); cluster.addKeyspace(tweetsDef); } private static void createLinksTable() { // column family l final String CF_LINKS = "l"; final String QF_URL = "u"; ColumnFamilyDefinition cfLinks = HFactory.createColumnFamilyDefinition( LINKS, CF_LINKS, ComparatorType.UTF8TYPE); cfLinks.setKeyValidationClass(ComparatorType.UTF8TYPE.getTypeName()); List<ColumnDefinition> linksMetaData = new ArrayList<ColumnDefinition>(); BasicColumnDefinition twLinks = new BasicColumnDefinition(); twLinks.setName(StringSerializer.get().toByteBuffer(QF_URL)); twLinks.setValidationClass(ComparatorType.UTF8TYPE.getClassName()); linksMetaData.add(twLinks); cfLinks.addColumnDefinition(twLinks); List<ColumnFamilyDefinition> cfDefs = new ArrayList<ColumnFamilyDefinition>(); cfDefs.add(cfLinks); KeyspaceDefinition linksDef = HFactory.createKeyspaceDefinition(LINKS, SIMPLESTRATEGY, replFactor, cfDefs); cluster.addKeyspace(linksDef); } }