package com.taobao.tddl.repo.mysql.handler;
import java.util.List;
import com.taobao.tddl.common.exception.TddlException;
import com.taobao.tddl.common.model.ExtraCmd;
import com.taobao.tddl.common.utils.GeneralUtil;
import com.taobao.tddl.common.utils.TStringUtil;
import com.taobao.tddl.executor.common.ExecutionContext;
import com.taobao.tddl.executor.cursor.ICursorMeta;
import com.taobao.tddl.executor.cursor.ISchematicCursor;
import com.taobao.tddl.executor.handler.QueryHandler;
import com.taobao.tddl.executor.spi.ICommandHandler;
import com.taobao.tddl.executor.spi.IDataSourceGetter;
import com.taobao.tddl.executor.utils.ExecUtils;
import com.taobao.tddl.optimizer.config.table.IndexMeta;
import com.taobao.tddl.optimizer.core.expression.IOrderBy;
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.IQuery;
import com.taobao.tddl.repo.mysql.cursor.SchematicMyCursor;
import com.taobao.tddl.repo.mysql.spi.DatasourceMySQLImplement;
import com.taobao.tddl.repo.mysql.spi.My_Cursor;
import com.taobao.tddl.repo.mysql.spi.My_JdbcHandler;
import com.taobao.tddl.repo.mysql.utils.MysqlRepoUtils;
/**
* mysql 查询逻辑
*
* @author mengshi.sunmengshi 2013-12-6 上午11:26:49
* @since 5.0.0
*/
public class QueryMyHandler extends QueryHandler implements ICommandHandler {
protected IDataSourceGetter dsGetter;
public QueryMyHandler(){
super();
dsGetter = new DatasourceMySQLImplement();
}
@SuppressWarnings("rawtypes")
@Override
public ISchematicCursor handle(IDataNodeExecutor executor, ExecutionContext executionContext) throws TddlException {
if (!canComposeOneSql(executor)) {
return super.handle(executor, executionContext);
}
IndexMeta indexMeta = null;
My_JdbcHandler jdbcHandler = MysqlRepoUtils.getJdbcHandler(dsGetter, executor, executionContext);
ICursorMeta meta = ExecUtils.convertToICursorMeta((IQueryTree) executor);
My_Cursor my_cursor = new My_Cursor(jdbcHandler, meta, executor, executor.isStreaming());
// if (executor.getSql() != null) {
// // TODO shenxun : 排序信息似乎丢了啊。。
// return my_cursor.getResultSet();
// }
List<IOrderBy> orderBy = null;
if (executor instanceof IJoin) {
orderBy = ((IJoin) executor).getOrderBys();
} else {
orderBy = MysqlRepoUtils.buildOrderBy(executor, indexMeta);
}
orderBy = ExecUtils.copyOrderBys(orderBy);
for (IOrderBy order : orderBy) {
if (((IQueryTree) executor).getAlias() != null) {
order.getColumn().setTableName(((IQueryTree) executor).getAlias());
}
if (order.getColumn().getAlias() != null) order.getColumn().setColumnName(order.getColumn().getAlias());
}
if (GeneralUtil.getExtraCmdBoolean(executionContext.getExtraCmds(), ExtraCmd.EXECUTE_QUERY_WHEN_CREATED, false)) {
my_cursor.init();
}
return new SchematicMyCursor(my_cursor, meta, orderBy);
}
// private IQuery findLeafQuery(IDataNodeExecutor executor) {
// IQuery iq = (IQuery) executor;
// if (iq.getSubQuery() == null) {
// return iq;
// } else {
// return findLeafQuery(iq.getSubQuery());
// }
// }
protected boolean canComposeOneSql(IDataNodeExecutor executor) {
if (executor instanceof IQuery) {
IQuery iq = (IQuery) executor;
IQueryTree iqc = iq.getSubQuery();
if (iqc == null) {
return true;
}
String groupNode1 = iq.getDataNode();
String groupNode2 = iqc.getDataNode();
if (TStringUtil.equals(groupNode1, groupNode2)) {
return isConsistent(iqc, groupNode1);
} else {
return false;
}
} else {
return true;
}
}
private boolean isConsistent(IQueryTree iqc, String groupNode1) {
if (iqc instanceof IQuery) {
IQuery iq = (IQuery) iqc;
IQueryTree iqc1 = iq.getSubQuery();
if (iqc1 == null) {
return true;
} else {
String groupNode2 = iqc.getDataNode();
if (TStringUtil.equals(groupNode1, groupNode2)) {
return isConsistent(iqc, groupNode1);
} else {
return false;
}
}
} else {
return false;
}
}
}