package com.taobao.yugong.translator;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import com.taobao.yugong.common.db.meta.ColumnValue;
import com.taobao.yugong.common.model.record.Record;
/**
* 常见的转换工具类
*
* @author agapple 2016年6月7日 上午12:31:13
* @since 1.0.3
*/
public class TableTranslators {
public static ColumnTranslator newColumnTranslator() {
return new ColumnTranslator();
}
public static interface TableTranslator {
public Record translator(Record record);
}
public static class ColumnTranslator implements TableTranslator {
protected Collection<String> includeColumns = new HashSet<String>();
protected Collection<String> excludeColumns = new HashSet<String>();
protected Collection<String> checked = new HashSet<String>();
protected Collection<String> notChecked = new HashSet<String>();
protected Map<String, Set<String>> columnAlias = new HashMap<String, Set<String>>();
public ColumnTranslator(){
}
/**
* 包含的同步列
*/
public ColumnTranslator include(String... columns) {
for (String column : columns) {
includeColumns.add(StringUtils.upperCase(column));
}
return this;
}
/**
* 排除的同步列
*/
public ColumnTranslator exclude(String... columns) {
for (String column : columns) {
excludeColumns.add(StringUtils.upperCase(column));
}
return this;
}
/**
* 需要检查的字段
*/
public ColumnTranslator check(String... columns) {
for (String column : columns) {
checked.add(StringUtils.upperCase(column));
}
return this;
}
/**
* 不需要检查的字段
*/
public ColumnTranslator notCheck(String... columns) {
for (String column : columns) {
notChecked.add(StringUtils.upperCase(column));
}
return this;
}
/**
* 别名定义
*/
public ColumnTranslator alias(String srcColumn, String targetColumn) {
String sourceColumn = StringUtils.upperCase(srcColumn);
Set<String> targetColumnSet = columnAlias.get(sourceColumn);
if (targetColumnSet == null) {
targetColumnSet = new HashSet<String>(2);
columnAlias.put(sourceColumn, targetColumnSet);
}
targetColumnSet.add(StringUtils.upperCase(targetColumn));
return this;
}
public Record translator(Record record) {
if (excludeColumns != null && !excludeColumns.isEmpty()) {
// 处理列排除
for (String excludeColumn : excludeColumns) {
record.removeColumnByName(excludeColumn);
}
}
if (includeColumns != null && !includeColumns.isEmpty()) {
// 检查一下所有列是否存在
for (String name : includeColumns) {
record.getColumnByName(name);
}
// 删除掉不需要的列
List<ColumnValue> pks = record.getPrimaryKeys();
List<ColumnValue> columns = record.getColumns();
Set<String> allColumns = new HashSet<String>();
for (ColumnValue pk : pks) {
allColumns.add(StringUtils.upperCase(pk.getColumn().getName()));
}
for (ColumnValue column : columns) {
allColumns.add(StringUtils.upperCase(column.getColumn().getName()));
}
allColumns.removeAll(includeColumns);
for (String name : allColumns) {
record.removeColumnByName(name);
}
}
if (notChecked != null && !notChecked.isEmpty()) {
// 处理不检查列
for (String notCheckColumn : notChecked) {
ColumnValue column = record.getColumnByName(notCheckColumn);
if (column != null) {
column.setCheck(false);
}
}
}
if (checked != null && !checked.isEmpty()) {
// 处理检查列
for (String checkColumn : checked) {
ColumnValue column = record.getColumnByName(checkColumn);
if (column != null) {
column.setCheck(true);
}
}
}
if (columnAlias != null && !columnAlias.isEmpty()) {
for (Map.Entry<String, Set<String>> entry : columnAlias.entrySet()) {
String srcColumn = entry.getKey();
Set<String> targetColumns = entry.getValue();
ColumnValue column = record.getColumnByName(srcColumn);
if (column != null && targetColumns.size() >= 1) {
Iterator<String> iter = targetColumns.iterator();
String columnName = iter.next();
column.getColumn().setName(columnName);
if (iter.hasNext()) {
ColumnValue newColumn = column.clone();
newColumn.getColumn().setName(iter.next());
record.addColumn(newColumn);
}
}
}
}
return record;
}
}
}