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/11/12 19:08:36 UTC

[asterixdb] branch master updated: [ASTERIXDB-2798][COMP] Copy limit through subplans

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 4ca89b5  [ASTERIXDB-2798][COMP] Copy limit through subplans
4ca89b5 is described below

commit 4ca89b5d5b989d4017746b2277c39e9a4a2b1e7d
Author: Dmitry Lychagin <dm...@couchbase.com>
AuthorDate: Thu Nov 12 09:28:52 2020 -0800

    [ASTERIXDB-2798][COMP] Copy limit through subplans
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    - CopyLimitDownRule should push limit through subplans
    
    Change-Id: Ia5fa4b7a25cafadb6dd2c050749e851e7e2adec5
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/8846
    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>
---
 .../queries_sqlpp/flwor/at00/at00.6.async.sqlpp    |  2 +-
 .../push-limit-to-primary-scan.1.ddl.sqlpp         | 19 ++++++++--
 .../push-limit-to-primary-scan.8.query.sqlpp}      | 22 +++++-------
 .../push-limit-to-primary-scan.9.query.sqlpp}      | 20 ++++-------
 .../push-limit-to-primary-scan.8.adm               | 41 ++++++++++++++++++++++
 .../push-limit-to-primary-scan.9.adm               |  5 +++
 .../rewriter/rules/CopyLimitDownRule.java          |  1 +
 7 files changed, 79 insertions(+), 31 deletions(-)

diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/at00/at00.6.async.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/at00/at00.6.async.sqlpp
index 7ba0e96..10b8c85 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/at00/at00.6.async.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/at00/at00.6.async.sqlpp
@@ -34,4 +34,4 @@ from
     ) as gen0,
     gen0.i as j at p
 where p < 4
-order by partkey, shipdate;
+order by partkey, p, shipdate;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.1.ddl.sqlpp
index 36af900..dd756b0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.1.ddl.sqlpp
@@ -29,7 +29,7 @@ create  dataverse test;
 use test;
 
 
-create type test.DBLPType as
+create type DBLPType as
 {
   id : bigint,
   dblpid : string,
@@ -58,6 +58,21 @@ create type onekType1 as
   string4 : string
 };
 
-create  dataset DBLP1(DBLPType) primary key id;
+create dataset DBLP1(DBLPType) primary key id;
 
 create dataset onek1(onekType1) primary key unique2;
+
+create function drop_fields(obj, field1, field2, field3) {
+  (
+    select value object_remove(t3, field3)
+    from (
+      select value object_remove(t2, field2)
+      from (
+        select value object_remove(t1, field1)
+        from (
+          select value t0 from to_array(obj) t0
+        ) t1
+      ) t2
+    ) t3
+  )[0]
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/at00/at00.6.async.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.8.query.sqlpp
similarity index 62%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/at00/at00.6.async.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.8.query.sqlpp
index 7ba0e96..d25d975 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/at00/at00.6.async.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.8.query.sqlpp
@@ -16,22 +16,16 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 /*
- * Description      :  Test for clause of the position variable in FLWOR expression
- * Expected Result  :  Success
- * Date             :  09/17/2013
+ * Test limit pushdown with UDFs (ASTERIXDB-2798).
  */
 
--- handlevariable=status
-
 use test;
 
-select element {'partkey':gen0.partkey,'pid':p,'shipdate':j.l_shipdate}
-from
-    ( select element {'partkey':i.l_partkey, 'i': (select value x.i from g as x order by x.i.l_shipdate) }
-      from  LineItem as i
-      group by i.l_partkey group as g
-    ) as gen0,
-    gen0.i as j at p
-where p < 4
-order by partkey, shipdate;
+explain
+
+select value drop_fields(paper, 'title', 'authors', 'misc')
+from DBLP1 as paper
+order by id
+limit 5 offset 5;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/at00/at00.6.async.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.9.query.sqlpp
similarity index 62%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/at00/at00.6.async.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.9.query.sqlpp
index 7ba0e96..66309f8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/flwor/at00/at00.6.async.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.9.query.sqlpp
@@ -16,22 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 /*
- * Description      :  Test for clause of the position variable in FLWOR expression
- * Expected Result  :  Success
- * Date             :  09/17/2013
+ * Test limit pushdown with UDFs (ASTERIXDB-2798).
  */
 
--- handlevariable=status
-
 use test;
 
-select element {'partkey':gen0.partkey,'pid':p,'shipdate':j.l_shipdate}
-from
-    ( select element {'partkey':i.l_partkey, 'i': (select value x.i from g as x order by x.i.l_shipdate) }
-      from  LineItem as i
-      group by i.l_partkey group as g
-    ) as gen0,
-    gen0.i as j at p
-where p < 4
-order by partkey, shipdate;
+select value drop_fields(paper, 'title', 'authors', 'misc')
+from DBLP1 as paper
+order by id
+limit 5 offset 5;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.8.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.8.adm
new file mode 100644
index 0000000..e11c19d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.8.adm
@@ -0,0 +1,41 @@
+distribute result [$$75]
+-- DISTRIBUTE_RESULT  |UNPARTITIONED|
+  exchange
+  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+    limit 5, 5
+    -- STREAM_LIMIT  |UNPARTITIONED|
+      project ([$$75])
+      -- STREAM_PROJECT  |PARTITIONED|
+        assign [$$75] <- [get-item($$73, 0)]
+        -- ASSIGN  |PARTITIONED|
+          project ([$$73])
+          -- STREAM_PROJECT  |PARTITIONED|
+            exchange
+            -- SORT_MERGE_EXCHANGE [$$77(ASC) ]  |PARTITIONED|
+              project ([$$73, $$77])
+              -- STREAM_PROJECT  |PARTITIONED|
+                subplan {
+                          aggregate [$$73] <- [listify($$72)]
+                          -- AGGREGATE  |LOCAL|
+                            assign [$$72] <- [object-remove(object-remove(object-remove($$t1, "title"), "authors"), "misc")]
+                            -- ASSIGN  |LOCAL|
+                              unnest $$t1 <- scan-collection($$64)
+                              -- UNNEST  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                       }
+                -- SUBPLAN  |PARTITIONED|
+                  project ([$$77, $$64])
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    assign [$$64] <- [to-array($$paper)]
+                    -- ASSIGN  |PARTITIONED|
+                      limit 10
+                      -- STREAM_LIMIT  |PARTITIONED|
+                        exchange
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          data-scan []<-[$$77, $$paper] <- test.DBLP1 limit 10
+                          -- DATASOURCE_SCAN  |PARTITIONED|
+                            exchange
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              empty-tuple-source
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.9.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.9.adm
new file mode 100644
index 0000000..77aa145
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.9.adm
@@ -0,0 +1,5 @@
+{ "id": 6, "dblpid": "books/acm/kim95/DittrichD95" }
+{ "id": 7, "dblpid": "books/acm/kim95/Garcia-MolinaH95" }
+{ "id": 8, "dblpid": "books/acm/kim95/Goodman95" }
+{ "id": 9, "dblpid": "books/acm/kim95/Kaiser95" }
+{ "id": 10, "dblpid": "books/acm/kim95/KelleyGKRG95" }
\ No newline at end of file
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 382b80d..7dd86b1 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
@@ -150,6 +150,7 @@ public class CopyLimitDownRule implements IAlgebraicRewriteRule {
     private static boolean isSafeOpCandidate(ILogicalOperator op) {
         switch (op.getOperatorTag()) {
             case UNIONALL:
+            case SUBPLAN: // subplan is a 'map' but is not yet marked as such
                 return true;
             // exclude following 'map' operators because they change cardinality
             case SELECT: