package com.taobao.tddl.optimizer.parse.cobar.visitor;
import java.util.List;
import com.alibaba.cobar.parser.ast.expression.primary.Identifier;
import com.alibaba.cobar.parser.ast.expression.primary.RowExpression;
import com.alibaba.cobar.parser.ast.stmt.dml.DMLReplaceStatement;
import com.alibaba.cobar.parser.visitor.EmptySQLASTVisitor;
import com.taobao.tddl.common.exception.NotSupportException;
import com.taobao.tddl.optimizer.core.ast.dml.PutNode;
import com.taobao.tddl.optimizer.core.ast.query.TableNode;
/**
* replace处理
*
* @since 5.0.0
*/
public class MySqlReplaceIntoVisitor extends EmptySQLASTVisitor {
private PutNode replaceNode;
public void visit(DMLReplaceStatement node) {
TableNode table = getTableNode(node);
String insertColumns = this.getInsertColumnsStr(node);
List<RowExpression> exprList = node.getRowList();
if (exprList != null && exprList.size() == 1) {
RowExpression expr = exprList.get(0);
Comparable[] iv = getRowValue(expr);
this.replaceNode = table.put(insertColumns, iv);
} else {
throw new NotSupportException("could not support multi row values.");
}
}
private TableNode getTableNode(DMLReplaceStatement node) {
return new TableNode(node.getTable().getIdTextUpUnescape());
}
private String getInsertColumnsStr(DMLReplaceStatement node) {
List<Identifier> columnNames = node.getColumnNameList();
StringBuilder sb = new StringBuilder("");
if (columnNames != null && columnNames.size() != 0) {
for (int i = 0; i < columnNames.size(); i++) {
if (i > 0) {
sb.append(" ");
}
sb.append(columnNames.get(i).getIdTextUpUnescape());
}
}
return sb.toString();
}
private Comparable[] getRowValue(RowExpression expr) {
Comparable[] iv = new Comparable[expr.getRowExprList().size()];
for (int i = 0; i < expr.getRowExprList().size(); i++) {
MySqlExprVisitor mv = new MySqlExprVisitor();
expr.getRowExprList().get(i).accept(mv);
Object obj = mv.getColumnOrValue();
iv[i] = (Comparable) obj;
}
return iv;
}
public PutNode getReplaceNode() {
return replaceNode;
}
}