This is an automated email from the ASF dual-hosted git repository.

alsuliman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 1c054ee6c4 [ASTERIXDB-3162][COMP] Limit Costing
1c054ee6c4 is described below

commit 1c054ee6c478ae1986eac0294321572839bf8d18
Author: murali4104 <[email protected]>
AuthorDate: Tue Sep 19 12:26:31 2023 -0700

    [ASTERIXDB-3162][COMP] Limit Costing
    
    Change-Id: Iff86329748a020ef8626d84e619c71463425c37f
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17786
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Jenkins <[email protected]>
    Reviewed-by: Vijay Sarathy <[email protected]>
---
 .../asterix/optimizer/rules/cbo/JoinEnum.java      | 22 ++++++++++++++++++++++
 .../asterix/optimizer/rules/cbo/JoinNode.java      |  9 +++++++++
 2 files changed, 31 insertions(+)

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 3ce4e9fe95..edc3251089 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.AbstractLogi
 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 @@ public class JoinEnum {
 
         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,23 @@ public class JoinEnum {
         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;
+                ILogicalExpression expr = lop.getMaxObjects().getValue();
+                if (expr != null) {
+                    if (expr.getExpressionTag() != 
LogicalExpressionTag.VARIABLE) { // must be a constant
+                        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 4c49cb31f8..8afc26b612 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 @@ public class JoinNode {
     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 @@ public class JoinNode {
         size = avgDocSize;
     }
 
+    public void setLimitVal(int val) {
+        limitVal = val;
+    }
+
+    public int getLimitVal() {
+        return limitVal;
+    }
+
     public double getInputSize() {
         return size;
     }

Reply via email to