package me.prettyprint.cassandra.service; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; import me.prettyprint.cassandra.utils.Assert; import me.prettyprint.hector.api.ddl.ColumnDefinition; import me.prettyprint.hector.api.ddl.ColumnFamilyDefinition; import me.prettyprint.hector.api.ddl.ColumnType; import me.prettyprint.hector.api.ddl.ComparatorType; import me.prettyprint.cassandra.constants.CFMetaDataDefaults; import org.apache.cassandra.thrift.CfDef; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; public class ThriftCfDef implements ColumnFamilyDefinition { private String keyspace; private String name; private ColumnType columnType; private ComparatorType comparatorType; private ComparatorType subComparatorType; private String comparatorTypeAlias = ""; private String subComparatorTypeAlias = ""; private String comment; private double rowCacheSize; private int rowCacheSavePeriodInSeconds; private double keyCacheSize; private double readRepairChance; private List<ColumnDefinition> columnMetadata; private int gcGraceSeconds; private String keyValidationClass; private String keyValidationAlias = ""; private String defaultValidationClass; private int id; private int maxCompactionThreshold; private int minCompactionThreshold; private double memtableOperationsInMillions; private int memtableThroughputInMb; private int memtableFlushAfterMins; private int keyCacheSavePeriodInSeconds; private boolean replicateOnWrite; private String compactionStrategy; private Map<String,String> compactionStrategyOptions; private Map<String,String> compressionOptions; private double mergeShardsChance; private String rowCacheProvider; private ByteBuffer keyAlias; private int rowCacheKeysToSave; public ThriftCfDef(CfDef d) { Assert.notNull(d, "CfDef is null"); keyspace = d.keyspace; name = d.name; columnType = ColumnType.getFromValue(d.column_type); comparatorType = ComparatorType.getByClassName(d.comparator_type); subComparatorType = ComparatorType.getByClassName(d.subcomparator_type); comment = d.comment; rowCacheSize = d.row_cache_size; rowCacheSavePeriodInSeconds = d.row_cache_save_period_in_seconds; keyCacheSize = d.key_cache_size; keyCacheSavePeriodInSeconds = d.key_cache_save_period_in_seconds; keyValidationClass = d.key_validation_class; readRepairChance = d.read_repair_chance; columnMetadata = ThriftColumnDef.fromThriftList(d.column_metadata); gcGraceSeconds = d.gc_grace_seconds; defaultValidationClass = d.default_validation_class; id = d.id; minCompactionThreshold = d.min_compaction_threshold == 0 ? CFMetaDataDefaults.DEFAULT_MIN_COMPACTION_THRESHOLD : d.min_compaction_threshold; maxCompactionThreshold = d.max_compaction_threshold == 0 ? CFMetaDataDefaults.DEFAULT_MAX_COMPACTION_THRESHOLD : d.max_compaction_threshold; replicateOnWrite = d.replicate_on_write; compactionStrategy = d.compaction_strategy; compactionStrategyOptions = d.compaction_strategy_options; compressionOptions = d.compression_options; mergeShardsChance = d.merge_shards_chance; rowCacheProvider = d.row_cache_provider; keyAlias = d.key_alias; rowCacheKeysToSave = d.row_cache_keys_to_save; } public ThriftCfDef(ColumnFamilyDefinition columnFamilyDefinition) { keyspace = columnFamilyDefinition.getKeyspaceName(); name = columnFamilyDefinition.getName(); columnType = columnFamilyDefinition.getColumnType(); comparatorType = columnFamilyDefinition.getComparatorType(); subComparatorType = columnFamilyDefinition.getSubComparatorType(); comparatorTypeAlias = columnFamilyDefinition.getComparatorTypeAlias(); subComparatorTypeAlias = columnFamilyDefinition.getSubComparatorTypeAlias(); comment = columnFamilyDefinition.getComment(); rowCacheSize = columnFamilyDefinition.getRowCacheSize(); rowCacheSavePeriodInSeconds = columnFamilyDefinition.getRowCacheSavePeriodInSeconds(); keyCacheSize = columnFamilyDefinition.getKeyCacheSize(); keyCacheSavePeriodInSeconds = columnFamilyDefinition.getKeyCacheSavePeriodInSeconds(); keyValidationClass = columnFamilyDefinition.getKeyValidationClass(); keyValidationAlias = columnFamilyDefinition.getKeyValidationAlias(); readRepairChance = columnFamilyDefinition.getReadRepairChance(); columnMetadata = columnFamilyDefinition.getColumnMetadata(); gcGraceSeconds = columnFamilyDefinition.getGcGraceSeconds(); defaultValidationClass = columnFamilyDefinition.getDefaultValidationClass(); id = columnFamilyDefinition.getId(); minCompactionThreshold = columnFamilyDefinition.getMinCompactionThreshold() == 0 ? CFMetaDataDefaults.DEFAULT_MIN_COMPACTION_THRESHOLD : columnFamilyDefinition.getMinCompactionThreshold(); maxCompactionThreshold = columnFamilyDefinition.getMaxCompactionThreshold() == 0 ? CFMetaDataDefaults.DEFAULT_MAX_COMPACTION_THRESHOLD : columnFamilyDefinition.getMaxCompactionThreshold(); memtableFlushAfterMins = columnFamilyDefinition.getMemtableFlushAfterMins() == 0 ? CFMetaDataDefaults.DEFAULT_MEMTABLE_LIFETIME_IN_MINS : columnFamilyDefinition.getMemtableFlushAfterMins(); memtableThroughputInMb = columnFamilyDefinition.getMemtableThroughputInMb() == 0 ? CFMetaDataDefaults.DEFAULT_MEMTABLE_THROUGHPUT_IN_MB : columnFamilyDefinition.getMemtableThroughputInMb(); memtableOperationsInMillions = columnFamilyDefinition.getMemtableOperationsInMillions() == 0 ? CFMetaDataDefaults.DEFAULT_MEMTABLE_OPERATIONS_IN_MILLIONS : columnFamilyDefinition.getMemtableOperationsInMillions(); replicateOnWrite = columnFamilyDefinition.isReplicateOnWrite(); compactionStrategy = columnFamilyDefinition.getCompactionStrategy(); compactionStrategyOptions = columnFamilyDefinition.getCompactionStrategyOptions(); compressionOptions = columnFamilyDefinition.getCompressionOptions(); mergeShardsChance = columnFamilyDefinition.getMergeShardsChance(); rowCacheProvider = columnFamilyDefinition.getRowCacheProvider(); keyAlias = columnFamilyDefinition.getKeyAlias(); rowCacheKeysToSave = columnFamilyDefinition.getRowCacheKeysToSave(); } public ThriftCfDef(String keyspace, String columnFamilyName) { this.keyspace = keyspace; name = columnFamilyName; columnMetadata = Collections.emptyList(); columnType = ColumnType.STANDARD; comparatorType = ComparatorType.BYTESTYPE; readRepairChance = CFMetaDataDefaults.DEFAULT_READ_REPAIR_CHANCE; keyCacheSize = CFMetaDataDefaults.DEFAULT_KEY_CACHE_SIZE; keyCacheSavePeriodInSeconds = CFMetaDataDefaults.DEFAULT_KEY_CACHE_SAVE_PERIOD_IN_SECONDS; gcGraceSeconds = CFMetaDataDefaults.DEFAULT_GC_GRACE_SECONDS; minCompactionThreshold = CFMetaDataDefaults.DEFAULT_MIN_COMPACTION_THRESHOLD; maxCompactionThreshold = CFMetaDataDefaults.DEFAULT_MAX_COMPACTION_THRESHOLD; memtableFlushAfterMins = CFMetaDataDefaults.DEFAULT_MEMTABLE_LIFETIME_IN_MINS; memtableThroughputInMb = CFMetaDataDefaults.DEFAULT_MEMTABLE_THROUGHPUT_IN_MB; memtableOperationsInMillions = CFMetaDataDefaults.DEFAULT_MEMTABLE_OPERATIONS_IN_MILLIONS; replicateOnWrite = CFMetaDataDefaults.DEFAULT_REPLICATE_ON_WRITE; } public ThriftCfDef(String keyspace, String columnFamilyName, ComparatorType comparatorType) { this(keyspace, columnFamilyName); if (comparatorType != null) { this.comparatorType = comparatorType; } } public ThriftCfDef(String keyspace, String columnFamilyName, ComparatorType comparatorType, List<ColumnDefinition> columnMetadata) { this(keyspace, columnFamilyName, comparatorType); if (columnMetadata != null) { this.columnMetadata = columnMetadata; } } public static List<ColumnFamilyDefinition> fromThriftList(List<CfDef> cfDefs) { if ((cfDefs == null) || cfDefs.isEmpty()) { return Collections.emptyList(); } List<ColumnFamilyDefinition> l = new ArrayList<ColumnFamilyDefinition>(cfDefs.size()); for (CfDef d: cfDefs) { l.add(new ThriftCfDef(d)); } return l; } @Override public String getKeyspaceName() { return keyspace; } @Override public String getName() { return name; } @Override public ColumnType getColumnType() { return columnType; } @Override public ComparatorType getComparatorType() { return comparatorType; } @Override public ComparatorType getSubComparatorType() { return subComparatorType; } public String getComparatorTypeAlias() { return this.comparatorTypeAlias; } public String getSubComparatorTypeAlias() { return this.subComparatorTypeAlias; } @Override public String getComment() { return comment; } @Override public double getRowCacheSize() { return rowCacheSize; } @Override public int getRowCacheSavePeriodInSeconds() { return rowCacheSavePeriodInSeconds; } @Override public double getKeyCacheSize() { return keyCacheSize; } @Override public double getReadRepairChance() { return readRepairChance; } @Override public List<ColumnDefinition> getColumnMetadata() { return columnMetadata; } @Override public int getGcGraceSeconds() { return gcGraceSeconds; } public static List<CfDef> toThriftList(List<ColumnFamilyDefinition> cfDefs) { if ((cfDefs == null) || cfDefs.isEmpty()) { return Collections.emptyList(); } List<CfDef> l = new ArrayList<CfDef>(cfDefs.size()); for (ColumnFamilyDefinition d: cfDefs) { l.add(((ThriftCfDef) d).toThrift()); } return l; } public CfDef toThrift() { CfDef d = new CfDef(keyspace, name); d.setColumn_metadata(ThriftColumnDef.toThriftList(columnMetadata)); d.setColumn_type(columnType.getValue()); d.setComment(comment); d.setComparator_type(comparatorType.getClassName() + comparatorTypeAlias); d.setDefault_validation_class(defaultValidationClass); d.setGc_grace_seconds(gcGraceSeconds); if ( id != 0) d.setId(id); d.setKey_cache_size(keyCacheSize); d.setKey_cache_save_period_in_seconds(keyCacheSavePeriodInSeconds); if(false || keyValidationClass != null) { d.setKey_validation_class(keyValidationClass + keyValidationAlias); } else { d.setKey_validation_class(keyValidationClass); } d.setMax_compaction_threshold(maxCompactionThreshold); d.setMin_compaction_threshold(minCompactionThreshold); d.setRead_repair_chance(readRepairChance); d.setRow_cache_size(rowCacheSize); d.setReplicate_on_write(replicateOnWrite); if (subComparatorType != null) { d.setSubcomparator_type(subComparatorType.getClassName() + subComparatorTypeAlias); } d.setCompaction_strategy(compactionStrategy); d.setCompaction_strategy_options(compactionStrategyOptions); d.setCompression_options(compressionOptions); d.setMerge_shards_chance(mergeShardsChance); d.setRow_cache_provider(rowCacheProvider); d.setKey_alias(keyAlias); d.setRow_cache_keys_to_save(rowCacheKeysToSave); return d; } @Override public String getDefaultValidationClass() { return defaultValidationClass; } @Override public String getKeyValidationClass(){ return keyValidationClass; } @Override public String getKeyValidationAlias() { return keyValidationAlias; } @Override public int getId() { return id; } @Override public int getMaxCompactionThreshold() { return maxCompactionThreshold; } @Override public int getMinCompactionThreshold() { return minCompactionThreshold; } public void setColumnType(ColumnType columnType) { this.columnType = columnType; } public void setComparatorType(ComparatorType comparatorType) { this.comparatorType = comparatorType; } public void setSubComparatorType(ComparatorType subComparatorType) { this.subComparatorType = subComparatorType; } public void setComparatorTypeAlias(String alias) { this.comparatorTypeAlias = alias; } public void setSubComparatorTypeAlias(String alias) { this.subComparatorTypeAlias = alias; } public void setComment(String comment) { this.comment = comment; } public void setRowCacheSize(double rowCacheSize) { this.rowCacheSize = rowCacheSize; } public void setRowCacheSavePeriodInSeconds(int rowCacheSavePeriodInSeconds) { this.rowCacheSavePeriodInSeconds = rowCacheSavePeriodInSeconds; } public void setKeyCacheSize(double keyCacheSize) { this.keyCacheSize = keyCacheSize; } public void setReadRepairChance(double readRepairChance) { this.readRepairChance = readRepairChance; } public void setColumnMetadata(List<ColumnDefinition> columnMetadata) { this.columnMetadata = columnMetadata; } @Override public void addColumnDefinition(ColumnDefinition columnDefinition) { if ( null == this.columnMetadata || this.columnMetadata.isEmpty()) { this.columnMetadata = new LinkedList<ColumnDefinition>(); } this.columnMetadata.add(columnDefinition); } public void setGcGraceSeconds(int gcGraceSeconds) { this.gcGraceSeconds = gcGraceSeconds; } public void setDefaultValidationClass(String defaultValidationClass) { this.defaultValidationClass = defaultValidationClass; } public void setKeyValidationClass(String keyValidationClass){ this.keyValidationClass = keyValidationClass; } public void setKeyValidationAlias(String keyValidationAlias) { this.keyValidationAlias = keyValidationAlias; } public void setId(int id) { this.id = id; } public void setMaxCompactionThreshold(int maxCompactionThreshold) { this.maxCompactionThreshold = maxCompactionThreshold; } public void setMinCompactionThreshold(int minCompactionThreshold) { this.minCompactionThreshold = minCompactionThreshold; } @Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); } @Override public int getMemtableFlushAfterMins() { return memtableFlushAfterMins; } @Override public double getMemtableOperationsInMillions() { return memtableOperationsInMillions; } @Override public int getMemtableThroughputInMb() { return memtableThroughputInMb; } @Override public int getKeyCacheSavePeriodInSeconds() { return keyCacheSavePeriodInSeconds; } public void setMemtableOperationsInMillions(double memtableOperationsInMillions) { this.memtableOperationsInMillions = memtableOperationsInMillions; } public void setMemtableThroughputInMb(int memtableThroughputInMb) { this.memtableThroughputInMb = memtableThroughputInMb; } public void setMemtableFlushAfterMins(int memtableFlushAfterMins) { this.memtableFlushAfterMins = memtableFlushAfterMins; } public void setKeyCacheSavePeriodInSeconds(int keyCacheSavePeriodInSeconds) { this.keyCacheSavePeriodInSeconds = keyCacheSavePeriodInSeconds; } @Override public boolean isReplicateOnWrite() { return replicateOnWrite; } @Override public void setReplicateOnWrite(boolean replicateOnWrite) { this.replicateOnWrite = replicateOnWrite; } @Override public void setKeyspaceName(String keyspaceName) { this.keyspace = keyspaceName; } @Override public void setName(String name) { this.name = name; } @Override public String getCompactionStrategy() { return this.compactionStrategy; } @Override public void setCompactionStrategy(String strategy) { this.compactionStrategy = strategy; } @Override public Map<String, String> getCompactionStrategyOptions() { return compactionStrategyOptions; } @Override public void setCompactionStrategyOptions(Map<String, String> compactionStrategyOptions) { this.compactionStrategyOptions = compactionStrategyOptions; } @Override public Map<String, String> getCompressionOptions() { return this.compressionOptions; } @Override public void setCompressionOptions(Map<String, String> compressionOptions) { this.compressionOptions = compressionOptions; } @Override public double getMergeShardsChance() { return mergeShardsChance; } @Override public void setMergeShardsChance(double mergeShardsChance) { this.mergeShardsChance = mergeShardsChance; } @Override public String getRowCacheProvider() { return rowCacheProvider; } @Override public void setRowCacheProvider(String rowCacheProvider) { this.rowCacheProvider = rowCacheProvider; } @Override public ByteBuffer getKeyAlias() { return keyAlias; } @Override public void setKeyAlias(ByteBuffer keyAlias) { this.keyAlias = keyAlias; } @Override public int getRowCacheKeysToSave() { return rowCacheKeysToSave; } @Override public void setRowCacheKeysToSave(int rowCacheKeysToSave) { this.rowCacheKeysToSave = rowCacheKeysToSave; } }