You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2022/07/07 03:19:56 UTC
[doris] branch dev-1.0.1 updated: fix_runtime_filter_outer_join (#10654)
This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch dev-1.0.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/dev-1.0.1 by this push:
new 8c5e2b7328 fix_runtime_filter_outer_join (#10654)
8c5e2b7328 is described below
commit 8c5e2b73288c991205d33de4a4aabc6dd5b68362
Author: Kidd <10...@users.noreply.github.com>
AuthorDate: Thu Jul 7 11:19:51 2022 +0800
fix_runtime_filter_outer_join (#10654)
---
.../src/main/java/org/apache/doris/analysis/Analyzer.java | 15 ++++++++++++++-
.../org/apache/doris/analysis/ExprSubstitutionMap.java | 4 +++-
.../main/java/org/apache/doris/planner/HashJoinNode.java | 2 +-
3 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
index 26bf81e5b2..74b8b674e1 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
@@ -181,6 +181,12 @@ public class Analyzer {
public String getTimezone() { return timezone; }
+ public void putEquivalentSlot(SlotId src_sid, SlotId target_sid) { globalState.equivalentSlots.put(src_sid, target_sid); }
+
+ public SlotId getEquivalentSlot(SlotId src_sid) { return globalState.equivalentSlots.get(src_sid); }
+
+ public boolean containEquivalentSlot(SlotId src_sid) { return globalState.equivalentSlots.containsKey(src_sid); }
+
public void putAssignedRuntimeFilter(RuntimeFilter rf) { assignedRuntimeFilters.add(rf); }
public List<RuntimeFilter> getAssignedRuntimeFilter() { return assignedRuntimeFilters; }
@@ -313,6 +319,8 @@ public class Analyzer {
private final long autoBroadcastJoinThreshold;
+ private final Map<SlotId, SlotId> equivalentSlots = Maps.newHashMap();
+
public GlobalState(Catalog catalog, ConnectContext context) {
this.catalog = catalog;
this.context = context;
@@ -2141,7 +2149,7 @@ public class Analyzer {
* TODO(zxy) Use value-transfer graph to check
*/
public boolean hasValueTransfer(SlotId a, SlotId b) {
- return a.equals(b);
+ return getValueTransferTargets(a).contains(b);
}
/**
@@ -2153,6 +2161,11 @@ public class Analyzer {
public List<SlotId> getValueTransferTargets(SlotId srcSid) {
List<SlotId> result = new ArrayList<>();
result.add(srcSid);
+ SlotId equalSlot = srcSid;
+ while(containEquivalentSlot(equalSlot)) {
+ result.add(getEquivalentSlot(equalSlot));
+ equalSlot = getEquivalentSlot(equalSlot);
+ }
return result;
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java
index 062eef4df8..d352d7608a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java
@@ -18,6 +18,7 @@
package org.apache.doris.analysis;
import java.util.List;
+import java.util.Objects;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -156,7 +157,7 @@ public final class ExprSubstitutionMap {
* f [A.id, B.id] g [A.id, C.id]
* return: g-f [B,id, C,id]
*/
- public static ExprSubstitutionMap subtraction(ExprSubstitutionMap f, ExprSubstitutionMap g) {
+ public static ExprSubstitutionMap subtraction(ExprSubstitutionMap f, ExprSubstitutionMap g, Analyzer analyzer) {
if (f == null && g == null) {
return new ExprSubstitutionMap();
}
@@ -170,6 +171,7 @@ public final class ExprSubstitutionMap {
for (int i = 0; i < g.size(); i++) {
if (f.containsMappingFor(g.lhs_.get(i))) {
result.put(f.get(g.lhs_.get(i)), g.rhs_.get(i));
+ analyzer.putEquivalentSlot(((SlotRef) Objects.requireNonNull(f.get(g.lhs_.get(i)))).getSlotId(), ((SlotRef) g.lhs_.get(i)).getSlotId());
} else {
result.put(g.lhs_.get(i), g.rhs_.get(i));
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java
index 25df202fde..6deb20d619 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java
@@ -398,7 +398,7 @@ public class HashJoinNode extends PlanNode {
}
}
// 2. compute srcToOutputMap
- vSrcToOutputSMap = ExprSubstitutionMap.subtraction(outputSmap, srcTblRefToOutputTupleSmap);
+ vSrcToOutputSMap = ExprSubstitutionMap.subtraction(outputSmap, srcTblRefToOutputTupleSmap, analyzer);
for (int i = 0; i < vSrcToOutputSMap.size(); i++) {
Preconditions.checkState(vSrcToOutputSMap.getRhs().get(i) instanceof SlotRef);
SlotRef rSlotRef = (SlotRef) vSrcToOutputSMap.getRhs().get(i);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org