package com.taobao.tddl.optimizer.costbased.after;
import java.util.Map;
import com.taobao.tddl.common.jdbc.ParameterContext;
import com.taobao.tddl.common.utils.AddressUtils;
import com.taobao.tddl.optimizer.core.plan.IDataNodeExecutor;
import com.taobao.tddl.optimizer.core.plan.IQueryTree;
import com.taobao.tddl.optimizer.core.plan.query.IJoin;
import com.taobao.tddl.optimizer.core.plan.query.IMerge;
import com.taobao.tddl.optimizer.core.plan.query.IQuery;
import com.taobao.tddl.optimizer.utils.RequestIDGen;
/**
* 添加id 不会改变结构
*
* @author Whisper
*/
public class FillRequestIDAndSubRequestID implements QueryPlanOptimizer {
String hostname = "";
public FillRequestIDAndSubRequestID(){
hostname = AddressUtils.getHostIp() + "_" + System.currentTimeMillis();
}
@Override
public IDataNodeExecutor optimize(IDataNodeExecutor dne, Map<Integer, ParameterContext> parameterSettings,
Map<String, Object> extraCmd) {
if (dne instanceof IQueryTree) {
fillRequestIDAndSubRequestIDFromRoot(dne, 1);
} else {
dne.setSubRequestID(1);
dne.setRequestID(RequestIDGen.genRequestID());
dne.setRequestHostName(hostname);
}
return dne;
}
public int fillRequestIDAndSubRequestIDFromRoot(IDataNodeExecutor qc, int subRequestID) {
qc.setSubRequestID(subRequestID);
qc.setRequestID(RequestIDGen.genRequestID());
qc.setRequestHostName(hostname);
if (qc instanceof IQuery && ((IQuery) qc).getSubQuery() != null) {
subRequestID = this.fillRequestIDAndSubRequestIDFromRoot(((IQuery) qc).getSubQuery(), subRequestID + 1);
} else if (qc instanceof IMerge) {
for (IDataNodeExecutor sub : ((IMerge) qc).getSubNode()) {
subRequestID = this.fillRequestIDAndSubRequestIDFromRoot(sub, subRequestID + 1);
}
} else if (qc instanceof IJoin) {
subRequestID = this.fillRequestIDAndSubRequestIDFromRoot(((IJoin) qc).getLeftNode(), subRequestID + 1);
subRequestID = this.fillRequestIDAndSubRequestIDFromRoot(((IJoin) qc).getRightNode(), subRequestID + 1);
}
return subRequestID;
}
}