package com.taobao.tddl.executor.handler; import java.util.ArrayList; import java.util.List; import com.taobao.tddl.common.exception.TddlException; import com.taobao.tddl.common.utils.GeneralUtil; import com.taobao.tddl.executor.codec.CodecFactory; import com.taobao.tddl.executor.common.ExecutionContext; import com.taobao.tddl.executor.common.ExecutorContext; import com.taobao.tddl.executor.cursor.ISchematicCursor; 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.plan.IPut; import com.taobao.tddl.optimizer.core.plan.IPut.PUT_TYPE; public class DeleteHandler extends PutHandlerCommon { public DeleteHandler(){ super(); } @SuppressWarnings("rawtypes") @Override protected int executePut(ExecutionContext executionContext, IPut put, ITable table, IndexMeta meta) throws Exception { ITransaction transaction = executionContext.getTransaction(); int affect_rows = 0; IPut delete = put; ISchematicCursor conditionCursor = null; IRowSet rowSet = null; CloneableRecord key = CodecFactory.getInstance(CodecFactory.FIXED_LENGTH) .getCodec(meta.getKeyColumns()) .newEmptyRecord(); try { conditionCursor = ExecutorContext.getContext() .getTopologyExecutor() .execByExecPlanNode(delete.getQueryTree(), executionContext); while ((rowSet = conditionCursor.next()) != null) { affect_rows++; for (ColumnMeta cm : meta.getKeyColumns()) { Object val = getValByColumnMeta(rowSet, cm); key.put(cm.getName(), val); } // CloneableRecord key = // ExecUtils.convertToClonableRecord(rowSet); prepare(transaction, table, rowSet, null, null, PUT_TYPE.DELETE); table.delete(executionContext, key, meta, put.getTableName()); } } catch (Exception e) { throw e; } finally { if (conditionCursor != null) { List<TddlException> exs = new ArrayList(); exs = conditionCursor.close(exs); if (!exs.isEmpty()) { throw GeneralUtil.mergeException(exs); } } } return affect_rows; } private Object getValByColumnMeta(IRowSet kv, ColumnMeta cm) { Object val = ExecUtils.getValueByTableAndName(kv, cm.getTableName(), cm.getName()); return val; } }