Search in sources :

Example 11 with DMLResponseHandler

use of com.actiontech.dble.backend.mysql.nio.handler.query.DMLResponseHandler in project dble by actiontech.

the class JoinNodeHandlerBuilder method buildJoinChild.

private DMLResponseHandler buildJoinChild(PlanNode child, boolean isLeft) {
    BaseHandlerBuilder builder = hBuilder.getBuilder(session, child, isExplain);
    if (builder.getSubQueryBuilderList().size() > 0) {
        this.getSubQueryBuilderList().addAll(builder.getSubQueryBuilderList());
    }
    DMLResponseHandler endHandler = builder.getEndHandler();
    if (isLeft) {
        if (!node.isLeftOrderMatch()) {
            OrderByHandler oh = new OrderByHandler(getSequenceId(), session, node.getLeftJoinOnOrders());
            endHandler.setNextHandler(oh);
            endHandler = oh;
        }
        endHandler.setLeft(true);
    } else {
        if (!node.isRightOrderMatch()) {
            OrderByHandler oh = new OrderByHandler(getSequenceId(), session, node.getRightJoinOnOrders());
            endHandler.setNextHandler(oh);
            endHandler = oh;
        }
    }
    return endHandler;
}
Also used : OrderByHandler(com.actiontech.dble.backend.mysql.nio.handler.query.impl.OrderByHandler) DMLResponseHandler(com.actiontech.dble.backend.mysql.nio.handler.query.DMLResponseHandler)

Example 12 with DMLResponseHandler

use of com.actiontech.dble.backend.mysql.nio.handler.query.DMLResponseHandler in project dble by actiontech.

the class JoinNodeHandlerBuilder method buildPre.

@Override
public List<DMLResponseHandler> buildPre() {
    List<DMLResponseHandler> pres = new ArrayList<>();
    PlanNode left = node.getLeftNode();
    PlanNode right = node.getRightNode();
    if (node.getStrategy() == JoinNode.Strategy.NESTLOOP) {
        final boolean isLeftSmall = left.getNestLoopFilters() == null;
        final PlanNode tnSmall = isLeftSmall ? left : right;
        final PlanNode tnBig = isLeftSmall ? right : left;
        // prepare the column for sending
        List<Item> keySources = isLeftSmall ? node.getLeftKeys() : node.getRightKeys();
        List<Item> keyToPasses = isLeftSmall ? node.getRightKeys() : node.getLeftKeys();
        // just find one key as filter later, try to choose a simple column(FIELD_ITEM) from toPasses
        int columnIndex = 0;
        for (int index = 0; index < keyToPasses.size(); index++) {
            Item keyToPass = keyToPasses.get(index);
            if (keyToPass.type().equals(ItemType.FIELD_ITEM)) {
                columnIndex = index;
                break;
            }
        }
        final Item keySource = keySources.get(columnIndex);
        final Item keyToPass = keyToPasses.get(columnIndex);
        DMLResponseHandler endHandler = buildJoinChild(tnSmall, isLeftSmall);
        final TempTableHandler tempHandler = new TempTableHandler(getSequenceId(), session, keySource);
        endHandler.setNextHandler(tempHandler);
        tempHandler.setLeft(isLeftSmall);
        pres.add(tempHandler);
        CallBackHandler tempDone = new CallBackHandler() {

            @Override
            public void call() throws Exception {
                Set<String> valueSet = tempHandler.getValueSet();
                buildNestFilters(tnBig, keyToPass, valueSet, tempHandler.getMaxPartSize());
                DMLResponseHandler bigLh = buildJoinChild(tnBig, !isLeftSmall);
                synchronized (tempHandler) {
                    bigLh.setNextHandler(tempHandler.getNextHandler());
                }
                tempHandler.setCreatedHandler(bigLh);
                HandlerBuilder.startHandler(bigLh);
            }
        };
        if (isExplain) {
            buildNestFiltersForExplain(tnBig, keyToPass);
            DMLResponseHandler bigLh = buildJoinChild(tnBig, !isLeftSmall);
            tempHandler.setCreatedHandler(bigLh);
        }
        tempHandler.setTempDoneCallBack(tempDone);
    } else if (node.getStrategy() == JoinNode.Strategy.SORTMERGE) {
        DMLResponseHandler lh = buildJoinChild(left, true);
        pres.add(lh);
        DMLResponseHandler rh = buildJoinChild(right, false);
        pres.add(rh);
    } else {
        throw new MySQLOutPutException(ErrorCode.ER_QUERYHANDLER, "", "strategy [" + node.getStrategy() + "] not implement yet!");
    }
    return pres;
}
Also used : ArrayList(java.util.ArrayList) TempTableHandler(com.actiontech.dble.backend.mysql.nio.handler.query.impl.TempTableHandler) ItemString(com.actiontech.dble.plan.common.item.ItemString) Item(com.actiontech.dble.plan.common.item.Item) PlanNode(com.actiontech.dble.plan.node.PlanNode) CallBackHandler(com.actiontech.dble.backend.mysql.nio.handler.util.CallBackHandler) DMLResponseHandler(com.actiontech.dble.backend.mysql.nio.handler.query.DMLResponseHandler) MySQLOutPutException(com.actiontech.dble.plan.common.exception.MySQLOutPutException)

Example 13 with DMLResponseHandler

use of com.actiontech.dble.backend.mysql.nio.handler.query.DMLResponseHandler in project dble by actiontech.

the class MergeNodeHandlerBuilder method buildPre.

@Override
protected List<DMLResponseHandler> buildPre() {
    List<DMLResponseHandler> pres = new ArrayList<>();
    for (PlanNode child : node.getChildren()) {
        BaseHandlerBuilder builder = hBuilder.getBuilder(session, child, isExplain);
        if (builder.getSubQueryBuilderList().size() > 0) {
            this.getSubQueryBuilderList().addAll(builder.getSubQueryBuilderList());
        }
        DMLResponseHandler ch = builder.getEndHandler();
        pres.add(ch);
    }
    return pres;
}
Also used : PlanNode(com.actiontech.dble.plan.node.PlanNode) DMLResponseHandler(com.actiontech.dble.backend.mysql.nio.handler.query.DMLResponseHandler) ArrayList(java.util.ArrayList)

Aggregations

DMLResponseHandler (com.actiontech.dble.backend.mysql.nio.handler.query.DMLResponseHandler)13 MySQLOutPutException (com.actiontech.dble.plan.common.exception.MySQLOutPutException)3 PlanNode (com.actiontech.dble.plan.node.PlanNode)3 ArrayList (java.util.ArrayList)3 CallBackHandler (com.actiontech.dble.backend.mysql.nio.handler.util.CallBackHandler)2 MultiNodeMergeHandler (com.actiontech.dble.backend.mysql.nio.handler.query.impl.MultiNodeMergeHandler)1 OrderByHandler (com.actiontech.dble.backend.mysql.nio.handler.query.impl.OrderByHandler)1 OutputHandler (com.actiontech.dble.backend.mysql.nio.handler.query.impl.OutputHandler)1 TempTableHandler (com.actiontech.dble.backend.mysql.nio.handler.query.impl.TempTableHandler)1 ErrorPacket (com.actiontech.dble.net.mysql.ErrorPacket)1 Item (com.actiontech.dble.plan.common.item.Item)1 ItemString (com.actiontech.dble.plan.common.item.ItemString)1 TableNode (com.actiontech.dble.plan.node.TableNode)1 RouteResultsetNode (com.actiontech.dble.route.RouteResultsetNode)1