>From <preetha...@apache.org>:

preetha...@apache.org has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19947 )


Change subject: index enum to be added
......................................................................

index enum to be added

Change-Id: I25fe70ce3b50020c7afabd67c03a45ac3d24d8f8
---
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
A 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/FakeIndexProvider.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceJoinAccessMethodRule.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/AbstractCBOPlanNode.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOPlanStateTree.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/cbo/CBOPlanState.java
A 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/IIndexProvider.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOScanPlanNode.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOJoinPlanNode.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
A 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/FakeIndex.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/AdviseIndexRule.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/PlanCostCalculator.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
17 files changed, 290 insertions(+), 21 deletions(-)



  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/47/19947/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 24ef2d7..6c2eb67 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
@@ -39,6 +39,7 @@
 import org.apache.asterix.common.metadata.MetadataUtil;
 import org.apache.asterix.dataflow.data.common.ExpressionTypeComputer;
 import org.apache.asterix.metadata.declared.DataSourceId;
+import org.apache.asterix.metadata.declared.IIndexProvider;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.metadata.entities.Index;
@@ -87,6 +88,7 @@
  */
 public abstract class AbstractIntroduceAccessMethodRule implements 
IAlgebraicRewriteRule {
     protected MetadataProvider metadataProvider;
+    protected IIndexProvider indexProvider;

     public abstract Map<FunctionIdentifier, List<IAccessMethod>> 
getAccessMethods();

@@ -113,6 +115,10 @@
         metadataProvider = (MetadataProvider) context.getMetadataProvider();
     }

+    public void setIndexProvider(IIndexProvider indexProvider) {
+        this.indexProvider = indexProvider;
+    }
+
     protected void fillSubTreeIndexExprs(OptimizableOperatorSubTree subTree,
             Map<IAccessMethod, AccessMethodAnalysisContext> analyzedAMs, 
IOptimizationContext context,
             boolean isJoinLeftBranch) throws AlgebricksException {
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceJoinAccessMethodRule.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceJoinAccessMethodRule.java
index b7ae1b0..95af39a 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceJoinAccessMethodRule.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceJoinAccessMethodRule.java
@@ -26,6 +26,7 @@
 import java.util.Objects;
 import java.util.TreeMap;

+import org.apache.asterix.metadata.declared.IIndexProvider;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.metadata.entities.Index;
 import 
org.apache.asterix.optimizer.rules.am.array.IIntroduceAccessMethodRuleLocalRewrite;
@@ -122,6 +123,7 @@
             throws AlgebricksException {
         clear();
         setMetadataDeclarations(context);
+        setIndexProvider((IIndexProvider) context.getMetadataProvider());

         AbstractLogicalOperator op = (AbstractLogicalOperator) 
opRef.getValue();
 
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 dbb164a..7435632 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
@@ -30,6 +30,7 @@
 import org.apache.asterix.common.config.DatasetConfig;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.metadata.declared.IIndexProvider;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Index;
 import 
org.apache.asterix.optimizer.rules.am.array.IIntroduceAccessMethodRuleLocalRewrite;
@@ -156,6 +157,7 @@
             throws AlgebricksException {
         clear();
         setMetadataDeclarations(context);
+        setIndexProvider((IIndexProvider) context.getMetadataProvider());

         AbstractLogicalOperator op = (AbstractLogicalOperator) 
opRef.getValue();

@@ -200,10 +202,11 @@
     }

     public boolean checkApplicable(Mutable<ILogicalOperator> opRef, 
IOptimizationContext context,
-            List<Pair<IAccessMethod, Index>> chosenIndexes, Map<IAccessMethod, 
AccessMethodAnalysisContext> analyzedAMs)
-            throws AlgebricksException {
+            List<Pair<IAccessMethod, Index>> chosenIndexes, Map<IAccessMethod, 
AccessMethodAnalysisContext> analyzedAMs,
+            IIndexProvider indexProvider) throws AlgebricksException {
         clear();
         setMetadataDeclarations(context);
+        setIndexProvider(indexProvider);

         AbstractLogicalOperator op = (AbstractLogicalOperator) 
opRef.getValue();

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/AbstractCBOPlanNode.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/AbstractCBOPlanNode.java
index 64a0965..43f63cb 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/AbstractCBOPlanNode.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/AbstractCBOPlanNode.java
@@ -19,6 +19,8 @@

 package org.apache.asterix.optimizer.rules.cbo;

+import java.util.List;
+
 public abstract class AbstractCBOPlanNode {

     protected AbstractCBOPlanNode(PlanNodeType planNodeType) {
@@ -32,4 +34,6 @@

     private final PlanNodeType planNodeType;

+    public abstract List<CBOScanPlanNode> getLeafs();
+
 }
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/AdviseIndexRule.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/AdviseIndexRule.java
index bf8dcad..e29e067 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/AdviseIndexRule.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/AdviseIndexRule.java
@@ -21,8 +21,13 @@

 import static 
org.apache.asterix.optimizer.rules.cbo.CBOPlanState.getCBOPlanState;

+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.asterix.metadata.declared.IIndexProvider;
 import org.apache.commons.lang3.mutable.Mutable;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
 import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
 import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
@@ -56,11 +61,44 @@

         CBOPlanState planState = getCBOPlanState(opRef);

-        PlanCostCalculator planCostCalculator = new 
PlanCostCalculator(joinEnumFactory, opRef, context);
+        //        List<Mutable<ILogicalExpression>> filters = 
getFilters(planState.getCboPlanStateTrees());
+
+        PlanCostCalculator planCostCalculator =
+                new PlanCostCalculator(joinEnumFactory, opRef, context, 
(IIndexProvider) context.getMetadataProvider());

         PlanCostCalculator.PlanChangeResult planChangeResult =
                 planCostCalculator.getPlanChangeResult(new 
EnumerateJoinsRule(joinEnumFactory));

+        double cost = planChangeResult.getCost();
+
+        for (CBOPlanStateTree cboPlanStateTree : 
planState.getCboPlanStateTrees()) {
+            for (CBOScanPlanNode scanPlanNode : 
cboPlanStateTree.getCboPlanNode().getLeafs()) {
+                for (Mutable<ILogicalExpression> filter : 
scanPlanNode.getFilters()) {
+
+                    FakeIndexProvider fakeIndexProvider = new 
FakeIndexProvider(scanPlanNode.getScanOperator(), filter);
+
+                    PlanCostCalculator fakePlanCostCalculator =
+                            new PlanCostCalculator(joinEnumFactory, opRef, 
context, fakeIndexProvider);
+
+                    PlanCostCalculator.PlanChangeResult fakePlanChangeResult =
+                            fakePlanCostCalculator.getPlanChangeResult(new 
EnumerateJoinsRule(joinEnumFactory));
+
+                    if (fakePlanChangeResult.getCost() < cost) {
+
+                        return false;
+
+                        //                          
context.getIndexAdvisor().addIndexAdvise(scanPlanNode.getScanOperator().getDataSource(),
+                        //                                 
cboPlanStateTree.getCboPlanNode().getDatasetName(), 
fakePlanChangeResult.getNewPlanNodes(),
+                        //                                 filter, 
fakePlanChangeResult.getCost());
+                        //                          
context.getIndexAdvisor().setAdviseString("CREATE INDEX " + 
scanPlanNode.getScanOperator().getDataSource() + ";");
+                        //                          return true;
+
+                    }
+
+                }
+            }
+        }
+
         if (planChangeResult == null || 
planChangeResult.getNewPlanNodes().isEmpty())
             return false;

@@ -69,4 +107,16 @@

     }

+    List<Mutable<ILogicalExpression>> getFilters(List<CBOPlanStateTree> 
cboPlanStateTrees) {
+
+        List<Mutable<ILogicalExpression>> filters = new ArrayList<>();
+
+        for (CBOPlanStateTree cboPlanStateTree : cboPlanStateTrees) {
+            for (CBOScanPlanNode scanPlanNode : 
cboPlanStateTree.getCboPlanNode().getLeafs()) {
+                filters.addAll(scanPlanNode.getFilters());
+            }
+        }
+        return filters;
+    }
+
 }
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOJoinPlanNode.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOJoinPlanNode.java
index 9ca9667..57dc6cf 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOJoinPlanNode.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOJoinPlanNode.java
@@ -1,5 +1,8 @@
 package org.apache.asterix.optimizer.rules.cbo;

+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;

 public class CBOJoinPlanNode extends AbstractCBOPlanNode {
@@ -12,6 +15,15 @@

     public CBOJoinPlanNode(AbstractCBOPlanNode left, AbstractCBOPlanNode 
right, ILogicalOperator op) {
         super(PlanNodeType.JOIN);
+        this.left = left;
+        this.right = right;
     }

+    @Override
+    public List<CBOScanPlanNode> getLeafs() {
+        List<CBOScanPlanNode> leafs = new ArrayList<>();
+        leafs.addAll(left.getLeafs());
+        leafs.addAll(right.getLeafs());
+        return leafs;
+    }
 }
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOPlanState.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOPlanState.java
index e44428f..093bee2 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOPlanState.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOPlanState.java
@@ -44,6 +44,10 @@
         this.cboPlanStateTrees = new ArrayList<>();
     }

+    public List<CBOPlanStateTree> getCboPlanStateTrees() {
+        return cboPlanStateTrees;
+    }
+
     public void addCBOPlanStateTree(CBOPlanStateTree cboPlanStateTree) {
         this.cboPlanStateTrees.add(cboPlanStateTree);
     }
@@ -56,7 +60,7 @@

         recurse(opRef, cboPlanState, visited);

-        return null;
+        return cboPlanState;
     }

     private static void recurse(Mutable<ILogicalOperator> opRef, CBOPlanState 
cboPlanState,
@@ -85,9 +89,7 @@
             return null;

         AbstractCBOPlanNode planNode = getJoinOpsAndLeafInputs(null, 
opRef.getValue());
-
-        return null;
-
+        return  new CBOPlanStateTree(planNode);
     }

     private static AbstractCBOPlanNode 
getJoinOpsAndLeafInputs(Mutable<ILogicalOperator> parent, ILogicalOperator op) {
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOPlanStateTree.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOPlanStateTree.java
index 451117b..ce28bd6 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOPlanStateTree.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOPlanStateTree.java
@@ -21,10 +21,13 @@

 public class CBOPlanStateTree {

-    AbstractCBOPlanNode cboPlanNode;
+    private AbstractCBOPlanNode cboPlanNode;

     public CBOPlanStateTree(AbstractCBOPlanNode cboPlanNode) {
         this.cboPlanNode = cboPlanNode;
     }

+    public AbstractCBOPlanNode getCboPlanNode() {
+        return cboPlanNode;
+    }
 }
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOScanPlanNode.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOScanPlanNode.java
index 76d940a..b9d5af4 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOScanPlanNode.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/CBOScanPlanNode.java
@@ -1,22 +1,94 @@
 package org.apache.asterix.optimizer.rules.cbo;

+import java.util.ArrayList;
 import java.util.List;

+import org.apache.commons.lang3.mutable.Mutable;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag;
+import 
org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
+import 
org.apache.hyracks.algebricks.core.algebra.operators.logical.AssignOperator;
+import 
org.apache.hyracks.algebricks.core.algebra.operators.logical.DataSourceScanOperator;
+import 
org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator;
+import 
org.apache.hyracks.algebricks.core.algebra.util.OperatorManipulationUtil;

 public class CBOScanPlanNode extends AbstractCBOPlanNode {

     ILogicalOperator op;

-    List<ILogicalExpression> filters;
+    List<Mutable<ILogicalExpression>> filters;
+
+    DataSourceScanOperator scanOperator;

     public CBOScanPlanNode(ILogicalOperator op) {
         super(PlanNodeType.SCAN);
         this.op = op;
+        this.filters = parseFilters(op);
+        replaceVarsInFilters();
+        this.scanOperator = findDatascanOperator(op);
     }

-    public List<ILogicalExpression> getFilters() {
+    private void replaceVarsInFilters() {
+        do{
+            if(op.getOperatorTag() == LogicalOperatorTag.ASSIGN){
+                AssignOperator assignOp = (AssignOperator) op;
+                for(Mutable<ILogicalExpression> filter : filters){
+                    for(int i=0;i<assignOp.getInputs().size();i++){
+                        
OperatorManipulationUtil.replaceVarWithExpr((AbstractFunctionCallExpression) 
filter.getValue(), assignOp.getVariables().get(i), 
assignOp.getExpressions().get(i).getValue());
+                    }
+                }
+            }
+            op = op.getInputs().getFirst().getValue();
+        }
+        while (op.hasInputs());
+
+    }
+
+    private DataSourceScanOperator findDatascanOperator(ILogicalOperator op) {
+        while (op.getOperatorTag() != LogicalOperatorTag.DATASOURCESCAN) {
+            op = op.getInputs().get(0).getValue();
+        }
+        return (DataSourceScanOperator) op;
+    }
+
+    public DataSourceScanOperator getScanOperator() {
+        return scanOperator;
+    }
+
+    private List<Mutable<ILogicalExpression>> parseFilters(ILogicalOperator 
op) {
+
+        List<Mutable<ILogicalExpression>> filters = new ArrayList<>();
+
+        do {
+
+            if (op.getOperatorTag() == LogicalOperatorTag.SELECT) {
+                SelectOperator selectOp = (SelectOperator) op;
+                ILogicalExpression condition = 
selectOp.getCondition().getValue();
+                List<Mutable<ILogicalExpression>> conjs = new ArrayList<>();
+                if (condition.splitIntoConjuncts(conjs)) {
+                    filters.addAll(conjs);
+                } else {
+                    filters.add(selectOp.getCondition());
+                }
+            }
+
+            op = op.getInputs().get(0).getValue();
+
+        } while (op.hasInputs());
+
+        return OperatorManipulationUtil.cloneExpressions(filters);
+
+    }
+
+    @Override
+    public List<CBOScanPlanNode> getLeafs() {
+        List<CBOScanPlanNode> leafs = new ArrayList<>();
+        leafs.add(this);
+        return leafs;
+    }
+
+    public List<Mutable<ILogicalExpression>> getFilters() {
         return filters;
     }
 }
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
index c32384e..492f7e0 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
@@ -19,6 +19,7 @@

 package org.apache.asterix.optimizer.rules.cbo;

+import org.apache.asterix.metadata.declared.IIndexProvider;
 import org.apache.commons.lang3.mutable.Mutable;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.utils.Quadruple;
@@ -60,7 +61,8 @@
             return false;
         }

-        PlanCostCalculator planCostCalculator = new 
PlanCostCalculator(joinEnumFactory, opRef, context);
+        PlanCostCalculator planCostCalculator =
+                new PlanCostCalculator(joinEnumFactory, opRef, context, 
(IIndexProvider) context.getMetadataProvider());

         PlanCostCalculator.PlanChangeResult planChangeResult = 
planCostCalculator.getPlanChangeResult(this);

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/FakeIndex.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/FakeIndex.java
new file mode 100644
index 0000000..c9241a4
--- /dev/null
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/FakeIndex.java
@@ -0,0 +1,18 @@
+package org.apache.asterix.optimizer.rules.cbo;
+
+import org.apache.asterix.common.config.DatasetConfig;
+import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.metadata.entities.Index;
+import org.apache.asterix.metadata.utils.Creator;
+
+public class FakeIndex extends Index {
+
+    public FakeIndex(String databaseName, DataverseName dataverseName, String 
datasetName, String indexName) {
+        super(databaseName, dataverseName, datasetName, indexName, 
DatasetConfig.IndexType.BTREE, new IIndexDetails() {
+            @Override
+            public boolean isOverridingKeyFieldTypes() {
+                return false;
+            }
+        }, false, false, 1, Creator.DEFAULT_CREATOR);
+    }
+}
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/FakeIndexProvider.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/FakeIndexProvider.java
new file mode 100644
index 0000000..1c6c341
--- /dev/null
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/FakeIndexProvider.java
@@ -0,0 +1,34 @@
+package org.apache.asterix.optimizer.rules.cbo;
+
+import java.util.List;
+
+import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.metadata.declared.IIndexProvider;
+import org.apache.asterix.metadata.entities.Index;
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+import 
org.apache.hyracks.algebricks.core.algebra.operators.logical.DataSourceScanOperator;
+
+public class FakeIndexProvider implements IIndexProvider {
+
+    private DataSourceScanOperator scanOperator;
+    private Mutable<ILogicalExpression> filter;
+
+    public FakeIndexProvider(DataSourceScanOperator scanOperator, 
Mutable<ILogicalExpression> filter) {
+        this.scanOperator = scanOperator;
+        this.filter = filter;
+    }
+
+    @Override
+    public Index getIndex(String database, DataverseName dataverseName, String 
datasetName, String indexName)
+            throws AlgebricksException {
+        return null;
+    }
+
+    @Override
+    public List<Index> getDatasetIndexes(String database, DataverseName 
dataverseName, String datasetName)
+            throws AlgebricksException {
+        return List.of();
+    }
+}
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
index d231cd3..01880eb 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
@@ -39,6 +39,7 @@
 import org.apache.asterix.metadata.declared.DataSource;
 import org.apache.asterix.metadata.declared.DataSourceId;
 import org.apache.asterix.metadata.declared.DatasetDataSource;
+import org.apache.asterix.metadata.declared.IIndexProvider;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.declared.SampleDataSource;
 import org.apache.asterix.metadata.entities.Index;
@@ -144,6 +145,7 @@
     protected ICostMethods costMethods;
     List<LogicalVariable> resultAndJoinVars;
     Map<DataSourceScanOperator, Boolean> fakeLeafInputsMap;
+    IIndexProvider indexProvider;

     public JoinEnum() {
     }
@@ -155,8 +157,8 @@
             List<List<List<ILogicalOperator>>> unnestOpsInfo,
             HashMap<DataSourceScanOperator, ILogicalOperator> 
dataScanAndGroupByDistinctOps,
             ILogicalOperator grpByDistinctOp, ILogicalOperator orderByOp, 
List<LogicalVariable> resultAndJoinVars,
-            Map<DataSourceScanOperator, Boolean> fakeLeafInputsMap, 
IOptimizationContext context)
-            throws AsterixException {
+            Map<DataSourceScanOperator, Boolean> fakeLeafInputsMap, 
IOptimizationContext context,
+            IIndexProvider indexProvider) throws AsterixException {
         this.singleDatasetPreds = new ArrayList<>();
         this.joinConditions = new ArrayList<>();
         this.joinHints = new HashMap<>();
@@ -187,6 +189,7 @@
         initCostHandleAndJoinNodes(context);
         this.allTabsJnNum = 1; // keeps track of where the final join Node 
will be. In case of bushy plans, this may not always be the last join nod     e.
         this.maxBits = 1;
+        this.indexProvider = indexProvider;
     }

     protected void initCostHandleAndJoinNodes(IOptimizationContext context) {
@@ -1187,7 +1190,7 @@
                 return PlanNode.NO_PLAN;
             }
             // We may not add any index plans, so need to check for NO_PLAN
-            jn.addIndexAccessPlans(PlanCostCalculator.removeTrue(leafInput));
+            jn.addIndexAccessPlans(PlanCostCalculator.removeTrue(leafInput), 
indexProvider);
         }
         return this.numberOfTerms;
     }
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 33e649b..af7d395 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
@@ -37,6 +37,7 @@
 import 
org.apache.asterix.common.annotations.SkipSecondaryIndexSearchExpressionAnnotation;
 import org.apache.asterix.common.config.DatasetConfig;
 import org.apache.asterix.metadata.declared.DatasetDataSource;
+import org.apache.asterix.metadata.declared.IIndexProvider;
 import org.apache.asterix.metadata.declared.SampleDataSource;
 import org.apache.asterix.metadata.entities.Index;
 import org.apache.asterix.om.base.IAObject;
@@ -915,7 +916,8 @@
         return changes;
     }

-    protected void addIndexAccessPlans(ILogicalOperator leafInput) throws 
AlgebricksException {
+    protected void addIndexAccessPlans(ILogicalOperator leafInput, 
IIndexProvider indexProvider)
+            throws AlgebricksException {
         IntroduceSelectAccessMethodRule tmp = new 
IntroduceSelectAccessMethodRule();
         List<Pair<IAccessMethod, Index>> chosenIndexes = new ArrayList<>();
         Map<IAccessMethod, AccessMethodAnalysisContext> analyzedAMs = new 
TreeMap<>();
@@ -926,8 +928,8 @@
         SelectOperator firstSelop = copySelExprsAndSetTrue(selExprs, selOpers, 
leafInput);
         if (firstSelop != null) { // if there are no selects, then there is no 
question of index selections either.
             firstSelop.getCondition().setValue(andAlltheExprs(selExprs));
-            boolean index_access_possible =
-                    tmp.checkApplicable(new MutableObject<>(leafInput), 
joinEnum.optCtx, chosenIndexes, analyzedAMs);
+            boolean index_access_possible = tmp.checkApplicable(new 
MutableObject<>(leafInput), joinEnum.optCtx,
+                    chosenIndexes, analyzedAMs, indexProvider);
             restoreSelExprs(selExprs, selOpers);
             if (index_access_possible) {
                 costAndChooseIndexPlans(leafInput, analyzedAMs);
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/PlanCostCalculator.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/PlanCostCalculator.java
index d8fd929..deecfe2 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/PlanCostCalculator.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/PlanCostCalculator.java
@@ -27,6 +27,7 @@

 import org.apache.asterix.common.annotations.IndexedNLJoinExpressionAnnotation;
 import 
org.apache.asterix.common.annotations.SkipSecondaryIndexSearchExpressionAnnotation;
+import org.apache.asterix.metadata.declared.IIndexProvider;
 import org.apache.asterix.metadata.entities.Index;
 import org.apache.asterix.translator.SqlppExpressionToPlanTranslator;
 import org.apache.commons.lang3.mutable.Mutable;
@@ -113,9 +114,10 @@
     private final Mutable<ILogicalOperator> rootOpRef;
     //    private Mutable<ILogicalOperator> currOpRef;
     private final IOptimizationContext context;
+    private final IIndexProvider indexProvider;

     public PlanCostCalculator(JoinEnumFactory joinEnumFactory, 
Mutable<ILogicalOperator> rootOpRef,
-            IOptimizationContext context) {
+            IOptimizationContext context, IIndexProvider indexProvider) {
         this.joinEnumFactory = joinEnumFactory;
         dataScanAndGroupByDistinctOps = new HashMap<>(); // initialized only 
once at the beginning of the rule
         rootGroupByDistinctOp = null;
@@ -123,7 +125,7 @@
         this.phase = 1;
         this.rootOpRef = rootOpRef;
         this.context = context;
-
+        this.indexProvider = indexProvider;
     }

     public PlanChangeResult getPlanChangeResult(EnumerateJoinsRule 
enumerateJoinsRule) throws AlgebricksException {
@@ -281,7 +283,7 @@
         joinEnum.initEnum((AbstractLogicalOperator) op, cboMode, cboTestMode, 
numberOfFromTerms, leafInputs, allJoinOps,
                 assignOps, outerJoinsDependencyList, buildSets, 
varLeafInputIds, unnestOpsInfo,
                 dataScanAndGroupByDistinctOps, rootGroupByDistinctOp, 
rootOrderByOp, resultAndJoinVars,
-                fakeLeafInputsMap, context);
+                fakeLeafInputsMap, context, indexProvider);

         if (cboMode) {
             if (!doAllDataSourcesHaveSamples(leafInputs, context, joinEnum)) {
@@ -1613,6 +1615,15 @@
         public List<Quadruple<Mutable<ILogicalOperator>, PlanNode, JoinEnum, 
PlanChangeState>> getNewPlanNodes() {
             return newPlanNodes;
         }
+
+        public double getCost() {
+            double cost = 0.0;
+            for (Quadruple<Mutable<ILogicalOperator>, PlanNode, JoinEnum, 
PlanChangeState> planNode : newPlanNodes) {
+                cost += planNode.getSecond().computeTotalCost();
+            }
+            return cost;
+        }
+
     }

 }
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/IIndexProvider.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/IIndexProvider.java
new file mode 100644
index 0000000..c449183
--- /dev/null
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/IIndexProvider.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.metadata.declared;
+
+import java.util.List;
+
+import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.metadata.entities.Index;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+
+public interface IIndexProvider {
+    public Index getIndex(String database, DataverseName dataverseName, String 
datasetName, String indexName)
+            throws AlgebricksException;
+
+    public List<Index> getDatasetIndexes(String database, DataverseName 
dataverseName, String datasetName)
+            throws AlgebricksException;
+
+}
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
index 71f479f..8d5b43c 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
@@ -178,7 +178,7 @@
 import org.apache.hyracks.storage.common.IStorageManager;
 import org.apache.hyracks.storage.common.projection.ITupleProjectorFactory;

-public class MetadataProvider implements IMetadataProvider<DataSourceId, 
String> {
+public class MetadataProvider implements IMetadataProvider<DataSourceId, 
String>, IIndexProvider {

     private final ICcApplicationContext appCtx;
     private final IStorageComponentProvider storageComponentProvider;
@@ -465,11 +465,13 @@
         return index != null ? new DataSourceIndex(index, database, 
dataverseName, datasetName, this) : null;
     }

+    @Override
     public Index getIndex(String database, DataverseName dataverseName, String 
datasetName, String indexName)
             throws AlgebricksException {
         return MetadataManager.INSTANCE.getIndex(mdTxnCtx, database, 
dataverseName, datasetName, indexName);
     }

+    @Override
     public List<Index> getDatasetIndexes(String database, DataverseName 
dataverseName, String datasetName)
             throws AlgebricksException {
         return MetadataManagerUtil.getDatasetIndexes(mdTxnCtx, database, 
dataverseName, datasetName);

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19947
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: I25fe70ce3b50020c7afabd67c03a45ac3d24d8f8
Gerrit-Change-Number: 19947
Gerrit-PatchSet: 1
Gerrit-Owner: preetha...@apache.org
Gerrit-MessageType: newchange

Reply via email to