mirror of
https://github.com/actiontech/dble.git
synced 2026-02-14 01:29:01 -06:00
Merge branch 'master' into fix-1787
This commit is contained in:
@@ -595,7 +595,11 @@ public abstract class BaseHandlerBuilder {
|
||||
boolean tryRouteToOneNode(List<DMLResponseHandler> pres) {
|
||||
List<DMLResponseHandler> merges = Lists.newArrayList();
|
||||
for (DMLResponseHandler preHandler : pres) {
|
||||
merges.addAll(preHandler.getMerges());
|
||||
List<DMLResponseHandler> baseMerges = preHandler.getMerges();
|
||||
if (HandlerBuilder.nestLoopCheck(baseMerges)) {
|
||||
return false;
|
||||
}
|
||||
merges.addAll(baseMerges);
|
||||
}
|
||||
Set<String> routeNodes = HandlerBuilder.canRouteToNodes(merges);
|
||||
if (routeNodes != null && routeNodes.size() > 0) {
|
||||
|
||||
@@ -128,15 +128,19 @@ public class HandlerBuilder {
|
||||
}
|
||||
|
||||
public boolean canAsWholeToSingle(List<DMLResponseHandler> merges) {
|
||||
if (merges.size() != 1)
|
||||
if (merges.size() != 1 || nestLoopCheck(merges))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean nestLoopCheck(List<DMLResponseHandler> merges) {
|
||||
DMLResponseHandler next = merges.get(0).getNextHandler();
|
||||
while (next != null) {
|
||||
if (next instanceof TempTableHandler || (next instanceof SendMakeHandler && !((SendMakeHandler) next).getTableHandlers().isEmpty()))
|
||||
return false;
|
||||
return true;
|
||||
next = next.getNextHandler();
|
||||
}
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
// check whether the SQL can be directly sent to a single node
|
||||
|
||||
@@ -22,7 +22,6 @@ import com.actiontech.dble.route.RouteResultsetNode;
|
||||
import com.actiontech.dble.util.CollectionUtil;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public final class ComplexQueryPlanUtil {
|
||||
private ComplexQueryPlanUtil() {
|
||||
@@ -82,7 +81,7 @@ public final class ComplexQueryPlanUtil {
|
||||
if (!dependenciesSet.isEmpty()) {
|
||||
dependencies = dependenciesSet;
|
||||
} else if (!CollectionUtil.isEmpty(dependencies)) {
|
||||
dependencies.stream().filter(dependency -> dependency.startsWith(JoinNode.Strategy.HINT_NEST_LOOP.name())).collect(Collectors.toSet()).clear();
|
||||
dependencies.removeIf(dependency -> dependency.startsWith(JoinNode.Strategy.HINT_NEST_LOOP.name()));
|
||||
}
|
||||
String mergeName = getMergeType(mergeHandler);
|
||||
List<BaseSelectHandler> mergeList = new ArrayList<>();
|
||||
|
||||
Reference in New Issue
Block a user