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 2026/04/06 10:50:39 UTC

[M] Change in asterixdb[phoenix]: WIP: optimize select operator when using index for disjunction

From Preetham Poluparthi <pr...@apache.org>:

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 <pr...@apache.org>