use of com.actiontech.dble.plan.common.item.Item in project dble by actiontech.
the class JoinNodeHandlerBuilder method buildNestFiltersForExplain.
private void buildNestFiltersForExplain(PlanNode tnBig, Item keyToPass) {
Item keyInBig = PlanUtil.pushDownItem(node, keyToPass);
List<Item> strategyFilters = tnBig.getNestLoopFilters();
List<Item> argList = new ArrayList<>();
argList.add(keyInBig);
argList.add(new ItemString(NEED_REPLACE));
ItemFuncIn filter = new ItemFuncIn(argList, false);
strategyFilters.add(filter);
}
use of com.actiontech.dble.plan.common.item.Item in project dble by actiontech.
the class JoinNodeHandlerBuilder method buildNestFilters.
/**
* generate filter for big table according to tmp(small) table's result
*
* @param tnBig
* @param keyToPass
* @param valueSet
*/
protected void buildNestFilters(PlanNode tnBig, Item keyToPass, Set<String> valueSet, int maxPartSize) {
List<Item> strategyFilters = tnBig.getNestLoopFilters();
List<Item> partList = null;
Item keyInBig = PlanUtil.pushDownItem(node, keyToPass);
int partSize = 0;
for (String value : valueSet) {
if (partList == null)
partList = new ArrayList<>();
if (value == null) {
// is null will never join
continue;
} else {
partList.add(new ItemString(value));
if (++partSize >= maxPartSize) {
List<Item> argList = new ArrayList<>();
argList.add(keyInBig);
argList.addAll(partList);
ItemFuncIn inFilter = new ItemFuncIn(argList, false);
strategyFilters.add(inFilter);
partList = null;
partSize = 0;
}
}
}
if (partSize > 0) {
List<Item> argList = new ArrayList<>();
argList.add(keyInBig);
argList.addAll(partList);
ItemFuncIn inFilter = new ItemFuncIn(argList, false);
strategyFilters.add(inFilter);
}
// if no data
if (strategyFilters.isEmpty()) {
strategyFilters.add(new ItemInt(0));
}
}
use of com.actiontech.dble.plan.common.item.Item in project dble by actiontech.
the class GlobalVisitor method visit.
protected void visit(JoinNode join) {
if (!isTopQuery) {
sqlBuilder.append(" ( ");
}
if (join.isSubQuery() || isTopQuery) {
buildSelect(join);
sqlBuilder.append(" from ");
}
PlanNode left = join.getLeftNode();
MysqlVisitor leftVisitor = new GlobalVisitor(left, false);
leftVisitor.visit();
sqlBuilder.append(leftVisitor.getSql());
if (join.getLeftOuter() && join.getRightOuter()) {
throw new RuntimeException("not supported for full outer join");
} else if (join.getLeftOuter() && !join.getRightOuter()) {
sqlBuilder.append(" left");
} else if (join.getRightOuter() && !join.getLeftOuter()) {
sqlBuilder.append(" right");
}
sqlBuilder.append(" join ");
PlanNode right = join.getRightNode();
MysqlVisitor rightVisitor = new GlobalVisitor(right, false);
rightVisitor.visit();
sqlBuilder.append(rightVisitor.getSql());
StringBuilder joinOnFilterStr = new StringBuilder();
boolean first = true;
for (int i = 0; i < join.getJoinFilter().size(); i++) {
Item filter = join.getJoinFilter().get(i);
if (first) {
sqlBuilder.append(" on ");
first = false;
} else
joinOnFilterStr.append(" and ");
joinOnFilterStr.append(filter);
}
if (join.getOtherJoinOnFilter() != null) {
if (!first) {
joinOnFilterStr.append(" and ");
}
joinOnFilterStr.append(join.getOtherJoinOnFilter());
}
sqlBuilder.append(joinOnFilterStr.toString());
if (join.isSubQuery() || isTopQuery) {
buildWhere(join);
buildGroupBy(join);
buildHaving(join);
buildOrderBy(join);
buildLimit(join);
} else {
whereFilter = query.getWhereFilter();
}
if (!isTopQuery) {
sqlBuilder.append(" ) ");
}
}
use of com.actiontech.dble.plan.common.item.Item in project dble by actiontech.
the class GlobalVisitor method buildHaving.
protected void buildHaving(PlanNode query) {
if (query.getHavingFilter() != null) {
Item filter = query.getHavingFilter();
String pdName = visitUnSelPushDownName(filter, true);
sqlBuilder.append(" having ").append(pdName);
}
}
use of com.actiontech.dble.plan.common.item.Item in project dble by actiontech.
the class GlobalVisitor method buildOrderBy.
protected void buildOrderBy(PlanNode query) {
boolean first = true;
if (query.getOrderBys() != null && !query.getOrderBys().isEmpty()) {
sqlBuilder.append(" order by ");
for (Order order : query.getOrderBys()) {
if (first) {
first = false;
} else {
sqlBuilder.append(",");
}
Item orderByCol = order.getItem();
String pdName = "";
if (orderByCol.basicConstItem())
pdName = "'" + orderByCol.toString() + "'";
if (pdName.isEmpty())
pdName = visitUnSelPushDownName(orderByCol, true);
sqlBuilder.append(pdName).append(" ").append(order.getSortOrder());
}
}
}
Aggregations