>From Preetham Poluparthi <[email protected]>:
Preetham Poluparthi has uploaded this change for review. (
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/21086?usp=email )
Change subject: WIP: optimize select operator when using index for disjunction
......................................................................
WIP: optimize select operator when using index for disjunction
Change-Id: I70ad112e54eca1224746c3a23cc5998de2f45d3d
---
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/ArrayBTreeAccessMethod.java
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IAccessMethod.java
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/InvertedIndexAccessMethod.java
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/RTreeAccessMethod.java
M
hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/AbstractRuleController.java
7 files changed, 137 insertions(+), 46 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/86/21086/1
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/ArrayBTreeAccessMethod.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/ArrayBTreeAccessMethod.java
index 7eb722d..cf623be 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/ArrayBTreeAccessMethod.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/ArrayBTreeAccessMethod.java
@@ -188,7 +188,7 @@
ILogicalOperator indexSearchOp = createIndexSearchPlan(afterJoinRefs,
joinRef, conditionRef,
indexSubTree.getAssignsAndUnnestsRefs(), indexSubTree,
probeSubTree, chosenIndex, analysisCtx, true,
- isLeftOuterJoin, true, context, newNullPlaceHolderVar,
leftOuterMissingValue);
+ isLeftOuterJoin, true, context, newNullPlaceHolderVar,
leftOuterMissingValue, new ArrayList<>());
if (indexSearchOp == null) {
return false;
}
@@ -204,8 +204,8 @@
List<Mutable<ILogicalOperator>> assignBeforeTheOpRefs,
OptimizableOperatorSubTree indexSubTree,
OptimizableOperatorSubTree probeSubTree, Index chosenIndex,
AccessMethodAnalysisContext analysisCtx,
boolean retainInput, boolean retainMissing, boolean
requiresBroadcast, IOptimizationContext context,
- LogicalVariable newMissingNullPlaceHolderForLOJ,
IAlgebricksConstantValue leftOuterMissingValue)
- throws AlgebricksException {
+ LogicalVariable newMissingNullPlaceHolderForLOJ,
IAlgebricksConstantValue leftOuterMissingValue,
+ List<UnnestOperator> orConditionUnnestOps) throws
AlgebricksException {
Index.ArrayIndexDetails chosenIndexDetails = (Index.ArrayIndexDetails)
chosenIndex.getIndexDetails();
List<List<String>> chosenIndexKeyFieldNames = new ArrayList<>();
@@ -223,7 +223,7 @@
return createBTreeIndexSearchPlan(afterTopOpRefs, topOpRef,
conditionRef, assignBeforeTheOpRefs, indexSubTree,
probeSubTree, chosenIndex, analysisCtx, retainInput,
retainMissing, requiresBroadcast, context,
newMissingNullPlaceHolderForLOJ, leftOuterMissingValue,
chosenIndexKeyFieldNames,
- chosenIndexKeyFieldTypes, chosenIndexKeyFieldSourceIndicators);
+ chosenIndexKeyFieldTypes, chosenIndexKeyFieldSourceIndicators,
new ArrayList<>());
}
@Override
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
index 93c9578..1bad3bc 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
@@ -19,6 +19,7 @@
package org.apache.asterix.optimizer.rules.am;
+import static org.apache.asterix.om.functions.BuiltinFunctions.EQ;
import static
org.apache.asterix.om.types.AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE;
import static
org.apache.asterix.optimizer.rules.am.AccessMethodUtils.CAST_NULL_TYPE_CONSTRUCTORS;
@@ -205,14 +206,18 @@
// Sets the result of index-only plan check into
AccessMethodAnalysisContext.
analysisCtx.setIndexOnlyPlanInfo(indexOnlyPlanInfo);
+ List<UnnestOperator> orConditionUnnestOps = new ArrayList<>();
+
// Transform the current path to the path that is utilizing the
corresponding indexes
- ILogicalOperator primaryIndexUnnestOp =
createIndexSearchPlan(afterSelectRefs, selectRef, conditionRef,
- subTree.getAssignsAndUnnestsRefs(), subTree, null,
chosenIndex, analysisCtx,
-
AccessMethodUtils.retainInputs(subTree.getDataSourceVariables(),
subTree.getDataSourceRef().getValue(),
- afterSelectRefs),
- false,
subTree.getDataSourceRef().getValue().getInputs().get(0).getValue()
- .getExecutionMode() == ExecutionMode.UNPARTITIONED,
- context, null, null);
+ ILogicalOperator primaryIndexUnnestOp =
+ createIndexSearchPlan(afterSelectRefs, selectRef,
conditionRef, subTree.getAssignsAndUnnestsRefs(),
+ subTree, null, chosenIndex, analysisCtx,
+
AccessMethodUtils.retainInputs(subTree.getDataSourceVariables(),
+ subTree.getDataSourceRef().getValue(),
afterSelectRefs),
+ false,
+
subTree.getDataSourceRef().getValue().getInputs().get(0).getValue()
+ .getExecutionMode() ==
ExecutionMode.UNPARTITIONED,
+ context, null, null, orConditionUnnestOps);
if (primaryIndexUnnestOp == null) {
return false;
@@ -241,6 +246,7 @@
selectOp.getInputs().clear();
subTree.getDataSourceRef().setValue(primaryIndexUnnestOp);
selectOp.getInputs().add(new
MutableObject<ILogicalOperator>(assignBeforeSelectOp));
+ optimizeSelectCondition(selectOp.getCondition(),
orConditionUnnestOps);
}
} else {
// A secondary-index-only plan without any assign cannot
exist. This is a non-index only plan.
@@ -261,6 +267,88 @@
return true;
}
+ private static void optimizeSelectCondition(Mutable<ILogicalExpression>
cond,
+ List<UnnestOperator> orConditionUnnestOps) {
+ for (UnnestOperator unnestOp : orConditionUnnestOps) {
+ optimizeSelectCondition(cond, unnestOp);
+ }
+ }
+
+ private static void optimizeSelectCondition(Mutable<ILogicalExpression>
cond, UnnestOperator orConditionUnnestOp) {
+ if (cond.getValue().getExpressionTag() ==
LogicalExpressionTag.FUNCTION_CALL) {
+ AbstractFunctionCallExpression funcExpr =
(AbstractFunctionCallExpression) cond.getValue();
+ if
(funcExpr.getFunctionIdentifier().equals(AlgebricksBuiltinFunctions.OR)) {
+
+ LogicalVariable variable = null;
+ Set<ConstantExpression> constantExpressions = new HashSet<>();
+
+ for (Mutable<ILogicalExpression> arg :
funcExpr.getArguments()) {
+ if (arg.get().getExpressionTag() !=
LogicalExpressionTag.FUNCTION_CALL) {
+ return;
+ }
+
+ AbstractFunctionCallExpression argFuncExpr =
(AbstractFunctionCallExpression) arg.get();
+
+ if
(!argFuncExpr.getFunctionIdentifier().equals(AlgebricksBuiltinFunctions.EQ)) {
+ return;
+ }
+
+ ILogicalExpression arg1 =
argFuncExpr.getArguments().get(0).get();
+ ILogicalExpression arg2 =
argFuncExpr.getArguments().get(1).get();
+
+ if (arg1.getExpressionTag() ==
LogicalExpressionTag.VARIABLE
+ && arg2.getExpressionTag() ==
LogicalExpressionTag.CONSTANT) {
+ if (variable == null) {
+ variable = ((VariableReferenceExpression)
arg1).getVariableReference();
+ } else if
(!variable.equals(((VariableReferenceExpression) arg1).getVariableReference()))
{
+ return;
+ }
+
+ constantExpressions.add((ConstantExpression) arg2);
+ } else if (arg2.getExpressionTag() ==
LogicalExpressionTag.VARIABLE
+ && arg1.getExpressionTag() ==
LogicalExpressionTag.CONSTANT) {
+ if (variable == null) {
+ variable = ((VariableReferenceExpression)
arg2).getVariableReference();
+ } else if
(!variable.equals(((VariableReferenceExpression) arg2).getVariableReference()))
{
+ return;
+ }
+ constantExpressions.add((ConstantExpression) arg1);
+ }
+
+ }
+
+ ConstantExpression constantExpression =
+ (ConstantExpression)
((UnnestingFunctionCallExpression) (orConditionUnnestOp.getExpressionRef()
+ .get())).getArguments().get(0).get();
+
+ AsterixConstantValue asterixConstantValue =
(AsterixConstantValue) constantExpression.getValue();
+ AOrderedList list = (AOrderedList)
asterixConstantValue.getObject();
+
+ if (list.size() != constantExpressions.size()) {
+ return;
+ }
+
+ for (int i = 0; i < list.size(); i++) {
+ IAObject obj = list.getItem(i);
+ if (!constantExpressions.contains(new
ConstantExpression(new AsterixConstantValue(obj)))) {
+ return;
+ }
+ }
+
+ List<Mutable<ILogicalExpression>> args = new ArrayList<>();
+ args.add(new MutableObject<>(new
VariableReferenceExpression(variable)));
+ args.add(new MutableObject<>(new
VariableReferenceExpression(orConditionUnnestOp.getVariable())));
+
+ cond.setValue(new
ScalarFunctionCallExpression(BuiltinFunctions.getBuiltinFunctionInfo(EQ),
args));
+
+ } else if
(funcExpr.getFunctionIdentifier().equals(AlgebricksBuiltinFunctions.AND)) {
+ for (Mutable<ILogicalExpression> arg :
funcExpr.getArguments()) {
+ optimizeSelectCondition(arg, orConditionUnnestOp);
+ }
+ }
+ }
+ }
+
@Override
public boolean applyJoinPlanTransformation(List<Mutable<ILogicalOperator>>
afterJoinRefs,
Mutable<ILogicalOperator> joinRef, OptimizableOperatorSubTree
leftSubTree,
@@ -307,7 +395,7 @@
ILogicalOperator indexSearchOp = createIndexSearchPlan(afterJoinRefs,
joinRef, conditionRef,
indexSubTree.getAssignsAndUnnestsRefs(), indexSubTree,
probeSubTree, chosenIndex, analysisCtx, true,
- isLeftOuterJoin, true, context, newMissingNullPlaceHolderVar,
leftOuterMissingValue);
+ isLeftOuterJoin, true, context, newMissingNullPlaceHolderVar,
leftOuterMissingValue, new ArrayList<>());
if (indexSearchOp == null) {
return false;
@@ -329,8 +417,8 @@
List<Mutable<ILogicalOperator>> assignBeforeTheOpRefs,
OptimizableOperatorSubTree indexSubTree,
OptimizableOperatorSubTree probeSubTree, Index chosenIndex,
AccessMethodAnalysisContext analysisCtx,
boolean retainInput, boolean retainMissing, boolean
requiresBroadcast, IOptimizationContext context,
- LogicalVariable newMissingNullPlaceHolderForLOJ,
IAlgebricksConstantValue leftOuterMissingValue)
- throws AlgebricksException {
+ LogicalVariable newMissingNullPlaceHolderForLOJ,
IAlgebricksConstantValue leftOuterMissingValue,
+ List<UnnestOperator> orConditionUnnestOps) throws
AlgebricksException {
Index.ValueIndexDetails chosenIndexDetails = (Index.ValueIndexDetails)
chosenIndex.getIndexDetails();
List<List<String>> chosenIndexKeyFieldNames =
chosenIndexDetails.getKeyFieldNames();
@@ -340,7 +428,7 @@
return createBTreeIndexSearchPlan(afterTopOpRefs, topOpRef,
conditionRef, assignBeforeTheOpRefs, indexSubTree,
probeSubTree, chosenIndex, analysisCtx, retainInput,
retainMissing, requiresBroadcast, context,
newMissingNullPlaceHolderForLOJ, leftOuterMissingValue,
chosenIndexKeyFieldNames,
- chosenIndexKeyFieldTypes, chosenIndexKeyFieldSourceIndicators);
+ chosenIndexKeyFieldTypes, chosenIndexKeyFieldSourceIndicators,
orConditionUnnestOps);
}
private static boolean containsOR(ILogicalExpression condition) {
@@ -403,7 +491,8 @@
boolean retainInput, boolean retainMissing, boolean
requiresBroadcast, IOptimizationContext context,
LogicalVariable newMissingNullPlaceHolderForLOJ,
IAlgebricksConstantValue leftOuterMissingValue,
List<List<String>> chosenIndexKeyFieldNames, List<IAType>
chosenIndexKeyFieldTypes,
- List<Integer> chosenIndexKeyFieldSourceIndicators) throws
AlgebricksException {
+ List<Integer> chosenIndexKeyFieldSourceIndicators,
List<UnnestOperator> orConditionUnnestOps)
+ throws AlgebricksException {
Dataset dataset = indexSubTree.getDataset();
ARecordType recordType = indexSubTree.getRecordType();
@@ -754,6 +843,7 @@
Collections.singletonList(new
MutableObject<>(constantExpression)));
currOp = new UnnestOperator(assignKeyVarList.get(i), new
MutableObject<>(scanCollectionExpr));
+ orConditionUnnestOps.add((UnnestOperator) (currOp));
}
@@ -928,13 +1018,14 @@
boolean retainInput, boolean retainMissing, boolean
requiresBroadcast, IOptimizationContext context,
LogicalVariable newMissingNullPlaceHolderForLOJ,
IAlgebricksConstantValue leftOuterMissingValue,
List<List<String>> chosenIndexKeyFieldNames, List<IAType>
chosenIndexKeyFieldTypes,
- List<Integer> chosenIndexKeyFieldSourceIndicators) throws
AlgebricksException {
+ List<Integer> chosenIndexKeyFieldSourceIndicators,
List<UnnestOperator> orConditionUnnestOps)
+ throws AlgebricksException {
if (containsOR(conditionRef.get())) {
return createBTreeIndexSearchPlanWithOr(afterTopOpRefs, topOpRef,
conditionRef, assignBeforeTheOpRefs,
indexSubTree, probeSubTree, chosenIndex, analysisCtx,
retainInput, retainMissing, requiresBroadcast,
context, newMissingNullPlaceHolderForLOJ,
leftOuterMissingValue, chosenIndexKeyFieldNames,
- chosenIndexKeyFieldTypes,
chosenIndexKeyFieldSourceIndicators);
+ chosenIndexKeyFieldTypes,
chosenIndexKeyFieldSourceIndicators, orConditionUnnestOps);
}
Dataset dataset = indexSubTree.getDataset();
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IAccessMethod.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IAccessMethod.java
index 713792d..776a941 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IAccessMethod.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IAccessMethod.java
@@ -36,6 +36,7 @@
import
org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import
org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
+import
org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator;
/**
* Interface that an access method should implement to work with the rewrite
@@ -108,8 +109,8 @@
List<Mutable<ILogicalOperator>> assignBeforeTheOpRefs,
OptimizableOperatorSubTree indexSubTree,
OptimizableOperatorSubTree probeSubTree, Index chosenIndex,
AccessMethodAnalysisContext analysisCtx,
boolean retainInput, boolean retainNull, boolean
requiresBroadcast, IOptimizationContext context,
- LogicalVariable newMissingNullPlaceHolderForLOJ,
IAlgebricksConstantValue leftOuterMissingValue)
- throws AlgebricksException;
+ LogicalVariable newMissingNullPlaceHolderForLOJ,
IAlgebricksConstantValue leftOuterMissingValue,
+ List<UnnestOperator> orConditionUnnestOps) throws
AlgebricksException;
/**
* Applies the plan transformation to use chosenIndex to optimize a join
query.
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java
index 638d6d9..2001a8d 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java
@@ -279,7 +279,7 @@
.getExecutionMode() == ExecutionMode.UNPARTITIONED;
ILogicalOperator subRoot =
pair.first.createIndexSearchPlan(afterSelectRefs, selectRef, conditionRef,
subTree.getAssignsAndUnnestsRefs(), subTree, null,
pair.second, analysisCtx, retainInput, false,
- requiresBroadcast, context, null, null);
+ requiresBroadcast, context, null, null, new ArrayList<>());
if (subRoot == null) {
return false;
}
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/InvertedIndexAccessMethod.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/InvertedIndexAccessMethod.java
index 33d89d8..49fb8b6 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/InvertedIndexAccessMethod.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/InvertedIndexAccessMethod.java
@@ -401,8 +401,8 @@
List<Mutable<ILogicalOperator>> assignBeforeTopOpRefs,
OptimizableOperatorSubTree indexSubTree,
OptimizableOperatorSubTree probeSubTree, Index chosenIndex,
AccessMethodAnalysisContext analysisCtx,
boolean retainInput, boolean retainNull, boolean
requiresBroadcast, IOptimizationContext context,
- LogicalVariable newMissingNullPlaceHolderForLOJ,
IAlgebricksConstantValue leftOuterMissingValue)
- throws AlgebricksException {
+ LogicalVariable newMissingNullPlaceHolderForLOJ,
IAlgebricksConstantValue leftOuterMissingValue,
+ List<UnnestOperator> orConditionUnnestOps) throws
AlgebricksException {
// TODO: we currently do not support the index-only plan for the
inverted index searches since
// there can be many <SK, PK> pairs for the same PK and we may see two
different records with the same PK
// (e.g., the record is deleted and inserted with the same PK). The
reason is that there are
@@ -487,12 +487,11 @@
Mutable<ILogicalOperator> selectRef, OptimizableOperatorSubTree
subTree, Index chosenIndex,
AccessMethodAnalysisContext analysisCtx, IOptimizationContext
context) throws AlgebricksException {
SelectOperator selectOp = (SelectOperator) selectRef.getValue();
- ILogicalOperator indexPlanRootOp =
- createIndexSearchPlan(afterSelectRefs, selectRef,
selectOp.getCondition(),
- subTree.getAssignsAndUnnestsRefs(), subTree,
- null, chosenIndex, analysisCtx, false, false,
subTree.getDataSourceRef().getValue().getInputs()
- .get(0).getValue().getExecutionMode() ==
ExecutionMode.UNPARTITIONED,
- context, null, null);
+ ILogicalOperator indexPlanRootOp =
createIndexSearchPlan(afterSelectRefs, selectRef, selectOp.getCondition(),
+ subTree.getAssignsAndUnnestsRefs(), subTree, null,
+ chosenIndex, analysisCtx, false, false,
subTree.getDataSourceRef().getValue().getInputs().get(0)
+ .getValue().getExecutionMode() ==
ExecutionMode.UNPARTITIONED,
+ context, null, null, new ArrayList<>());
// Replace the datasource scan with the new plan rooted at
primaryIndexUnnestMap.
subTree.getDataSourceRef().setValue(indexPlanRootOp);
@@ -576,10 +575,10 @@
probeSubTree.setRoot(newProbeRootRef.getValue());
}
// Create regular indexed-nested loop join path.
- ILogicalOperator indexPlanRootOp =
- createIndexSearchPlan(afterJoinRefs, joinRef, new
MutableObject<ILogicalExpression>(joinCond),
- indexSubTree.getAssignsAndUnnestsRefs(), indexSubTree,
probeSubTree, chosenIndex, analysisCtx,
- true, isLeftOuterJoin, true, context,
newMissingNullPlaceHolderVar, leftOuterMissingValue);
+ ILogicalOperator indexPlanRootOp =
createIndexSearchPlan(afterJoinRefs, joinRef,
+ new MutableObject<ILogicalExpression>(joinCond),
indexSubTree.getAssignsAndUnnestsRefs(), indexSubTree,
+ probeSubTree, chosenIndex, analysisCtx, true, isLeftOuterJoin,
true, context,
+ newMissingNullPlaceHolderVar, leftOuterMissingValue, new
ArrayList<>());
indexSubTree.getDataSourceRef().setValue(indexPlanRootOp);
// Change join into a select with the same condition.
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/RTreeAccessMethod.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/RTreeAccessMethod.java
index 7a4658c..4b2161b 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/RTreeAccessMethod.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/RTreeAccessMethod.java
@@ -62,6 +62,7 @@
import
org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
import
org.apache.hyracks.algebricks.core.algebra.operators.logical.AssignOperator;
import
org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator;
+import
org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator;
import
org.apache.hyracks.algebricks.core.algebra.util.OperatorManipulationUtil;
import org.apache.hyracks.algebricks.core.algebra.util.OperatorPropertiesUtil;
@@ -192,12 +193,11 @@
analysisCtx.setIndexOnlyPlanInfo(indexOnlyPlanInfo);
- ILogicalOperator primaryIndexUnnestOp =
- createIndexSearchPlan(afterSelectRefs, selectRef,
selectOp.getCondition(),
- subTree.getAssignsAndUnnestsRefs(), subTree, null,
chosenIndex, analysisCtx,
-
AccessMethodUtils.retainInputs(subTree.getDataSourceVariables(),
- subTree.getDataSourceRef().getValue(),
afterSelectRefs),
- false, false, context, null, null);
+ ILogicalOperator primaryIndexUnnestOp =
createIndexSearchPlan(afterSelectRefs, selectRef,
+ selectOp.getCondition(), subTree.getAssignsAndUnnestsRefs(),
subTree, null, chosenIndex,
+ analysisCtx,
AccessMethodUtils.retainInputs(subTree.getDataSourceVariables(),
+ subTree.getDataSourceRef().getValue(),
afterSelectRefs),
+ false, false, context, null, null, new ArrayList<>());
if (primaryIndexUnnestOp == null) {
return false;
@@ -226,8 +226,8 @@
List<Mutable<ILogicalOperator>> assignBeforeTopRefs,
OptimizableOperatorSubTree indexSubTree,
OptimizableOperatorSubTree probeSubTree, Index chosenIndex,
AccessMethodAnalysisContext analysisCtx,
boolean retainInput, boolean retainNull, boolean
requiresBroadcast, IOptimizationContext context,
- LogicalVariable newMissingNullPlaceHolderForLOJ,
IAlgebricksConstantValue leftOuterMissingValue)
- throws AlgebricksException {
+ LogicalVariable newMissingNullPlaceHolderForLOJ,
IAlgebricksConstantValue leftOuterMissingValue,
+ List<UnnestOperator> orConditionUnnestOps) throws
AlgebricksException {
// TODO: We can probably do something smarter here based on
selectivity or MBR area.
IOptimizableFuncExpr optFuncExpr =
AccessMethodUtils.chooseFirstOptFuncExpr(chosenIndex, analysisCtx);
@@ -372,7 +372,7 @@
ILogicalOperator indexSearchOp = createIndexSearchPlan(afterJoinRefs,
joinRef, conditionRef,
indexSubTree.getAssignsAndUnnestsRefs(), indexSubTree,
probeSubTree, chosenIndex, analysisCtx, true,
- isLeftOuterJoin, true, context, newMissingNullPlaceHolderVar,
leftOuterMissingValue);
+ isLeftOuterJoin, true, context, newMissingNullPlaceHolderVar,
leftOuterMissingValue, new ArrayList<>());
if (indexSearchOp == null) {
return false;
diff --git
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/AbstractRuleController.java
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/AbstractRuleController.java
index dca5d62..36b2c54 100644
---
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/AbstractRuleController.java
+++
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/AbstractRuleController.java
@@ -41,7 +41,7 @@
protected IOptimizationContext context;
public AbstractRuleController() {
- isTraceEnabled = AlgebricksConfig.ALGEBRICKS_LOGGER.isTraceEnabled();
+ isTraceEnabled = true;
}
public void setContext(IOptimizationContext context) {
@@ -186,9 +186,9 @@
private void printRuleApplication(IAlgebraicRewriteRule rule, String
status, String beforePlan, String afterPlan) {
if (isTraceEnabled) {
- AlgebricksConfig.ALGEBRICKS_LOGGER.trace(">> Rule " +
rule.getClass().getName() + " " + status + "\n");
- AlgebricksConfig.ALGEBRICKS_LOGGER.trace(">> Before plan\n" +
LogRedactionUtil.userData(beforePlan) + "\n");
- AlgebricksConfig.ALGEBRICKS_LOGGER.trace(">> After plan\n" +
LogRedactionUtil.userData(afterPlan) + "\n");
+ AlgebricksConfig.ALGEBRICKS_LOGGER.info(">> Rule " +
rule.getClass().getName() + " " + status + "\n");
+ AlgebricksConfig.ALGEBRICKS_LOGGER.info(">> Before plan\n" +
LogRedactionUtil.userData(beforePlan) + "\n");
+ AlgebricksConfig.ALGEBRICKS_LOGGER.info(">> After plan\n" +
LogRedactionUtil.userData(afterPlan) + "\n");
}
}
}
--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/21086?usp=email
To unsubscribe, or for help writing mail filters, visit
https://asterix-gerrit.ics.uci.edu/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: asterixdb
Gerrit-Branch: phoenix
Gerrit-Change-Id: I70ad112e54eca1224746c3a23cc5998de2f45d3d
Gerrit-Change-Number: 21086
Gerrit-PatchSet: 1
Gerrit-Owner: Preetham Poluparthi <[email protected]>