This is an automated email from the ASF dual-hosted git repository.
vsarathy1 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push:
new 6d9a620550 [ASTERIXDB-3349][COMP] Indexnl hint not honored with CBO
6d9a620550 is described below
commit 6d9a620550ac829138ffea17c32109febf36195a
Author: Vijay Sarathy <[email protected]>
AuthorDate: Wed Jan 31 17:23:34 2024 -0800
[ASTERIXDB-3349][COMP] Indexnl hint not honored with CBO
Change-Id: I5b2442e05a92a89dcdeeecc916c51f005d3d0716
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18150
Tested-by: Jenkins <[email protected]>
Reviewed-by: <[email protected]>
Reviewed-by: Vijay Sarathy <[email protected]>
---
.../asterix/optimizer/rules/cbo/JoinNode.java | 24 +++++++++++++---------
1 file changed, 14 insertions(+), 10 deletions(-)
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
index 52caaf3e01..ebbd71ae45 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
@@ -1269,7 +1269,6 @@ public class JoinNode {
validBuildOrProbeObject = true;
}
if (validBuildOrProbeObject) {
- joinEnum.joinHints.put(hintHashJoin, null);
if ((build &&
(rightJn.datasetNames.contains(buildOrProbeObject)
|| rightJn.aliases.contains(buildOrProbeObject)))
|| (probe &&
(leftJn.datasetNames.contains(buildOrProbeObject)
@@ -1284,10 +1283,13 @@ public class JoinNode {
hintHashJoin, outerJoin);
}
}
- if (hjPlan == PlanNode.NO_PLAN && commutativeHjPlan ==
PlanNode.NO_PLAN) {
+ if (hjPlan != PlanNode.NO_PLAN || commutativeHjPlan !=
PlanNode.NO_PLAN) {
+ // hintHashJoin has been used.
+ joinEnum.joinHints.put(hintHashJoin, null);
+ } else if (!(joinEnum.joinHints.containsKey(hintHashJoin)
+ && joinEnum.joinHints.get(hintHashJoin) == null)) {
// Hints are attached to predicates, so newJoinConditions
should not be empty, but adding the check to be safe.
if (!joinEnum.getJoinConditions().isEmpty() &&
!newJoinConditions.isEmpty()) {
- IWarningCollector warningCollector =
joinEnum.optCtx.getWarningCollector();
if (!joinEnum.joinHints.containsKey(hintHashJoin)) {
joinEnum.joinHints.put(hintHashJoin,
Warning.of(
@@ -1329,7 +1331,6 @@ public class JoinNode {
validBroadcastObject = true;
}
if (validBroadcastObject) {
- joinEnum.joinHints.put(hintBroadcastHashJoin, null);
if (rightJn.datasetNames.contains(broadcastObject) ||
rightJn.aliases.contains(broadcastObject)) {
bcastHjPlan = buildBroadcastHashJoinPlan(leftJn, rightJn,
leftPlan, rightPlan, hashJoinExpr,
hintBroadcastHashJoin, outerJoin);
@@ -1338,7 +1339,6 @@ public class JoinNode {
hashJoinExpr, hintBroadcastHashJoin, outerJoin);
}
} else if (broadcastObject == null) {
- joinEnum.joinHints.put(hintBroadcastHashJoin, null);
bcastHjPlan = buildBroadcastHashJoinPlan(leftJn, rightJn,
leftPlan, rightPlan, hashJoinExpr,
hintBroadcastHashJoin, outerJoin);
if (!joinEnum.forceJoinOrderMode || level <=
joinEnum.cboFullEnumLevel) {
@@ -1346,10 +1346,13 @@ public class JoinNode {
hashJoinExpr, hintBroadcastHashJoin, outerJoin);
}
}
- if (bcastHjPlan == PlanNode.NO_PLAN && commutativeBcastHjPlan ==
PlanNode.NO_PLAN) {
+ if (bcastHjPlan != PlanNode.NO_PLAN || commutativeBcastHjPlan !=
PlanNode.NO_PLAN) {
+ // hintBroadcastHashJoin has been used.
+ joinEnum.joinHints.put(hintBroadcastHashJoin, null);
+ } else if (!(joinEnum.joinHints.containsKey(hintBroadcastHashJoin)
+ && joinEnum.joinHints.get(hintBroadcastHashJoin) == null))
{
// Hints are attached to predicates, so newJoinConditions
should not be empty, but adding the check to be safe.
if (!joinEnum.getJoinConditions().isEmpty() &&
!newJoinConditions.isEmpty()) {
- IWarningCollector warningCollector =
joinEnum.optCtx.getWarningCollector();
if
(!joinEnum.joinHints.containsKey(hintBroadcastHashJoin)) {
joinEnum.joinHints.put(hintBroadcastHashJoin,
Warning.of(
@@ -1384,16 +1387,17 @@ public class JoinNode {
}
}
} else if (hintNLJoin != null) {
- joinEnum.joinHints.put(hintNLJoin, null);
nljPlan = buildNLJoinPlan(leftJn, rightJn, leftPlan, rightPlan,
nestedLoopJoinExpr, hintNLJoin, outerJoin);
if (!joinEnum.forceJoinOrderMode || level <=
joinEnum.cboFullEnumLevel) {
commutativeNljPlan = buildNLJoinPlan(rightJn, leftJn,
rightPlan, leftPlan, nestedLoopJoinExpr,
hintNLJoin, outerJoin);
}
- if (nljPlan == PlanNode.NO_PLAN && commutativeNljPlan ==
PlanNode.NO_PLAN) {
+ if (nljPlan != PlanNode.NO_PLAN || commutativeNljPlan !=
PlanNode.NO_PLAN) {
+ // hintNLJ has been used.
+ joinEnum.joinHints.put(hintNLJoin, null);
+ } else if (!(joinEnum.joinHints.containsKey(hintNLJoin) &&
joinEnum.joinHints.get(hintNLJoin) == null)) {
// Hints are attached to predicates, so newJoinConditions
should not be empty, but adding the check to be safe.
if (!joinEnum.getJoinConditions().isEmpty() &&
!newJoinConditions.isEmpty()) {
- IWarningCollector warningCollector =
joinEnum.optCtx.getWarningCollector();
if (!joinEnum.joinHints.containsKey(hintNLJoin)) {
joinEnum.joinHints.put(hintNLJoin,
Warning.of(