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;
}
}
}
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;
}
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);
}
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());
}
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;
}
Aggregations