use of com.actiontech.dble.plan.common.item.Item in project dble by actiontech.
the class ItemFuncTimestampDiff method toExpression.
@Override
public SQLExpr toExpression() {
SQLMethodInvokeExpr method = new SQLMethodInvokeExpr(funcName());
method.addParameter(new SQLIdentifierExpr(intType.toString()));
for (Item arg : args) {
method.addParameter(arg.toExpression());
}
return method;
}
use of com.actiontech.dble.plan.common.item.Item in project dble by actiontech.
the class ItemFuncGroupConcat method toExpression.
@Override
public SQLExpr toExpression() {
SQLAggregateExpr aggregate = new SQLAggregateExpr(funcName());
if (hasWithDistinct()) {
aggregate.setOption(SQLAggregateOption.DISTINCT);
}
if (orders != null) {
SQLOrderBy orderBy = new SQLOrderBy();
for (Order order : orders) {
SQLSelectOrderByItem orderItem = new SQLSelectOrderByItem(order.getItem().toExpression());
orderItem.setType(order.getSortOrder());
orderBy.addItem(orderItem);
}
aggregate.putAttribute(ItemFuncKeyWord.ORDER_BY, orderBy);
}
for (Item arg : args) {
aggregate.addArgument(arg.toExpression());
}
if (seperator != null) {
SQLCharExpr sep = new SQLCharExpr(seperator);
aggregate.putAttribute(ItemFuncKeyWord.SEPARATOR, sep);
}
return aggregate;
}
use of com.actiontech.dble.plan.common.item.Item in project dble by actiontech.
the class ItemSum method fixRefer.
@Override
public final void fixRefer(ReferContext context) {
PlanNode planNode = context.getPlanNode();
planNode.addSelToReferedMap(planNode, this);
boolean needAddArgToRefer = true;
if (context.isPushDownNode() && !planNode.existUnPushDownGroup()) {
boolean isUnpushSum = PlanUtil.isUnPushDownSum(this);
if (isUnpushSum) {
// this function can not be push down
planNode.setExistUnPushDownGroup(true);
needAddArgToRefer = true;
// add args of sunfuncs
for (ItemSum sumfunc : planNode.getSumFuncs()) {
for (Item sumArg : sumfunc.args) {
sumArg.fixRefer(context);
}
}
} else {
needAddArgToRefer = false;
}
}
if (needAddArgToRefer) {
for (Item arg : this.args) {
arg.fixRefer(context);
}
}
planNode.getSumFuncs().add(this);
}
use of com.actiontech.dble.plan.common.item.Item in project dble by actiontech.
the class OrderByPusher method getJoinColumnOrders.
/**
* generatejoinOnFilters,if joinOn's orderBy can change to match implicitOrders ,return true
*
* @param joinOnFilters in
* @param leftOnOrders out
* @param rightOnOrders out
* @param implicitOrders in
* @return
*/
private static boolean getJoinColumnOrders(List<ItemFuncEqual> joinOnFilters, List<Order> leftOnOrders, List<Order> rightOnOrders, List<Order> implicitOrders) {
List<Item> leftOnSels = new ArrayList<>();
List<Item> rightOnSels = new ArrayList<>();
for (ItemFuncEqual bf : joinOnFilters) {
leftOnSels.add(bf.arguments().get(0));
rightOnSels.add(bf.arguments().get(1));
}
// is on's orderBy can be changed to match implicitOrders
boolean canMatch = false;
if (implicitOrders.size() < leftOnSels.size())
canMatch = false;
else {
Map<Integer, SQLOrderingSpecification> foundOnIndexs = new LinkedHashMap<>();
for (Order orderby : implicitOrders) {
Item orderSel = orderby.getItem();
int index = -1;
if ((index = leftOnSels.indexOf(orderSel)) >= 0) {
foundOnIndexs.put(index, orderby.getSortOrder());
} else if ((index = rightOnSels.indexOf(orderSel)) >= 0) {
foundOnIndexs.put(index, orderby.getSortOrder());
} else {
// neither belong to leftOn nor belong to rightOn
break;
}
}
if (foundOnIndexs.size() == leftOnSels.size()) {
canMatch = true;
for (Map.Entry<Integer, SQLOrderingSpecification> entry : foundOnIndexs.entrySet()) {
int foundOnIndex = entry.getKey();
SQLOrderingSpecification sortOrder = entry.getValue();
Item leftOn = leftOnSels.get(foundOnIndex);
Item rightOn = rightOnSels.get(foundOnIndex);
// add lefton order
Order leftOnOrder = new Order(leftOn, sortOrder);
leftOnOrders.add(leftOnOrder);
// add righton order
Order rightOnOrder = new Order(rightOn, sortOrder);
rightOnOrders.add(rightOnOrder);
}
return canMatch;
}
}
// can not match
for (int index = 0; index < leftOnSels.size(); index++) {
SQLOrderingSpecification sortOrder = SQLOrderingSpecification.ASC;
Item leftOn = leftOnSels.get(index);
Item rightOn = rightOnSels.get(index);
// add lefton order
Order leftOnOrder = new Order(leftOn, sortOrder);
leftOnOrders.add(leftOnOrder);
// add righton order
Order rightOnOrder = new Order(rightOn, sortOrder);
rightOnOrders.add(rightOnOrder);
}
return canMatch;
}
use of com.actiontech.dble.plan.common.item.Item in project dble by actiontech.
the class SelectedProcessor method mergePushOrderBy.
private static void mergePushOrderBy(Item orderSel, List<Item> mergeSelects) {
if (orderSel instanceof ItemField) {
if (!mergeSelects.contains(orderSel))
mergeSelects.add(orderSel);
} else if (orderSel instanceof ItemFunc) {
ItemFunc func = (ItemFunc) orderSel;
if (func.isWithSumFunc()) {
for (int index = 0; index < func.getArgCount(); index++) {
Item arg = func.arguments().get(index);
mergePushOrderBy(arg, mergeSelects);
}
} else {
if (!mergeSelects.contains(func)) {
mergeSelects.add(func);
}
// union's order by must be found from selects
func.setPushDownName(func.getItemName());
}
} else if (orderSel instanceof ItemSum) {
ItemSum func = (ItemSum) orderSel;
for (int index = 0; index < func.getArgCount(); index++) {
Item arg = func.arguments().get(index);
mergePushOrderBy(arg, mergeSelects);
}
}
}
Aggregations