>From <[email protected]>:
[email protected] has uploaded this change for review. (
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17780 )
Change subject: [ASTERIXDB-3261][COMP] Limit Costing
......................................................................
[ASTERIXDB-3261][COMP] Limit Costing
Change-Id: I395be472cc2ac56060b6e0201dce6e77c4453950
---
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/JoinNode.java
2 files changed, 35 insertions(+), 0 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/80/17780/1
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 3ce4e9f..270a4c8 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
@@ -74,6 +74,7 @@
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.InnerJoinOperator;
+import
org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperator;
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.operators.logical.visitors.VariableUtilities;
@@ -817,6 +818,10 @@
int dataScanPlan;
JoinNode[] jnArray = this.getJnArray();
+ int limit = -1;
+ if (this.numberOfTerms == 1) {
+ jnArray[1].setLimitVal(findLimitValue(this.op));
+ }
for (int i = 1; i <= this.numberOfTerms; i++) {
JoinNode jn = jnArray[i];
Index.SampleIndexDetails idxDetails = jn.getIdxDetails();
@@ -886,6 +891,18 @@
return this.numberOfTerms;
}
+ private int findLimitValue(AbstractLogicalOperator oper) {
+ ILogicalOperator op = oper;
+ while (op.getOperatorTag() != LogicalOperatorTag.EMPTYTUPLESOURCE) {
+ if (op.getOperatorTag() == LogicalOperatorTag.LIMIT) {
+ LimitOperator lop = (LimitOperator) op;
+ return
Integer.parseInt(lop.getMaxObjects().getValue().toString());
+ }
+ op = op.getInputs().get(0).getValue();
+ }
+ return -1;
+ }
+
private boolean isPredicateCardinalityAnnotationPresent(ILogicalExpression
leExpr) {
if
(leExpr.getExpressionTag().equals(LogicalExpressionTag.FUNCTION_CALL)) {
AbstractFunctionCallExpression afcExpr =
(AbstractFunctionCallExpression) leExpr;
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 4c49cb3..8afc26b 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
@@ -86,6 +86,7 @@
protected int highestDatasetId;
private JoinNode rightJn;
private JoinNode leftJn;
+ private int limitVal = -1; // only for single dataset joinNodes.
private List<Integer> applicableJoinConditions;
protected ILogicalOperator leafInput;
private List<Pair<IAccessMethod, Index>> chosenIndexes;
@@ -137,6 +138,14 @@
size = avgDocSize;
}
+ public void setLimitVal(int val) {
+ limitVal = val;
+ }
+
+ public int getLimitVal() {
+ return limitVal;
+ }
+
public double getInputSize() {
return size;
}
--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17780
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: I395be472cc2ac56060b6e0201dce6e77c4453950
Gerrit-Change-Number: 17780
Gerrit-PatchSet: 1
Gerrit-Owner: [email protected]
Gerrit-MessageType: newchange