>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]>

Reply via email to