package com.taobao.tddl.optimizer.core.ast.dml;
import java.util.List;
import com.taobao.tddl.optimizer.core.ASTNodeFactory;
import com.taobao.tddl.optimizer.core.ast.DMLNode;
import com.taobao.tddl.optimizer.core.ast.query.KVIndexNode;
import com.taobao.tddl.optimizer.core.ast.query.TableNode;
import com.taobao.tddl.optimizer.core.expression.ISelectable;
import com.taobao.tddl.optimizer.core.plan.IDataNodeExecutor;
import com.taobao.tddl.optimizer.core.plan.dml.IUpdate;
import com.taobao.tddl.optimizer.exceptions.QueryException;
public class UpdateNode extends DMLNode<UpdateNode> {
public UpdateNode(TableNode table){
super(table);
}
public UpdateNode setUpdateColumns(List<ISelectable> columns) {
this.columns = columns;
return this;
}
public List<ISelectable> getUpdateColumns() {
return this.columns;
}
public UpdateNode setUpdateValues(List<Object> values) {
this.values = values;
return this;
}
public List<Object> getUpdateValues() {
return this.values;
}
@Override
public IDataNodeExecutor toDataNodeExecutor() throws QueryException {
IUpdate update = ASTNodeFactory.getInstance().createUpdate();
for (ISelectable updateColumn : this.getColumns()) {
if (this.getNode().getTableMeta().getPrimaryIndex().getPartitionColumns().contains(updateColumn)) {
throw new IllegalArgumentException("column :" + updateColumn.getColumnName() + " 是分库键,不允许修改");
}
if (this.getNode().getTableMeta().getPrimaryKeyMap().containsKey(updateColumn.getColumnName())) {
throw new IllegalArgumentException("column :" + updateColumn.getColumnName() + " 是主键,不允许修改");
}
}
update.setConsistent(true);
update.executeOn(this.getNode().getDataNode());
update.setQueryTree(this.getNode().toDataNodeExecutor());
update.setUpdateColumns(this.getUpdateColumns());
update.setUpdateValues(values);
if (this.getNode().getActualTableName() != null) {
update.setTableName(this.getNode().getActualTableName());
} else if (this.getNode() instanceof KVIndexNode) {
update.setTableName(((KVIndexNode) this.getNode()).getIndexName());
} else {
update.setTableName(this.getNode().getTableName());
}
update.setIndexName(this.getNode().getIndexUsed().getName());
return update;
}
@Override
public UpdateNode deepCopy() {
UpdateNode delete = new UpdateNode(null);
super.deepCopySelfTo(delete);
return delete;
}
@Override
public UpdateNode copy() {
UpdateNode delete = new UpdateNode(null);
super.copySelfTo(delete);
return delete;
}
}