You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@asterixdb.apache.org by AsterixDB Code Review <do...@asterix-gerrit.ics.uci.edu> on 2024/02/23 00:21:01 UTC
Change in asterixdb[master]: [ASTERIXDB-3358][COMP] Indexnl hint with index names not working corr...
From Vijay Sarathy <vi...@couchbase.com>:
Vijay Sarathy has uploaded this change for review. ( https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18177 )
Change subject: [ASTERIXDB-3358][COMP] Indexnl hint with index names not working correctly
......................................................................
[ASTERIXDB-3358][COMP] Indexnl hint with index names not working correctly
Change-Id: I603ae267efd137d4e9f3491be2a6bdcb1179eeac
---
M asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
1 file changed, 57 insertions(+), 7 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb refs/changes/77/18177/1
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
index 894fd93..6a6b11d 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
@@ -73,6 +73,8 @@
import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.VariableUtilities;
import org.apache.hyracks.algebricks.core.algebra.typing.ITypingContext;
import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
+import org.apache.hyracks.api.exceptions.IWarningCollector;
+import org.apache.hyracks.api.exceptions.Warning;
import com.google.common.base.Strings;
@@ -367,6 +369,7 @@
Iterator<Map.Entry<Index, List<Pair<Integer, Integer>>>> indexExprAndVarIt =
analysisCtx.getIteratorForIndexExprsAndVars();
boolean hasIndexPreferences = false;
+ Set<String> allIndexNames = null;
ArrayList<Integer> matchedExpressions = new ArrayList<>();
while (indexExprAndVarIt.hasNext()) {
Map.Entry<Index, List<Pair<Integer, Integer>>> indexExprAndVarEntry = indexExprAndVarIt.next();
@@ -543,13 +546,33 @@
}
}
analysisCtx.putNumberOfMatchedKeys(index, numMatchedKeys);
+ if (allIndexNames == null) {
+ allIndexNames = new HashSet<>();
+ }
+ allIndexNames.add(index.getIndexName());
}
if (hasIndexPreferences) {
- Collection<Index> preferredSecondaryIndexes = fetchSecondaryIndexPreferences(accessMethod, analysisCtx);
- if (preferredSecondaryIndexes != null) {
- // if we have preferred indexes then remove all non-preferred indexes
- removeNonPreferredSecondaryIndexes(analysisCtx, preferredSecondaryIndexes);
+ Pair<Set<Index>, Set<String>> preferredSecondaryIndexesAndNames =
+ fetchSecondaryIndexPreferences(accessMethod, analysisCtx);
+
+ Collection<String> preferredSecondaryIndexNames = preferredSecondaryIndexesAndNames.getSecond();
+ if (!allIndexNames.containsAll(preferredSecondaryIndexNames)) {
+ if (!context.getPhysicalOptimizationConfig().getCBOMode()) {
+ IWarningCollector warningCollector = context.getWarningCollector();
+ if (warningCollector.shouldWarn()) {
+ warningCollector
+ .warn(Warning.of(null, org.apache.hyracks.api.exceptions.ErrorCode.INAPPLICABLE_HINT,
+ "index nested loop join", "ignored"));
+ }
+ }
+ removeAllSecondaryIndexes(analysisCtx);
+ } else {
+ Collection<Index> preferredSecondaryIndexes = preferredSecondaryIndexesAndNames.getFirst();
+ if (preferredSecondaryIndexes != null) {
+ // if we have preferred indexes then remove all non-preferred indexes
+ removeNonPreferredSecondaryIndexes(analysisCtx, preferredSecondaryIndexes);
+ }
}
}
}
@@ -567,8 +590,9 @@
Index.getNonNullableType(type2).first.getTypeTag());
}
- private Set<Index> fetchSecondaryIndexPreferences(IAccessMethod accessMethod,
+ private Pair<Set<Index>, Set<String>> fetchSecondaryIndexPreferences(IAccessMethod accessMethod,
AccessMethodAnalysisContext analysisCtx) {
+ Set<String> preferredIndexNames = null;
Set<Index> preferredSecondaryIndexes = null;
for (Iterator<Map.Entry<Index, List<Pair<Integer, Integer>>>> indexExprAndVarIt =
analysisCtx.getIteratorForIndexExprsAndVars(); indexExprAndVarIt.hasNext();) {
@@ -577,7 +601,13 @@
if (index.isSecondaryIndex()) {
for (Pair<Integer, Integer> exprVarPair : indexExprAndVarEntry.getValue()) {
IOptimizableFuncExpr optFuncExpr = analysisCtx.getMatchedFuncExpr(exprVarPair.first);
- Collection<String> preferredIndexNames = accessMethod.getSecondaryIndexPreferences(optFuncExpr);
+ Collection<String> hintedIndexNames = accessMethod.getSecondaryIndexPreferences(optFuncExpr);
+ if (hintedIndexNames != null) {
+ if (preferredIndexNames == null) {
+ preferredIndexNames = new HashSet<>();
+ }
+ preferredIndexNames.addAll(hintedIndexNames);
+ }
if (preferredIndexNames != null && preferredIndexNames.contains(index.getIndexName())) {
if (preferredSecondaryIndexes == null) {
preferredSecondaryIndexes = new HashSet<>();
@@ -588,7 +618,7 @@
}
}
}
- return preferredSecondaryIndexes;
+ return new Pair<>(preferredSecondaryIndexes, preferredIndexNames);
}
private void removeNonPreferredSecondaryIndexes(AccessMethodAnalysisContext analysisCtx,
@@ -603,6 +633,17 @@
}
}
+ private void removeAllSecondaryIndexes(AccessMethodAnalysisContext analysisCtx) {
+ for (Iterator<Map.Entry<Index, List<Pair<Integer, Integer>>>> indexExprAndVarIt =
+ analysisCtx.getIteratorForIndexExprsAndVars(); indexExprAndVarIt.hasNext();) {
+ Map.Entry<Index, List<Pair<Integer, Integer>>> indexExprAndVarEntry = indexExprAndVarIt.next();
+ Index index = indexExprAndVarEntry.getKey();
+ if (index.isSecondaryIndex()) {
+ indexExprAndVarIt.remove();
+ }
+ }
+ }
+
/**
* Analyzes the given selection condition, filling analyzedAMs with
* applicable access method types. At this point we are not yet consulting
--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18177
To unsubscribe, or for help writing mail filters, visit https://asterix-gerrit.ics.uci.edu/settings
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Change-Id: I603ae267efd137d4e9f3491be2a6bdcb1179eeac
Gerrit-Change-Number: 18177
Gerrit-PatchSet: 1
Gerrit-Owner: Vijay Sarathy <vi...@couchbase.com>
Gerrit-MessageType: newchange