Search in sources :

Example 41 with Item

use of com.actiontech.dble.plan.common.item.Item in project dble by actiontech.

the class SelectedProcessor method pushSelected.

/**
 * pushSelected
 * if parent's  selected refered isA.id,A.name,B.id,B.name,
 * node of A only need push A.id,A.nam
 *
 * @param qtn
 * @param toPushColumns
 * @return
 */
private static PlanNode pushSelected(PlanNode qtn, Collection<Item> toPushColumns) {
    boolean isPushDownNode = false;
    if (PlanUtil.isGlobalOrER(qtn)) {
        // TODO:buildColumnRefers for every child
        List<Item> selList = qtn.getColumnsSelected();
        for (Item pdSel : toPushColumns) {
            if (!selList.contains(pdSel)) {
                selList.add(pdSel);
            }
        }
        isPushDownNode = true;
        qtn.setUpRefers(isPushDownNode);
        return qtn;
    }
    isPushDownNode = (qtn.type() == PlanNode.PlanNodeType.TABLE || qtn.type() == PlanNode.PlanNodeType.NONAME);
    if (qtn.type() == PlanNode.PlanNodeType.MERGE) {
        return mergePushSelected((MergeNode) qtn, toPushColumns);
    } else {
        if (qtn.getSubQueries().size() > 0) {
            for (ItemSubQuery itemSubQuery : qtn.getSubQueries()) {
                pushSelected(itemSubQuery.getPlanNode(), new HashSet<Item>());
            }
        }
        if (toPushColumns.isEmpty()) {
            qtn.setUpRefers(isPushDownNode);
        } else if (qtn.isDistinct()) {
            List<Item> selList = qtn.getColumnsSelected();
            for (Item pdSel : toPushColumns) {
                if (!selList.contains(pdSel)) {
                    selList.add(pdSel);
                }
            }
            qtn.setUpRefers(isPushDownNode);
        } else {
            List<Item> selList = qtn.getColumnsSelected();
            selList.clear();
            boolean existSum = false;
            for (Item toPush : toPushColumns) {
                selList.add(toPush);
                existSum |= toPush.type().equals(Item.ItemType.SUM_FUNC_ITEM);
            }
            // if only push id,it will miss sum(id)
            if (!existSum && qtn.getSumFuncs().size() > 0) {
                selList.add(qtn.getSumFuncs().iterator().next());
            }
            qtn.setUpRefers(isPushDownNode);
        }
        PlanNode.PlanNodeType i = qtn.type();
        if (i == PlanNode.PlanNodeType.NONAME) {
            return qtn;
        } else if (i == PlanNode.PlanNodeType.TABLE) {
            return qtn;
        } else {
            for (PlanNode child : qtn.getChildren()) {
                List<Item> referList = qtn.getColumnsReferedByChild(child);
                if (referList.isEmpty()) {
                    referList.add(new ItemInt(1));
                }
                Collection<Item> pdRefers = getPushDownSel(qtn, child, referList);
                pushSelected(child, pdRefers);
            }
            return qtn;
        }
    }
}
Also used : Item(com.actiontech.dble.plan.common.item.Item) PlanNode(com.actiontech.dble.plan.node.PlanNode) ItemInt(com.actiontech.dble.plan.common.item.ItemInt) ItemSubQuery(com.actiontech.dble.plan.common.item.subquery.ItemSubQuery)

Example 42 with Item

use of com.actiontech.dble.plan.common.item.Item in project dble by actiontech.

the class SubQueryPreProcessor method transformInSubQuery.

private static SubQueryFilter transformInSubQuery(SubQueryFilter qtn, ItemInSubQuery filter, BoolPtr childTransform) {
    Item leftColumn = filter.getLeftOperand();
    PlanNode query = filter.getPlanNode();
    query = findComparisonsSubQueryToJoinNode(query, childTransform);
    QueryNode changeQuery = new QueryNode(query);
    String alias = AUTOALIAS + query.getPureName();
    changeQuery.setAlias(alias);
    if (query.getColumnsSelected().size() != 1)
        throw new MySQLOutPutException(ErrorCode.ER_OPTIMIZER, "", "only support subquery of one column");
    query.setSubQuery(true).setDistinct(true);
    final List<Item> newSelects = qtn.query.getColumnsSelected();
    SubQueryFilter result = new SubQueryFilter();
    Item rightColumn = query.getColumnsSelected().get(0);
    qtn.query.setColumnsSelected(new ArrayList<Item>());
    String rightJoinName = rightColumn.getAlias();
    if (StringUtils.isEmpty(rightJoinName)) {
        if (rightColumn instanceof ItemField) {
            rightJoinName = rightColumn.getItemName();
        } else {
            rightColumn.setAlias(AUTONAME);
            rightJoinName = AUTONAME;
        }
    }
    ItemField rightJoinColumn = new ItemField(null, alias, rightJoinName);
    // rename the left column's table name
    result.query = new JoinNode(qtn.query, changeQuery);
    // leave origin sql to new join node
    result.query.setSql(qtn.query.getSql());
    qtn.query.setSql(null);
    result.query.select(newSelects);
    qtn.query.setSubQuery(false);
    if (!qtn.query.getOrderBys().isEmpty()) {
        List<Order> orderBys = new ArrayList<>();
        orderBys.addAll(qtn.query.getOrderBys());
        result.query.setOrderBys(orderBys);
        qtn.query.getOrderBys().clear();
    }
    if (!qtn.query.getGroupBys().isEmpty()) {
        List<Order> groupBys = new ArrayList<>();
        groupBys.addAll(qtn.query.getGroupBys());
        result.query.setGroupBys(groupBys);
        qtn.query.getGroupBys().clear();
        result.query.having(qtn.query.getHavingFilter());
        qtn.query.having(null);
    }
    if (qtn.query.getLimitFrom() != -1) {
        result.query.setLimitFrom(qtn.query.getLimitFrom());
        qtn.query.setLimitFrom(-1);
    }
    if (qtn.query.getLimitTo() != -1) {
        result.query.setLimitTo(qtn.query.getLimitTo());
        qtn.query.setLimitTo(-1);
    }
    if (filter.isNeg()) {
        ((JoinNode) result.query).setLeftOuterJoin().setNotIn(true);
        ItemFuncEqual joinFilter = FilterUtils.equal(leftColumn, rightJoinColumn);
        ((JoinNode) result.query).addJoinFilter(joinFilter);
        result.filter = null;
    } else {
        Item joinFilter = FilterUtils.equal(leftColumn, rightJoinColumn);
        result.query.query(joinFilter);
        result.filter = joinFilter;
    }
    result.query.setUpFields();
    return result;
}
Also used : Order(com.actiontech.dble.plan.Order) JoinNode(com.actiontech.dble.plan.node.JoinNode) ItemFuncEqual(com.actiontech.dble.plan.common.item.function.operator.cmpfunc.ItemFuncEqual) ArrayList(java.util.ArrayList) ItemField(com.actiontech.dble.plan.common.item.ItemField) Item(com.actiontech.dble.plan.common.item.Item) PlanNode(com.actiontech.dble.plan.node.PlanNode) QueryNode(com.actiontech.dble.plan.node.QueryNode) MySQLOutPutException(com.actiontech.dble.plan.common.exception.MySQLOutPutException)

Example 43 with Item

use of com.actiontech.dble.plan.common.item.Item in project dble by actiontech.

the class SubQueryProcessor method mergeSelect.

/**
 * view v_t1 as select id+1 idd from t1 tt1 order by idd select view
 * sql:select idd + 1 from v_t1 ==> select (id+1) + 1 from t1 tt1 order by
 * id+1
 */
// fixme: parent's alias set to select item's table
private static void mergeSelect(PlanNode parent, PlanNode child) {
    List<Item> pSelects = parent.getColumnsSelected();
    List<Item> cNewSelects = new ArrayList<>();
    for (Item pSel : pSelects) {
        Item pSel0 = PlanUtil.pushDownItem(parent, pSel, true);
        String selName = pSel.getAlias();
        if (StringUtils.isEmpty(selName)) {
            selName = pSel.getItemName();
            // parent is func and func has no alias,mysql not allow select func() as func()
            if (pSel.type() == ItemType.FUNC_ITEM || pSel.type() == ItemType.COND_ITEM || pSel.type() == ItemType.SUM_FUNC_ITEM)
                selName = Item.FNAF + selName;
        }
        pSel0.setAlias(selName);
        cNewSelects.add(pSel0);
    }
    child.setColumnsSelected(cNewSelects);
}
Also used : Item(com.actiontech.dble.plan.common.item.Item) ArrayList(java.util.ArrayList)

Example 44 with Item

use of com.actiontech.dble.plan.common.item.Item in project dble by actiontech.

the class ShowTables method responseDirect.

private static void responseDirect(ServerConnection c, String cSchema, ShowCreateStmtInfo info) {
    ByteBuffer buffer = c.allocate();
    Map<String, String> tableMap = getTableSet(cSchema, info);
    PackageBufINf bufInf;
    if (info.isFull()) {
        List<FieldPacket> fieldPackets = new ArrayList<>(2);
        bufInf = writeFullTablesHeader(buffer, c, cSchema, fieldPackets);
        if (info.getWhere() != null) {
            MySQLItemVisitor mev = new MySQLItemVisitor(c.getSchema(), c.getCharset().getResultsIndex(), DbleServer.getInstance().getTmManager());
            info.getWhereExpr().accept(mev);
            List<Field> sourceFields = HandlerTool.createFields(fieldPackets);
            Item whereItem = HandlerTool.createItem(mev.getItem(), sourceFields, 0, false, DMLResponseHandler.HandlerType.WHERE);
            bufInf = writeFullTablesRow(bufInf.getBuffer(), c, tableMap, bufInf.getPacketId(), whereItem, sourceFields);
        } else {
            bufInf = writeFullTablesRow(bufInf.getBuffer(), c, tableMap, bufInf.getPacketId(), null, null);
        }
    } else {
        bufInf = writeTablesHeaderAndRows(buffer, c, tableMap, cSchema);
    }
    writeRowEof(bufInf.getBuffer(), c, bufInf.getPacketId());
}
Also used : MySQLItemVisitor(com.actiontech.dble.plan.visitor.MySQLItemVisitor) Field(com.actiontech.dble.plan.common.field.Field) Item(com.actiontech.dble.plan.common.item.Item) PackageBufINf(com.actiontech.dble.manager.handler.PackageBufINf) ByteBuffer(java.nio.ByteBuffer) FieldPacket(com.actiontech.dble.net.mysql.FieldPacket)

Example 45 with Item

use of com.actiontech.dble.plan.common.item.Item in project dble by actiontech.

the class ItemFuncIn method toExpression.

@Override
public SQLExpr toExpression() {
    SQLInListExpr in = new SQLInListExpr(args.get(0).toExpression(), this.negated);
    List<SQLExpr> targetList = new ArrayList<>();
    int index = 0;
    for (Item item : args) {
        if (index != 0) {
            targetList.add(item.toExpression());
        }
        index++;
    }
    in.setTargetList(targetList);
    return in;
}
Also used : SQLInListExpr(com.alibaba.druid.sql.ast.expr.SQLInListExpr) Item(com.actiontech.dble.plan.common.item.Item) ArrayList(java.util.ArrayList) SQLExpr(com.alibaba.druid.sql.ast.SQLExpr)

Aggregations

Item (com.actiontech.dble.plan.common.item.Item)122 ArrayList (java.util.ArrayList)26 Order (com.actiontech.dble.plan.Order)16 PlanNode (com.actiontech.dble.plan.node.PlanNode)14 MySQLOutPutException (com.actiontech.dble.plan.common.exception.MySQLOutPutException)10 ItemField (com.actiontech.dble.plan.common.item.ItemField)10 SQLExpr (com.alibaba.druid.sql.ast.SQLExpr)7 MySqlSelectQueryBlock (com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock)7 Test (org.junit.Test)7 FieldPacket (com.actiontech.dble.net.mysql.FieldPacket)6 ItemFuncEqual (com.actiontech.dble.plan.common.item.function.operator.cmpfunc.ItemFuncEqual)6 ItemSum (com.actiontech.dble.plan.common.item.function.sumfunc.ItemSum)6 JoinNode (com.actiontech.dble.plan.node.JoinNode)6 SQLAggregateExpr (com.alibaba.druid.sql.ast.expr.SQLAggregateExpr)6 ItemFunc (com.actiontech.dble.plan.common.item.function.ItemFunc)5 ItemInt (com.actiontech.dble.plan.common.item.ItemInt)4 ItemString (com.actiontech.dble.plan.common.item.ItemString)4 BigDecimal (java.math.BigDecimal)4 RowDataPacket (com.actiontech.dble.net.mysql.RowDataPacket)3 NamedField (com.actiontech.dble.plan.NamedField)3