package cassandra.metadata;
import cassandra.cql.Row;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class TableMetadata extends MetadataEntity {
private Metadata metadata;
private String keyspace;
private String name;
private double bloomFilterFpChance;
private String caching;
private List<String> columnAliases;
private String comment;
private String compactionStrategyClass;
private Map<String, String> compactionStrategyOptions;
private String comparatorClass;
private Map<String, String> compressionParameters;
private int defaultTimeToLive;
private String defaultValidator;
private Map<String, Long> droppedColumns;
private int gcGraceSeconds;
private int indexInterval;
private List<String> keyAliases;
private String keyValidatorClass;
private double localReadRepairChance;
private int maxCompactionThreshold;
private int memtableFlushPeriodInMs;
private int minCompactionThreshold;
private boolean populateIOCacheOnFlush;
private double readRepairChance;
private boolean replicateOnWrite;
private String speculativeRetry;
private String subcomparator;
private String type;
private String valueAlias;
private List<ColumnMetadata> partitionKeyList, clusteringKeyList;
private ComparatorOrValidator comparator, keyValidator;
public static class Builder {
protected Metadata metadata;
protected String keyspace;
protected String name;
protected double bloomFilterFpChance;
protected String caching;
protected List<String> columnAliases;
protected String comment;
protected String compactionStrategyClass;
protected Map<String, String> compactionStrategyOptions;
protected String comparatorClass;
protected Map<String, String> compressionParameters;
protected int defaultTimeToLive;
protected String defaultValidator;
protected Map<String, Long> droppedColumns;
protected int gcGraceSeconds;
protected int indexInterval;
protected List<String> keyAliases;
protected String keyValidatorClass;
protected double localReadRepairChance;
protected int maxCompactionThreshold;
protected int memtableFlushPeriodInMs;
protected int minCompactionThreshold;
protected boolean populateIOCacheOnFlush;
protected double readRepairChance;
protected boolean replicateOnWrite;
protected String speculativeRetry;
protected String subcomparator;
protected String type;
protected String valueAlias;
public Builder setMetadata(Metadata metadata) {
this.metadata = metadata;
return this;
}
public Builder setKeyspace(String keyspace) {
this.keyspace = keyspace;
return this;
}
public Builder setName(String name) {
this.name = name;
return this;
}
public Builder setBloomFilterFpChance(double bloomFilterFpChance) {
this.bloomFilterFpChance = bloomFilterFpChance;
return this;
}
public Builder setCaching(String caching) {
this.caching = caching;
return this;
}
public Builder setColumnAliases(List<String> columnAliases) {
this.columnAliases = columnAliases;
return this;
}
public Builder setComment(String comment) {
this.comment = comment;
return this;
}
public Builder setCompactionStrategyClass(String compactionStrategyClass) {
this.compactionStrategyClass = compactionStrategyClass;
return this;
}
public Builder setCompactionStrategyOptions(Map<String, String> compactionStrategyOptions) {
this.compactionStrategyOptions = compactionStrategyOptions;
return this;
}
public Builder setComparatorClass(String comparatorClass) {
this.comparatorClass = comparatorClass;
return this;
}
public Builder setCompressionParameters(Map<String, String> compressionParameters) {
this.compressionParameters = compressionParameters;
return this;
}
public Builder setDefaultTimeToLive(int defaultTimeToLive) {
this.defaultTimeToLive = defaultTimeToLive;
return this;
}
public Builder setDefaultValidator(String defaultValidator) {
this.defaultValidator = defaultValidator;
return this;
}
public Builder setDroppedColumns(Map<String, Long> droppedColumns) {
this.droppedColumns = droppedColumns;
return this;
}
public Builder setGcGraceSeconds(int gcGraceSeconds) {
this.gcGraceSeconds = gcGraceSeconds;
return this;
}
public Builder setIndexInterval(int indexInterval) {
this.indexInterval = indexInterval;
return this;
}
public Builder setKeyAliases(List<String> keyAliases) {
this.keyAliases = keyAliases;
return this;
}
public Builder setKeyValidatorClass(String keyValidatorClass) {
this.keyValidatorClass = keyValidatorClass;
return this;
}
public Builder setLocalReadRepairChance(double localReadRepairChance) {
this.localReadRepairChance = localReadRepairChance;
return this;
}
public Builder setMaxCompactionThreshold(int maxCompactionThreshold) {
this.maxCompactionThreshold = maxCompactionThreshold;
return this;
}
public Builder setMemtableFlushPeriodInMs(int memtableFlushPeriodInMs) {
this.memtableFlushPeriodInMs = memtableFlushPeriodInMs;
return this;
}
public Builder setMinCompactionThreshold(int minCompactionThreshold) {
this.minCompactionThreshold = minCompactionThreshold;
return this;
}
public Builder setPopulateIOCacheOnFlush(boolean populateIOCacheOnFlush) {
this.populateIOCacheOnFlush = populateIOCacheOnFlush;
return this;
}
public Builder setReadRepairChance(double readRepairChance) {
this.readRepairChance = readRepairChance;
return this;
}
public Builder setReplicateOnWrite(boolean replicateOnWrite) {
this.replicateOnWrite = replicateOnWrite;
return this;
}
public Builder setSpeculativeRetry(String speculativeRetry) {
this.speculativeRetry = speculativeRetry;
return this;
}
public Builder setSubcomparator(String subcomparator) {
this.subcomparator = subcomparator;
return this;
}
public Builder setType(String type) {
this.type = type;
return this;
}
public Builder setValueAlias(String valueAlias) {
this.valueAlias = valueAlias;
return this;
}
public Builder mergeFrom(Metadata metadata, Row row) {
setMetadata(metadata);
setKeyspace(row.getString("keyspace_name"));
setName(row.getString("columnfamily_name"));
setBloomFilterFpChance(row.getDouble("bloom_filter_fp_chance", 0.01D));
setCaching(row.getString("caching", "KEYS_ONLY"));
setColumnAliases(MetadataService.convertAsList(row.getString("column_aliases"), String.class));
setComment(row.getString("comment", ""));
setCompactionStrategyClass(row.getString("compaction_strategy_class"));
setCompactionStrategyOptions(MetadataService.convertAsMap(row.getString("compaction_strategy_options"), String.class, String.class));
setComparatorClass(row.getString("comparator"));
setCompressionParameters(MetadataService.convertAsMap(row.getString("compression_parameters"), String.class, String.class));
setDefaultTimeToLive(row.getInt("default_time_to_live"));
setDefaultValidator(row.getString("default_validator"));
setDroppedColumns(row.getMap("dropped_columns", String.class, Long.class, null));
setGcGraceSeconds(row.getInt("gc_grace_seconds"));
setIndexInterval(row.getInt("index_interval", 128));
setKeyAliases(MetadataService.convertAsList(row.getString("key_aliases"), String.class));
setKeyValidatorClass(row.getString("key_validator"));
setLocalReadRepairChance(row.getDouble("local_read_repair_chance"));
setMaxCompactionThreshold(row.getInt("max_compaction_threshold"));
setMinCompactionThreshold(row.getInt("memtable_flush_period_in_ms"));
setMemtableFlushPeriodInMs(row.getInt("min_compaction_threshold"));
setPopulateIOCacheOnFlush(row.getBool("populate_io_cache_on_flush"));
setReadRepairChance(row.getDouble("read_repair_chance"));
setReplicateOnWrite(row.getBool("replicate_on_write"));
setSpeculativeRetry(row.getString("speculative_retry", "NONE"));
setSubcomparator(row.getString("subcomparator"));
setType(row.getString("type"));
setValueAlias(row.getString("value_alias"));
return this;
}
public Builder mergeFrom(TableMetadata table) {
setMetadata(table.metadata);
setKeyspace(table.keyspace);
setName(table.name);
setBloomFilterFpChance(table.bloomFilterFpChance);
setCaching(table.caching);
setColumnAliases(table.columnAliases);
setComment(table.comment);
setCompactionStrategyClass(table.compactionStrategyClass);
setCompactionStrategyOptions(table.compactionStrategyOptions);
setComparatorClass(table.comparatorClass);
setCompressionParameters(table.compressionParameters);
setDefaultTimeToLive(table.defaultTimeToLive);
setDefaultValidator(table.defaultValidator);
setDroppedColumns(table.droppedColumns);
setGcGraceSeconds(table.gcGraceSeconds);
setIndexInterval(table.indexInterval);
setKeyAliases(table.keyAliases);
setKeyValidatorClass(table.keyValidatorClass);
setLocalReadRepairChance(table.localReadRepairChance);
setMaxCompactionThreshold(table.maxCompactionThreshold);
setMinCompactionThreshold(table.minCompactionThreshold);
setMemtableFlushPeriodInMs(table.memtableFlushPeriodInMs);
setPopulateIOCacheOnFlush(table.populateIOCacheOnFlush);
setReadRepairChance(table.readRepairChance);
setReplicateOnWrite(table.replicateOnWrite);
setSpeculativeRetry(table.speculativeRetry);
setSubcomparator(table.subcomparator);
setType(table.type);
setValueAlias(table.valueAlias);
return this;
}
public TableMetadata build() {
return new TableMetadata(this);
}
}
public static Builder newBuilder() {
return new Builder();
}
public TableMetadata(Builder builder) {
metadata = builder.metadata;
keyspace = builder.keyspace;
name = builder.name;
bloomFilterFpChance = builder.bloomFilterFpChance;
caching = builder.caching;
columnAliases = Collections.unmodifiableList(builder.columnAliases);
comment = builder.comment;
compactionStrategyClass = builder.compactionStrategyClass;
compactionStrategyOptions = Collections.unmodifiableMap(builder.compactionStrategyOptions);
comparatorClass = builder.comparatorClass;
compressionParameters = Collections.unmodifiableMap(builder.compressionParameters);
defaultTimeToLive = builder.defaultTimeToLive;
defaultValidator = builder.defaultValidator;
if (builder.droppedColumns != null) {
droppedColumns = Collections.unmodifiableMap(builder.droppedColumns);
}
gcGraceSeconds = builder.gcGraceSeconds;
indexInterval = builder.indexInterval;
keyAliases = Collections.unmodifiableList(builder.keyAliases);
keyValidatorClass = builder.keyValidatorClass;
localReadRepairChance = builder.localReadRepairChance;
maxCompactionThreshold = builder.maxCompactionThreshold;
minCompactionThreshold = builder.minCompactionThreshold;
memtableFlushPeriodInMs = builder.memtableFlushPeriodInMs;
populateIOCacheOnFlush = builder.populateIOCacheOnFlush;
readRepairChance = builder.readRepairChance;
replicateOnWrite = builder.replicateOnWrite;
speculativeRetry = builder.speculativeRetry;
subcomparator = builder.subcomparator;
type = builder.type;
valueAlias = builder.valueAlias;
comparator = new ComparatorOrValidator(comparatorClass);
keyValidator = new ComparatorOrValidator(keyValidatorClass);
}
@JsonIgnore
public Metadata getMetadata() {
return metadata;
}
@JsonProperty("keyspace_name")
public String getKeyspaceName() {
return keyspace;
}
@JsonIgnore
public KeyspaceMetadata getKeyspace() {
return metadata.getKeyspace(keyspace);
}
@JsonProperty("columnfamily_name")
public String getName() {
return name;
}
public double getBloomFilterFpChance() {
return bloomFilterFpChance;
}
public String getCaching() {
return caching;
}
public List<String> getColumnAliases() {
return columnAliases;
}
public String getComment() {
return comment;
}
public String getCompactionStrategyClass() {
return compactionStrategyClass;
}
public Map<String, String> getCompactionStrategyOptions() {
return compactionStrategyOptions;
}
@JsonProperty("comparator")
public String getComparatorClass() {
return comparatorClass;
}
@JsonIgnore
public ComparatorOrValidator getComparator() {
return comparator;
}
public Map<String, String> getCompressionParameters() {
return compressionParameters;
}
public int getDefaultTimeToLive() {
return defaultTimeToLive;
}
public String getDefaultValidator() {
return defaultValidator;
}
public Map<String, Long> getDroppedColumns() {
return droppedColumns;
}
public int getGcGraceSeconds() {
return gcGraceSeconds;
}
public int getIndexInterval() {
return indexInterval;
}
public List<String> getKeyAliases() {
return keyAliases;
}
@JsonProperty("key_validator")
public String getKeyValidatorClass() {
return keyValidatorClass;
}
@JsonIgnore
public ComparatorOrValidator getKeyValidator() {
return keyValidator;
}
public double getLocalReadRepairChance() {
return localReadRepairChance;
}
public int getMaxCompactionThreshold() {
return maxCompactionThreshold;
}
public int getMemtableFlushPeriodInMs() {
return memtableFlushPeriodInMs;
}
public int getMinCompactionThreshold() {
return minCompactionThreshold;
}
public boolean isPopulateIOCacheOnFlush() {
return populateIOCacheOnFlush;
}
public double getReadRepairChance() {
return readRepairChance;
}
public boolean isReplicateOnWrite() {
return replicateOnWrite;
}
public String getSpeculativeRetry() {
return speculativeRetry;
}
public String getSubcomparator() {
return subcomparator;
}
public String getType() {
return type;
}
public String getValueAlias() {
return valueAlias;
}
@JsonIgnore
public List<ColumnMetadata> getColumns() {
return metadata.getColumns(keyspace, name);
}
@JsonIgnore
public boolean hasColumn(String column) {
return metadata.hasColumn(keyspace, name, column);
}
@JsonIgnore
public ColumnMetadata getColumn(String column) {
return metadata.getColumn(keyspace, name, column);
}
@JsonIgnore
public List<ColumnMetadata> getPrimaryKey() {
List<ColumnMetadata> partitionKey = getPartitionKey();
List<ColumnMetadata> clusteringKey = getClusteringKey();
if (partitionKey.isEmpty() && clusteringKey.isEmpty()) {
return Collections.emptyList();
}
List<ColumnMetadata> primaryKey = new ArrayList<ColumnMetadata>(partitionKey.size() + clusteringKey.size());
primaryKey.addAll(partitionKey);
primaryKey.addAll(clusteringKey);
return primaryKey;
}
@JsonIgnore
public List<ColumnMetadata> getPartitionKey() {
List<ColumnMetadata> columns = getColumns();
if (partitionKeyList == null && !columns.isEmpty()) {
partitionKeyList = new ArrayList<ColumnMetadata>();
for (ColumnMetadata column : columns) {
if (column.isPartitionKey()) {
partitionKeyList.add(column);
}
}
}
if (partitionKeyList == null) {
return Collections.emptyList();
}
return Collections.unmodifiableList(partitionKeyList);
}
@JsonIgnore
public List<ColumnMetadata> getClusteringKey() {
List<ColumnMetadata> columns = getColumns();
if (clusteringKeyList == null && !columns.isEmpty()) {
clusteringKeyList = new ArrayList<ColumnMetadata>();
for (ColumnMetadata column : columns) {
if (column.isClusteringKey()) {
clusteringKeyList.add(column);
}
}
}
if (clusteringKeyList == null) {
return Collections.emptyList();
}
return Collections.unmodifiableList(clusteringKeyList);
}
}