package com.taobao.tddl.executor.handler;
import java.util.List;
import com.taobao.tddl.common.exception.TddlException;
import com.taobao.tddl.common.utils.ExceptionErrorCodeUtils;
import com.taobao.tddl.executor.codec.CodecFactory;
import com.taobao.tddl.executor.common.ExecutionContext;
import com.taobao.tddl.executor.function.ExtraFunction;
import com.taobao.tddl.executor.record.CloneableRecord;
import com.taobao.tddl.executor.rowset.IRowSet;
import com.taobao.tddl.executor.spi.ITable;
import com.taobao.tddl.executor.spi.ITransaction;
import com.taobao.tddl.executor.utils.ExecUtils;
import com.taobao.tddl.optimizer.config.table.ColumnMeta;
import com.taobao.tddl.optimizer.config.table.IndexMeta;
import com.taobao.tddl.optimizer.core.expression.IFunction;
import com.taobao.tddl.optimizer.core.plan.IPut;
import com.taobao.tddl.optimizer.core.plan.IPut.PUT_TYPE;
public class InsertHandler extends PutHandlerCommon {
public InsertHandler(){
super();
}
@SuppressWarnings("rawtypes")
@Override
protected int executePut(ExecutionContext executionContext, IPut put, ITable table, IndexMeta meta)
throws TddlException {
ITransaction transaction = executionContext.getTransaction();
int affect_rows = 0;
IPut insert = (IPut) put;
CloneableRecord key = CodecFactory.getInstance(CodecFactory.FIXED_LENGTH)
.getCodec(meta.getKeyColumns())
.newEmptyRecord();
CloneableRecord value = CodecFactory.getInstance(CodecFactory.FIXED_LENGTH)
.getCodec(meta.getValueColumns())
.newEmptyRecord();
List columns = insert.getUpdateColumns();
L: for (int i = 0; i < columns.size(); i++) {
for (ColumnMeta cm : meta.getKeyColumns()) {
if (cm.getName().equals(ExecUtils.getColumn(columns.get(i)).getColumnName())) {
Object v = insert.getUpdateValues().get(i);
if (v instanceof IFunction) {
IFunction func = ((IFunction) v);
((ExtraFunction) func.getExtraFunction()).serverMap((IRowSet) null);
v = func.getExtraFunction().getResult();
}
key.put(cm.getName(), v);
continue L;
}
}
for (ColumnMeta cm : meta.getValueColumns()) {
if (cm.getName().equals(ExecUtils.getColumn(columns.get(i)).getColumnName())) {
Object v = insert.getUpdateValues().get(i);
if (v instanceof IFunction) {
IFunction func = ((IFunction) v);
((ExtraFunction) func.getExtraFunction()).serverMap((IRowSet) null);
v = func.getExtraFunction().getResult();
}
value.put(cm.getName(), v);
break;
}
}
}
if (put.getPutType() == IPut.PUT_TYPE.INSERT) {
CloneableRecord value1 = table.get(executionContext, key, meta, put.getTableName());
if (value1 != null) {
throw new TddlException(ExceptionErrorCodeUtils.Duplicate_entry, "exception insert existed :" + key);
}
}
prepare(transaction, table, null, key, value, PUT_TYPE.INSERT);
table.put(executionContext, key, value, meta, put.getTableName());
affect_rows++;
return affect_rows;
}
}