package com.taobao.tddl.repo.bdb.executor;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;
import com.taobao.tddl.common.exception.TddlException;
import com.taobao.tddl.common.model.Group;
import com.taobao.tddl.common.model.lifecycle.AbstractLifecycle;
import com.taobao.tddl.executor.common.ExecutionContext;
import com.taobao.tddl.executor.cursor.ISchematicCursor;
import com.taobao.tddl.executor.cursor.ResultCursor;
import com.taobao.tddl.executor.spi.IAtomExecutor;
import com.taobao.tddl.executor.spi.IGroupExecutor;
import com.taobao.tddl.optimizer.core.plan.IDataNodeExecutor;
@SuppressWarnings("rawtypes")
public class BDBGroupExecutor extends AbstractLifecycle implements IGroupExecutor {
private final ArrayList<IAtomExecutor> executorList;
private ResourceSelector slaveSelector;
private ExceptionSorter<Integer> slaveExceptionSorter;
private ResourceSelector masterSelector;
private ExceptionSorter<Integer> masterExceptionSorter;
/**
* @param resultSetMap 结果集对应Map
* @param executorList 执行client的list
* @param rWeight 读权重
*/
public BDBGroupExecutor(ArrayList<IAtomExecutor> executorList, List<Integer> rWeight){
this.executorList = executorList;
this.masterExceptionSorter = new MasterExceptionSorter<Integer>();
this.slaveExceptionSorter = new SlaveExceptionSorter<Integer>();
this.masterSelector = new MasterResourceSelector(executorList.size());
this.slaveSelector = new SlaveResourceSelector(executorList.size(), rWeight);
}
private static int findIndexToExecute(ResourceSelector selector, Map<Integer, String> excludeKeys)
throws TddlException {
int index = 0;
// Integer specIndex = null;
// if (specIndex != null) {
// index = specIndex;
// } else {
index = selector.select(excludeKeys);
// }
return index;
}
@Override
public String toString() {
return "BDBGroupExecutor [masterSelector=" + masterSelector + "]";
}
public ResourceSelector getSlaveSelector() {
return slaveSelector;
}
public void setSlaveSelector(ResourceSelector slaveSelector) {
this.slaveSelector = slaveSelector;
}
public ExceptionSorter<Integer> getSlaveExceptionSorter() {
return slaveExceptionSorter;
}
public void setSlaveExceptionSorter(ExceptionSorter<Integer> slaveExceptionSorter) {
this.slaveExceptionSorter = slaveExceptionSorter;
}
public ResourceSelector getMasterSelector() {
return masterSelector;
}
public void setMasterSelector(ResourceSelector masterSelector) {
this.masterSelector = masterSelector;
}
public ExceptionSorter<Integer> getMasterExceptionSorter() {
return masterExceptionSorter;
}
public void setMasterExceptionSorter(ExceptionSorter<Integer> masterExceptionSorter) {
this.masterExceptionSorter = masterExceptionSorter;
}
@Override
public ISchematicCursor execByExecPlanNode(IDataNodeExecutor qc, ExecutionContext executionContext)
throws TddlException {
// IAtomExecutor atomExecutor = this.selectAtomExecutor(executeType,
// executionContext);
// try {
// rsHandler = commandExecutor.execByExecPlanNode(qc, executionContext);
// } catch (TddlException e) {
// ReturnVal<Integer> isRetryException =
// exceptionSorter.isRetryException(e.getMessage(), excludeKeys, index);
// excludeKeys = isRetryException.getExcludeKeys();
// if (!isRetryException.isRetryException()) {
// throw e;
// } else {
// // 将excludeKey 加入map后,进入下一次循环
// continue;
// }
// }
return null;
}
enum ExecuteType {
READ, WRITE
};
IAtomExecutor selectAtomExecutor(ExecuteType executeType, ExecutionContext executionContext) throws TddlException {
Map<Integer, String/* exception */> excludeKeys = null;
IAtomExecutor atomExecutor = null;
ResourceSelector selector = null;
if (executeType == ExecuteType.READ) {
selector = this.getSlaveSelector();
} else {
selector = this.getMasterSelector();
}
int index = findIndexToExecute(selector, excludeKeys);
atomExecutor = executorList.get(index);
return atomExecutor;
}
@Override
public ResultCursor commit(ExecutionContext executionContext) throws TddlException {
// TODO Auto-generated method stub
return null;
}
@Override
public ResultCursor rollback(ExecutionContext executionContext) throws TddlException {
// TODO Auto-generated method stub
return null;
}
@Override
public Future<ISchematicCursor> execByExecPlanNodeFuture(IDataNodeExecutor qc, ExecutionContext executionContext)
throws TddlException {
// TODO Auto-generated method stub
return null;
}
@Override
public Future<ResultCursor> commitFuture(ExecutionContext executionContext) throws TddlException {
// TODO Auto-generated method stub
return null;
}
@Override
public Future<ResultCursor> rollbackFuture(ExecutionContext executionContext) throws TddlException {
// TODO Auto-generated method stub
return null;
}
@Override
public Group getGroupInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public Object getRemotingExecutableObject() {
// TODO Auto-generated method stub
return null;
}
}