package com.taobao.tddl.optimizer.config.table;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.builder.ToStringBuilder;
import com.taobao.tddl.common.utils.TddlToStringStyle;
/**
* 一个table的描述,包含主键信息/字段信息/索引信息等,暂时不考虑外键/约束键,目前没意义
*
* @author jianxing <jianxing.qx@taobao.com>
* @author whisper
*/
public class TableMeta implements Serializable, Cloneable {
private static final long serialVersionUID = 5168519373619656091L;
/**
* 表名
*/
private final String tableName;
/**
* 主键索引描述
*/
private final Map<String/* indexName */, IndexMeta> primaryIndexes = new HashMap<String, IndexMeta>(4);
/**
* 二级索引描述
*/
private final Map<String/* index Name */, IndexMeta> secondaryIndexes = new HashMap<String, IndexMeta>(8);
private final Map<String, ColumnMeta> primaryKeys = new HashMap<String, ColumnMeta>();
private final Map<String, ColumnMeta> columns = new HashMap<String, ColumnMeta>();
private final Map<String, ColumnMeta> allColumns = new HashMap<String, ColumnMeta>();
private final List<ColumnMeta> allColumnsOrderByDefined = new LinkedList<ColumnMeta>();
private boolean temp = false;
private boolean sortedDuplicates = true;
public TableMeta(String tableName, List<ColumnMeta> allColumnsOrderByDefined, IndexMeta primaryIndex,
List<IndexMeta> secondaryIndexes){
this.tableName = tableName;
if (primaryIndex != null) {
this.primaryIndexes.put(primaryIndex.getName(), primaryIndex);
}
if (secondaryIndexes != null) {
for (IndexMeta one : secondaryIndexes) {
this.secondaryIndexes.put(one.getName(), one);
}
}
this.allColumnsOrderByDefined.addAll(allColumnsOrderByDefined);
for (ColumnMeta c : primaryIndex.getKeyColumns()) {
this.primaryKeys.put(c.getName(), c);
this.allColumns.put(c.getName(), c);
}
for (ColumnMeta c : primaryIndex.getValueColumns()) {
this.columns.put(c.getName(), c);
this.allColumns.put(c.getName(), c);
}
}
public IndexMeta getPrimaryIndex() {
return primaryIndexes == null ? null : primaryIndexes.values().iterator().next();
}
public List<IndexMeta> getSecondaryIndexes() {
return new ArrayList(secondaryIndexes.values());
}
public Map<String, IndexMeta> getSecondaryIndexesMap() {
return secondaryIndexes;
}
public String getTableName() {
return tableName;
}
public Collection<ColumnMeta> getPrimaryKey() {
return primaryKeys.values();
}
public Collection<ColumnMeta> getColumns() {
return columns.values();
}
public Map<String, ColumnMeta> getPrimaryKeyMap() {
return this.primaryKeys;
}
public Collection<ColumnMeta> getAllColumns() {
return allColumnsOrderByDefined;
}
public IndexMeta getIndexMeta(String indexName) {
IndexMeta retMeta = primaryIndexes.get(indexName);
if (retMeta != null) {
return retMeta;
}
retMeta = secondaryIndexes.get(indexName);
return retMeta;
}
public List<IndexMeta> getIndexs() {
List<IndexMeta> indexs = new ArrayList<IndexMeta>();
indexs.add(this.getPrimaryIndex());
indexs.addAll(this.getSecondaryIndexes());
return indexs;
}
public ColumnMeta getColumn(String name) {
if (name.contains(".")) {
return allColumns.get(name.split("\\.")[1]); // 避免转义
}
return allColumns.get(name);
}
public String toString() {
return ToStringBuilder.reflectionToString(this, TddlToStringStyle.DEFAULT_STYLE);
}
public void setTmp(boolean b) {
this.temp = b;
}
public boolean isTmp() {
return this.temp;
}
public void setSortedDuplicates(boolean sortedDuplicates) {
this.sortedDuplicates = sortedDuplicates;
}
public boolean issortedDuplicates() {
return sortedDuplicates;
}
}