package com.taobao.yugong.applier; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import com.google.common.collect.Lists; import com.taobao.yugong.common.db.meta.ColumnMeta; import com.taobao.yugong.common.db.meta.ColumnValue; import com.taobao.yugong.common.db.meta.Table; import com.taobao.yugong.common.lifecycle.AbstractYuGongLifeCycle; import com.taobao.yugong.common.model.record.Record; import com.taobao.yugong.exception.YuGongException; /** * @author agapple 2014年2月25日 下午11:38:06 * @since 1.0.0 */ public abstract class AbstractRecordApplier extends AbstractYuGongLifeCycle implements RecordApplier { public static class TableSqlUnit { public String applierSql; public Map<String, Integer> applierIndexs; } protected Integer getIndex(final Map<String, Integer> indexs, ColumnValue cv) { return getIndex(indexs, cv, false); } protected Integer getIndex(final Map<String, Integer> indexs, ColumnValue cv, boolean notExistReturnNull) { Integer result = indexs.get(cv.getColumn().getName()); if (result == null && !notExistReturnNull) { throw new YuGongException("not found column[" + cv.getColumn().getName() + "] in record"); } else { return result; } } /** * 检查下是否存在必要的字段 */ protected void checkColumns(Table meta, Map<String, Integer> indexs) { Set<String> idx = new HashSet<String>(); for (ColumnMeta column : meta.getColumns()) { idx.add(column.getName()); } for (ColumnMeta column : meta.getPrimaryKeys()) { idx.add(column.getName()); } for (String key : indexs.keySet()) { if (!idx.contains(key)) { throw new YuGongException("not found column[" + key + "] in target db"); } } } protected void checkColumnsWithoutPk(Table meta, Map<String, Integer> indexs) { Set<String> idx = new HashSet<String>(); for (ColumnMeta column : meta.getColumns()) { idx.add(column.getName()); } for (String key : indexs.keySet()) { if (!idx.contains(key)) { throw new YuGongException("not found column[" + key + "] in target db"); } } } /** * 获取主键字段信息 */ protected List<ColumnMeta> getPrimaryMetas(Record record) { List<ColumnMeta> result = Lists.newArrayList(); for (ColumnValue col : record.getPrimaryKeys()) { result.add(col.getColumn()); } return result; } /** * 获取普通列字段信息 */ protected List<ColumnMeta> getColumnMetas(Record record) { List<ColumnMeta> result = Lists.newArrayList(); for (ColumnValue col : record.getColumns()) { result.add(col.getColumn()); } return result; } /** * 获取主键字段信息 */ protected String[] getPrimaryNames(Record record) { String[] result = new String[record.getPrimaryKeys().size()]; int i = 0; for (ColumnValue col : record.getPrimaryKeys()) { result[i++] = col.getColumn().getName(); } return result; } /** * 获取主键字段信息,从Table元数据中获取。因为物化视图由with primary 改为with (shardkey) * * @param record * @return */ protected String[] getPrimaryNames(Table tableMeta) { String[] result = new String[tableMeta.getPrimaryKeys().size()]; int i = 0; for (ColumnMeta col : tableMeta.getPrimaryKeys()) { result[i++] = col.getName(); } return result; } /** * 获取普通列字段信息 */ protected String[] getColumnNames(Record record) { String[] result = new String[record.getColumns().size()]; int i = 0; for (ColumnValue col : record.getColumns()) { result[i++] = col.getColumn().getName(); } return result; } }