You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by dl...@apache.org on 2020/06/24 20:11:36 UTC

[asterixdb] branch master updated: [NO ISSUE][COMP] Limit operator is not a map

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

dlych 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 ab9568f  [NO ISSUE][COMP] Limit operator is not a map
ab9568f is described below

commit ab9568f39f8dc24678b55b2e6af74e23752bda85
Author: Dmitry Lychagin <dm...@couchbase.com>
AuthorDate: Tue Jun 23 12:56:48 2020 -0700

    [NO ISSUE][COMP] Limit operator is not a map
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    - LimitOperator.isMap() should return false
      because Limit operator is not a map
    
    Change-Id: Ib17a2268ac0576956a8c1bbc6b5be1cb7bacc2ab
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/6984
    Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Reviewed-by: Dmitry Lychagin <dm...@couchbase.com>
    Reviewed-by: Ali Alsuliman <al...@gmail.com>
---
 .../algebricks/core/algebra/operators/logical/LimitOperator.java      | 2 +-
 .../apache/hyracks/algebricks/rewriter/rules/CopyLimitDownRule.java   | 3 +--
 .../rewriter/rules/PushMapOperatorDownThroughProductRule.java         | 4 +---
 .../apache/hyracks/algebricks/rewriter/rules/PushProjectDownRule.java | 4 +++-
 .../algebricks/rewriter/rules/RemoveUnnecessarySortMergeExchange.java | 3 +--
 5 files changed, 7 insertions(+), 9 deletions(-)

diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/LimitOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/LimitOperator.java
index 5f37aba..313b77e 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/LimitOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/LimitOperator.java
@@ -105,7 +105,7 @@ public class LimitOperator extends AbstractLogicalOperator {
 
     @Override
     public boolean isMap() {
-        return true;
+        return false;
     }
 
     @Override
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/CopyLimitDownRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/CopyLimitDownRule.java
index 7e36748..f0eca82 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/CopyLimitDownRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/CopyLimitDownRule.java
@@ -70,8 +70,7 @@ public class CopyLimitDownRule implements IAlgebraicRewriteRule {
             ILogicalOperator candidateOp = candidateOpRef.getValue();
             LogicalOperatorTag candidateOpTag = candidateOp.getOperatorTag();
             if (candidateOp.getInputs().size() > 1 || !candidateOp.isMap()
-                    || candidateOpTag == LogicalOperatorTag.SELECT || candidateOpTag == LogicalOperatorTag.LIMIT
-                    || candidateOpTag == LogicalOperatorTag.UNNEST_MAP) {
+                    || candidateOpTag == LogicalOperatorTag.SELECT || candidateOpTag == LogicalOperatorTag.UNNEST_MAP) {
                 break;
             }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushMapOperatorDownThroughProductRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushMapOperatorDownThroughProductRule.java
index 3181459..2a009f0 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushMapOperatorDownThroughProductRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushMapOperatorDownThroughProductRule.java
@@ -45,9 +45,7 @@ public class PushMapOperatorDownThroughProductRule implements IAlgebraicRewriteR
     public boolean rewritePost(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
             throws AlgebricksException {
         AbstractLogicalOperator op1 = (AbstractLogicalOperator) opRef.getValue();
-        // Even the LIMIT operator is a map operator, we don't push LIMIT operator into a join
-        // since a new LIMIT under a join can't generate the original result.
-        if (!op1.isMap() || op1.getOperatorTag() == LogicalOperatorTag.LIMIT) {
+        if (!op1.isMap()) {
             return false;
         }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushProjectDownRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushProjectDownRule.java
index 1ce6329..9457b60 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushProjectDownRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushProjectDownRule.java
@@ -91,7 +91,9 @@ public class PushProjectDownRule implements IAlgebraicRewriteRule {
                     || op2.getOperatorTag() == LogicalOperatorTag.UNIONALL) {
                 return new Pair<Boolean, Boolean>(false, false);
             }
-            if (!op2.isMap()) {
+            // ok to push PROJECT through LIMIT
+            boolean isMapOrLimit = op2.isMap() || op2.getOperatorTag() == LogicalOperatorTag.LIMIT;
+            if (!isMapOrLimit) {
                 break;
             }
             LinkedList<LogicalVariable> usedVars = new LinkedList<LogicalVariable>();
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnnecessarySortMergeExchange.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnnecessarySortMergeExchange.java
index e42c067..1b02ab4 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnnecessarySortMergeExchange.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnnecessarySortMergeExchange.java
@@ -66,8 +66,7 @@ public class RemoveUnnecessarySortMergeExchange implements IAlgebraicRewriteRule
                 return false;
             } else if (physicalOp.getOperatorTag() == PhysicalOperatorTag.SORT_MERGE_EXCHANGE) {
                 break;
-            } else if (!currentOp.isMap() || currentOp.getOperatorTag() == LogicalOperatorTag.UNNEST
-                    || currentOp.getOperatorTag() == LogicalOperatorTag.LIMIT) {
+            } else if (!currentOp.isMap() || currentOp.getOperatorTag() == LogicalOperatorTag.UNNEST) {
                 // Do not eliminate sort-merge below input order-sensitive operators.
                 // TODO(buyingyi): once Taewoo merges his limit-push down change,
                 // we need to use his new property in logical operator to check order sensitivity.