>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