You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by mb...@apache.org on 2023/02/15 17:21:30 UTC

[asterixdb] branch master updated (0ff1a56bee -> ebf131d4d8)

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

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


    from 0ff1a56bee (Null) merge branch 'gerrit/neo'
     new f6e3615cb3 [ASTERIXDB-3097][OTH] Print "build-side" only for hash join
     new 3475ed3728 [ASTERIXDB-3104][FUN] Add function to return the serialized ADM size of a value
     new 3e56dc0a17 [NO ISSUE] Change dataverse 'Test' to 'test'
     new eede5bf7d1 [ASTERIXDB-3103][COMP] Extract non-pure functions
     new 62699481f8 [NO ISSUE][FUN] Move spatial-intersect() to asterix-runtime module
     new a31f0658a2 [NO ISSUE][OTH] Add some logging when join build fails to insert tuple
     new ebf131d4d8 Merge branch 'neo' into master

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../translator/LangExpressionToPlanTranslator.java |  51 +++--
 .../multiple-indexes/query1.sqlpp                  |   6 +-
 .../multiple-indexes/query2.sqlpp                  |   6 +-
 .../open/multiple-indexes/query1.sqlpp             |   6 +-
 .../open/multiple-indexes/query2.sqlpp             |   6 +-
 .../optimizerts/results/ASTERIXDB-2402.plan        | 223 ++++++++++-----------
 .../multiple-indexes/query1.plan                   |   6 +-
 .../multiple-indexes/query2.plan                   |   8 +-
 .../open/multiple-indexes/query1.plan              |   6 +-
 .../open/multiple-indexes/query2.plan              |   8 +-
 .../results/joins/nested_query_with_bcast.plan     |  40 ++--
 .../insert-primary-key-index-with-auto-gen-pk.plan |   6 +-
 .../multiple-indexes/multiple-indexes.1.ddl.sqlpp  |   6 +-
 .../multiple-indexes.2.update.sqlpp                |   2 +-
 .../multiple-indexes.3.query.sqlpp                 |   2 +-
 .../multiple-indexes.4.query.sqlpp                 |   2 +-
 .../multiple-indexes/multiple-indexes.1.ddl.sqlpp  |   6 +-
 .../multiple-indexes.2.update.sqlpp                |   2 +-
 .../multiple-indexes.3.query.sqlpp                 |   2 +-
 .../multiple-indexes.4.query.sqlpp                 |   2 +-
 .../limit-non-pure-function.1.query.sqlpp}         |  11 +-
 .../limit-non-pure-function.2.query.sqlpp}         |  16 +-
 .../constant_folding.7.query.sqlpp                 |   4 +
 .../serialized_size_fun.01.query.sqlpp}            |  17 +-
 .../load-record-fields.3.query.sqlpp               |   4 +-
 .../load-record-fields.4.query.sqlpp               |   4 +-
 ...uery.sqlpp => load-record-fields.5.query.sqlpp} |   2 +-
 ...uery.sqlpp => load-record-fields.6.query.sqlpp} |   2 +-
 .../limit-non-pure-function.1.plan                 |  14 ++
 .../limit-non-pure-function.2.plan                 |  18 ++
 .../misc/constant_folding/constant_folding.7.plan  |   8 +-
 .../serialized_size_fun/serialized_size_fun.01.adm |   5 +
 .../load-record-fields/load-record-fields.4.plan   |  30 ++-
 ...ecord-fields.3.adm => load-record-fields.5.adm} |   0
 .../load-record-fields/load-record-fields.6.plan   |  24 +++
 .../test/resources/runtimets/testsuite_sqlpp.xml   |   5 +
 .../runtime/FuzzyJoinFunctionRegistrant.java       |   4 -
 .../evaluators/functions/SimilarityDescriptor.java |   2 +-
 .../asterix/om/functions/BuiltinFunctions.java     |   4 +
 .../runtime/evaluators/common}/IntArray.java       |   2 +-
 .../functions/SerializedSizeDescriptor.java        |  87 ++++++++
 .../functions/SpatialIntersectDescriptor.java      |   2 +-
 .../runtime/functions/FunctionCollection.java      |   4 +
 .../visitors/IsomorphismOperatorVisitor.java       |   4 +-
 .../LogicalOperatorPrettyPrintVisitorJson.java     |   5 +-
 .../rules/InlineSingleReferenceVariablesRule.java  |   3 +-
 .../rewriter/rules/InlineVariablesRule.java        |  69 ++++++-
 .../PreferToSpillFullyOccupiedFramePolicy.java     |  10 +
 .../dataflow/std/join/OptimizedHybridHashJoin.java |  14 +-
 49 files changed, 508 insertions(+), 262 deletions(-)
 copy asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/{array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.3.query.sqlpp => limit/limit-non-pure-function/limit-non-pure-function.1.query.sqlpp} (87%)
 copy asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/{array-index/select-quantified-queries/multiple-indexes/multiple-indexes.3.query.sqlpp => limit/limit-non-pure-function/limit-non-pure-function.2.query.sqlpp} (83%)
 copy asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/{array-index/select-quantified-queries/multiple-indexes/multiple-indexes.3.query.sqlpp => misc/serialized_size_fun/serialized_size_fun.01.query.sqlpp} (75%)
 copy asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/{load-record-fields.3.query.sqlpp => load-record-fields.5.query.sqlpp} (95%)
 copy asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/{load-record-fields.4.query.sqlpp => load-record-fields.6.query.sqlpp} (95%)
 create mode 100644 asterixdb/asterix-app/src/test/resources/runtimets/results/limit/limit-non-pure-function/limit-non-pure-function.1.plan
 create mode 100644 asterixdb/asterix-app/src/test/resources/runtimets/results/limit/limit-non-pure-function/limit-non-pure-function.2.plan
 create mode 100644 asterixdb/asterix-app/src/test/resources/runtimets/results/misc/serialized_size_fun/serialized_size_fun.01.adm
 copy asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/{load-record-fields.3.adm => load-record-fields.5.adm} (100%)
 create mode 100644 asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.6.plan
 rename asterixdb/{asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin => asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common}/IntArray.java (97%)
 create mode 100644 asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SerializedSizeDescriptor.java
 rename asterixdb/{asterix-fuzzyjoin => asterix-runtime}/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialIntersectDescriptor.java (99%)


[asterixdb] 07/07: Merge branch 'neo' into master

Posted by mb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit ebf131d4d8e3e02eedcd972859265e496ae20fe6
Merge: 0ff1a56bee a31f0658a2
Author: Ali Alsuliman <al...@gmail.com>
AuthorDate: Tue Feb 14 12:03:27 2023 -0800

    Merge branch 'neo' into master
    
    Change-Id: I321be68b46a7fc71d2f119bc658cb4a8844d4343

 .../translator/LangExpressionToPlanTranslator.java |  51 +++--
 .../multiple-indexes/query1.sqlpp                  |   6 +-
 .../multiple-indexes/query2.sqlpp                  |   6 +-
 .../open/multiple-indexes/query1.sqlpp             |   6 +-
 .../open/multiple-indexes/query2.sqlpp             |   6 +-
 .../optimizerts/results/ASTERIXDB-2402.plan        | 223 ++++++++++-----------
 .../multiple-indexes/query1.plan                   |   6 +-
 .../multiple-indexes/query2.plan                   |   8 +-
 .../open/multiple-indexes/query1.plan              |   6 +-
 .../open/multiple-indexes/query2.plan              |   8 +-
 .../results/joins/nested_query_with_bcast.plan     |  40 ++--
 .../insert-primary-key-index-with-auto-gen-pk.plan |   6 +-
 .../multiple-indexes/multiple-indexes.1.ddl.sqlpp  |   6 +-
 .../multiple-indexes.2.update.sqlpp                |   2 +-
 .../multiple-indexes.3.query.sqlpp                 |   2 +-
 .../multiple-indexes.4.query.sqlpp                 |   2 +-
 .../multiple-indexes/multiple-indexes.1.ddl.sqlpp  |   6 +-
 .../multiple-indexes.2.update.sqlpp                |   2 +-
 .../multiple-indexes.3.query.sqlpp                 |   2 +-
 .../multiple-indexes.4.query.sqlpp                 |   2 +-
 .../limit-non-pure-function.1.query.sqlpp}         |  11 +-
 .../limit-non-pure-function.2.query.sqlpp}         |  16 +-
 .../constant_folding.7.query.sqlpp                 |   4 +
 .../serialized_size_fun.01.query.sqlpp}            |  17 +-
 .../load-record-fields.3.query.sqlpp               |   4 +-
 .../load-record-fields.4.query.sqlpp               |   4 +-
 ...uery.sqlpp => load-record-fields.5.query.sqlpp} |   2 +-
 ...uery.sqlpp => load-record-fields.6.query.sqlpp} |   2 +-
 .../limit-non-pure-function.1.plan                 |  14 ++
 .../limit-non-pure-function.2.plan                 |  18 ++
 .../misc/constant_folding/constant_folding.7.plan  |   8 +-
 .../serialized_size_fun/serialized_size_fun.01.adm |   5 +
 .../load-record-fields/load-record-fields.4.plan   |  30 ++-
 .../load-record-fields/load-record-fields.5.adm    |   2 +
 .../load-record-fields/load-record-fields.6.plan   |  24 +++
 .../test/resources/runtimets/testsuite_sqlpp.xml   |   5 +
 .../runtime/FuzzyJoinFunctionRegistrant.java       |   4 -
 .../evaluators/functions/SimilarityDescriptor.java |   2 +-
 .../asterix/om/functions/BuiltinFunctions.java     |   4 +
 .../runtime/evaluators/common}/IntArray.java       |   2 +-
 .../functions/SerializedSizeDescriptor.java        |  87 ++++++++
 .../functions/SpatialIntersectDescriptor.java      |   2 +-
 .../runtime/functions/FunctionCollection.java      |   4 +
 .../visitors/IsomorphismOperatorVisitor.java       |   4 +-
 .../LogicalOperatorPrettyPrintVisitorJson.java     |   5 +-
 .../rules/InlineSingleReferenceVariablesRule.java  |   3 +-
 .../rewriter/rules/InlineVariablesRule.java        |  69 ++++++-
 .../PreferToSpillFullyOccupiedFramePolicy.java     |  10 +
 .../dataflow/std/join/OptimizedHybridHashJoin.java |  14 +-
 49 files changed, 510 insertions(+), 262 deletions(-)

diff --cc asterixdb/asterix-app/src/test/resources/optimizerts/results/ASTERIXDB-2402.plan
index 7c8d8e7615,efd14f7463..b596e4b4ba
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/ASTERIXDB-2402.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/ASTERIXDB-2402.plan
@@@ -34,98 -34,48 +34,48 @@@
                            -- STREAM_PROJECT  |PARTITIONED|
                              -- ASSIGN  |PARTITIONED|
                                -- STREAM_PROJECT  |PARTITIONED|
-                                 -- ASSIGN  |PARTITIONED|
-                                   -- STREAM_PROJECT  |PARTITIONED|
+                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
 -                                  -- PRE_CLUSTERED_GROUP_BY[$$252]  |PARTITIONED|
++                                  -- PRE_CLUSTERED_GROUP_BY[$$267]  |PARTITIONED|
+                                           {
+                                             -- AGGREGATE  |LOCAL|
+                                               -- STREAM_SELECT  |LOCAL|
+                                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                           }
                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                       -- PRE_CLUSTERED_GROUP_BY[$$268]  |PARTITIONED|
-                                               {
-                                                 -- AGGREGATE  |LOCAL|
-                                                   -- STREAM_SELECT  |LOCAL|
-                                                     -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                               }
-                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                           -- STABLE_SORT [$$268(ASC)]  |PARTITIONED|
-                                             -- HASH_PARTITION_EXCHANGE [$$268]  |PARTITIONED|
-                                               -- STREAM_PROJECT  |PARTITIONED|
 -                                      -- STABLE_SORT [$$252(ASC)]  |PARTITIONED|
 -                                        -- HASH_PARTITION_EXCHANGE [$$252]  |PARTITIONED|
++                                      -- STABLE_SORT [$$267(ASC)]  |PARTITIONED|
++                                        -- HASH_PARTITION_EXCHANGE [$$267]  |PARTITIONED|
+                                           -- STREAM_PROJECT  |PARTITIONED|
+                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
 -                                              -- HYBRID_HASH_JOIN [$$251][$$222]  |PARTITIONED|
++                                              -- HYBRID_HASH_JOIN [$$266][$$237]  |PARTITIONED|
                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                   -- HYBRID_HASH_JOIN [$$323][$$237]  |PARTITIONED|
-                                                     -- HASH_PARTITION_EXCHANGE [$$323]  |PARTITIONED|
-                                                       -- RUNNING_AGGREGATE  |PARTITIONED|
-                                                         -- STREAM_PROJECT  |PARTITIONED|
-                                                           -- UNNEST  |PARTITIONED|
-                                                             -- STREAM_PROJECT  |PARTITIONED|
-                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                 -- PRE_CLUSTERED_GROUP_BY[$$326]  |PARTITIONED|
-                                                                         {
-                                                                           -- AGGREGATE  |LOCAL|
-                                                                             -- MICRO_PRE_CLUSTERED_GROUP_BY[$$328, $$330]  |LOCAL|
-                                                                                     {
-                                                                                       -- AGGREGATE  |LOCAL|
-                                                                                         -- STREAM_SELECT  |LOCAL|
-                                                                                           -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                                                     }
-                                                                               -- STREAM_SELECT  |LOCAL|
-                                                                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                                         }
-                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                     -- STABLE_SORT [$$326(ASC), $$328(ASC), $$330(ASC)]  |PARTITIONED|
-                                                                       -- HASH_PARTITION_EXCHANGE [$$326]  |PARTITIONED|
-                                                                         -- UNION_ALL  |PARTITIONED|
-                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                             -- STREAM_PROJECT  |PARTITIONED|
-                                                                               -- STREAM_SELECT  |PARTITIONED|
-                                                                                 -- STREAM_PROJECT  |PARTITIONED|
-                                                                                   -- ASSIGN  |PARTITIONED|
-                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                       -- BTREE_SEARCH (channels.Shelters.Shelters)  |PARTITIONED|
-                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                           -- STREAM_PROJECT  |PARTITIONED|
-                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                               -- SPLIT  |PARTITIONED|
-                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                   -- STREAM_PROJECT  |PARTITIONED|
-                                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                       -- RTREE_SEARCH (channels.Shelters.s_location)  |PARTITIONED|
-                                                                                                         -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                                           -- ASSIGN  |PARTITIONED|
-                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                               -- NESTED_LOOP  |PARTITIONED|
-                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                   -- NESTED_LOOP  |PARTITIONED|
-                                                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                       -- RUNNING_AGGREGATE  |PARTITIONED|
-                                                                                                                         -- ASSIGN  |PARTITIONED|
-                                                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                             -- DATASOURCE_SCAN (channels.EmergenciesNearMeChannelChannelSubscriptions)  |PARTITIONED|
-                                                                                                                               -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                                                                 -- ASSIGN  |UNPARTITIONED|
-                                                                                                                                   -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
-                                                                                                                     -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                                                       -- ASSIGN  |PARTITIONED|
-                                                                                                                         -- STREAM_SELECT  |PARTITIONED|
-                                                                                                                           -- ASSIGN  |PARTITIONED|
-                                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                               -- BTREE_SEARCH (channels.Reports.Reports)  |PARTITIONED|
-                                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                   -- STABLE_SORT [$$275(ASC)]  |PARTITIONED|
-                                                                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                       -- STREAM_PROJECT  |PARTITIONED|
-                                                                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                           -- BTREE_SEARCH (channels.Reports.report_time)  |PARTITIONED|
-                                                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                               -- ASSIGN  |PARTITIONED|
-                                                                                                                                                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                                                                 -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                                                   -- ASSIGN  |PARTITIONED|
-                                                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                       -- DATASOURCE_SCAN (channels.UserLocations)  |PARTITIONED|
-                                                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                           -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                             -- STREAM_PROJECT  |PARTITIONED|
-                                                                               -- STREAM_SELECT  |PARTITIONED|
-                                                                                 -- STREAM_PROJECT  |PARTITIONED|
-                                                                                   -- ASSIGN  |PARTITIONED|
+                                                   -- RUNNING_AGGREGATE  |PARTITIONED|
+                                                     -- STREAM_PROJECT  |PARTITIONED|
+                                                       -- UNNEST  |PARTITIONED|
+                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
 -                                                          -- PRE_CLUSTERED_GROUP_BY[$$313]  |PARTITIONED|
++                                                          -- PRE_CLUSTERED_GROUP_BY[$$322]  |PARTITIONED|
+                                                                   {
+                                                                     -- AGGREGATE  |LOCAL|
 -                                                                      -- MICRO_PRE_CLUSTERED_GROUP_BY[$$315, $$316]  |LOCAL|
++                                                                      -- MICRO_PRE_CLUSTERED_GROUP_BY[$$324, $$325]  |LOCAL|
+                                                                               {
+                                                                                 -- AGGREGATE  |LOCAL|
+                                                                                   -- STREAM_SELECT  |LOCAL|
+                                                                                     -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                               }
+                                                                         -- STREAM_SELECT  |LOCAL|
+                                                                           -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                   }
+                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
 -                                                              -- STABLE_SORT [$$313(ASC), $$315(ASC), $$316(ASC)]  |PARTITIONED|
 -                                                                -- HASH_PARTITION_EXCHANGE [$$313]  |PARTITIONED|
++                                                              -- STABLE_SORT [$$322(ASC), $$324(ASC), $$325(ASC)]  |PARTITIONED|
++                                                                -- HASH_PARTITION_EXCHANGE [$$322]  |PARTITIONED|
+                                                                   -- UNION_ALL  |PARTITIONED|
+                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                       -- STREAM_PROJECT  |PARTITIONED|
+                                                                         -- STREAM_SELECT  |PARTITIONED|
+                                                                           -- STREAM_PROJECT  |PARTITIONED|
+                                                                             -- ASSIGN  |PARTITIONED|
+                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                 -- BTREE_SEARCH (channels.Shelters.Shelters)  |PARTITIONED|
+                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                      -- STREAM_PROJECT  |PARTITIONED|
                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                          -- SPLIT  |PARTITIONED|
@@@ -154,7 -102,7 +102,7 @@@
                                                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                                          -- BTREE_SEARCH (channels.Reports.Reports)  |PARTITIONED|
                                                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                             -- STABLE_SORT [$$275(ASC)]  |PARTITIONED|
 -                                                                                                                            -- STABLE_SORT [$$259(ASC)]  |PARTITIONED|
++                                                                                                                            -- STABLE_SORT [$$274(ASC)]  |PARTITIONED|
                                                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                                                  -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@@ -168,22 -116,67 +116,67 @@@
                                                                                                                  -- DATASOURCE_SCAN (channels.UserLocations)  |PARTITIONED|
                                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                     -- HASH_PARTITION_EXCHANGE [$$237]  |PARTITIONED|
-                                                       -- ASSIGN  |PARTITIONED|
-                                                         -- STREAM_PROJECT  |PARTITIONED|
-                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                             -- HYBRID_HASH_JOIN [$$248, $$250][$$239, $$240]  |PARTITIONED|
-                                                               -- HASH_PARTITION_EXCHANGE [$$248, $$250]  |PARTITIONED|
-                                                                 -- STREAM_PROJECT  |PARTITIONED|
-                                                                   -- ASSIGN  |PARTITIONED|
                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                       -- DATASOURCE_SCAN (channels.EmergenciesNearMeChannelBrokerSubscriptions)  |PARTITIONED|
-                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                           -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                 -- STREAM_PROJECT  |PARTITIONED|
-                                                                   -- ASSIGN  |PARTITIONED|
+                                                                       -- STREAM_PROJECT  |PARTITIONED|
+                                                                         -- STREAM_SELECT  |PARTITIONED|
+                                                                           -- STREAM_PROJECT  |PARTITIONED|
+                                                                             -- ASSIGN  |PARTITIONED|
+                                                                               -- STREAM_PROJECT  |PARTITIONED|
+                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                   -- SPLIT  |PARTITIONED|
+                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                       -- STREAM_PROJECT  |PARTITIONED|
+                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                           -- RTREE_SEARCH (channels.Shelters.s_location)  |PARTITIONED|
+                                                                                             -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                                               -- ASSIGN  |PARTITIONED|
+                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                   -- NESTED_LOOP  |PARTITIONED|
+                                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                       -- NESTED_LOOP  |PARTITIONED|
+                                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                           -- ASSIGN  |PARTITIONED|
+                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                               -- DATASOURCE_SCAN (channels.EmergenciesNearMeChannelChannelSubscriptions)  |PARTITIONED|
+                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                                                         -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                                                           -- ASSIGN  |PARTITIONED|
+                                                                                                             -- STREAM_SELECT  |PARTITIONED|
+                                                                                                               -- ASSIGN  |PARTITIONED|
+                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                   -- BTREE_SEARCH (channels.Reports.Reports)  |PARTITIONED|
+                                                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
 -                                                                                                                      -- STABLE_SORT [$$259(ASC)]  |PARTITIONED|
++                                                                                                                      -- STABLE_SORT [$$274(ASC)]  |PARTITIONED|
+                                                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                           -- STREAM_PROJECT  |PARTITIONED|
+                                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                               -- BTREE_SEARCH (channels.Reports.report_time)  |PARTITIONED|
+                                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                                   -- ASSIGN  |PARTITIONED|
+                                                                                                                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                                                     -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                                                       -- ASSIGN  |PARTITIONED|
+                                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                           -- DATASOURCE_SCAN (channels.UserLocations)  |PARTITIONED|
+                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
 -                                                -- HASH_PARTITION_EXCHANGE [$$222]  |PARTITIONED|
++                                                -- HASH_PARTITION_EXCHANGE [$$237]  |PARTITIONED|
+                                                   -- ASSIGN  |PARTITIONED|
+                                                     -- STREAM_PROJECT  |PARTITIONED|
+                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
 -                                                        -- HYBRID_HASH_JOIN [$$233, $$235][$$224, $$225]  |PARTITIONED|
 -                                                          -- HASH_PARTITION_EXCHANGE [$$233, $$235]  |PARTITIONED|
++                                                        -- HYBRID_HASH_JOIN [$$248, $$250][$$239, $$240]  |PARTITIONED|
++                                                          -- HASH_PARTITION_EXCHANGE [$$248, $$250]  |PARTITIONED|
+                                                             -- STREAM_PROJECT  |PARTITIONED|
+                                                               -- ASSIGN  |PARTITIONED|
+                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                   -- DATASOURCE_SCAN (channels.EmergenciesNearMeChannelBrokerSubscriptions)  |PARTITIONED|
+                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                             -- STREAM_PROJECT  |PARTITIONED|
+                                                               -- ASSIGN  |PARTITIONED|
+                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                   -- DATASOURCE_SCAN (channels.Broker)  |PARTITIONED|
                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                       -- DATASOURCE_SCAN (channels.Broker)  |PARTITIONED|
-                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                           -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --cc asterixdb/asterix-app/src/test/resources/runtimets/results/misc/constant_folding/constant_folding.7.plan
index ef61aa3c05,52ccc4f648..c46d9ad10d
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/constant_folding/constant_folding.7.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/constant_folding/constant_folding.7.plan
@@@ -1,20 -1,18 +1,20 @@@
 -distribute result [$$16]
 +cardinality: 0.0
 +cost: 0.0
 +distribute result [$$17] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
  -- DISTRIBUTE_RESULT  |UNPARTITIONED|
 -  exchange
 +  exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
    -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-     project ([$$17]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-     -- STREAM_PROJECT  |UNPARTITIONED|
-       assign [$$17] <- [or(true, lt(get-year(current-date()), $$x))] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-       -- ASSIGN  |UNPARTITIONED|
 -    assign [$$16] <- [true]
++    assign [$$17] <- [true] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+     -- ASSIGN  |UNPARTITIONED|
 -      project ([])
++      project ([]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+       -- STREAM_PROJECT  |UNPARTITIONED|
 -        exchange
 +        exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
          -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
 -          order (ASC, $$x)
 +          order (ASC, $$x) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
            -- STABLE_SORT [$$x(ASC)]  |UNPARTITIONED|
 -            exchange
 +            exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
              -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
 -              unnest $$x <- range(1, 4)
 +              unnest $$x <- range(1, 4) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                -- UNNEST  |UNPARTITIONED|
 -                empty-tuple-source
 +                empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                  -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --cc asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.4.plan
index 79b71150d9,a4b2ce0e92..8d159b9264
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.4.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.4.plan
@@@ -1,28 -1,22 +1,24 @@@
 -distribute result [$$28]
 +cardinality: 1000000.0
 +cost: 1000000.0
 +distribute result [$$30] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
  -- DISTRIBUTE_RESULT  |PARTITIONED|
 -  exchange
 +  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
 -    project ([$$28])
 +    project ([$$30]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
      -- STREAM_PROJECT  |PARTITIONED|
-       exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
-       -- SORT_MERGE_EXCHANGE [$$32(ASC) ]  |PARTITIONED|
-         project ([$$30, $$32]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
 -      assign [$$28] <- [$$md.getField("name")]
++      assign [$$30] <- [$$md.getField("name")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+       -- ASSIGN  |PARTITIONED|
 -        project ([$$md])
++        project ([$$md]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
          -- STREAM_PROJECT  |PARTITIONED|
-           select (eq($$33, current-date())) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
-           -- STREAM_SELECT  |PARTITIONED|
-             assign [$$33] <- [current-date()] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-             -- ASSIGN  |PARTITIONED|
-               project ([$$32, $$30]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-               -- STREAM_PROJECT  |PARTITIONED|
-                 assign [$$30] <- [$$md.getField("name")] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                 -- ASSIGN  |PARTITIONED|
 -          exchange
 -          -- SORT_MERGE_EXCHANGE [$$30(ASC) ]  |PARTITIONED|
 -            select (neq(uuid(), uuid()))
++          exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
++          -- SORT_MERGE_EXCHANGE [$$32(ASC) ]  |PARTITIONED|
++            select (neq(uuid(), uuid())) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+             -- STREAM_SELECT  |PARTITIONED|
 -              exchange
++              exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
 -                data-scan []<-[$$30, $$md] <- test.MyDataset
++                data-scan []<-[$$32, $$md] <- test.MyDataset [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                 -- DATASOURCE_SCAN  |PARTITIONED|
 -                  exchange
 +                  exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                     data-scan []<-[$$32, $$md] <- test.MyDataset [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                     -- DATASOURCE_SCAN  |PARTITIONED|
-                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                         empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                         -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
 -                    empty-tuple-source
++                    empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --cc asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.6.plan
index 0000000000,600472738a..abd19fdd99
mode 000000,100644..100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.6.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.6.plan
@@@ -1,0 -1,22 +1,24 @@@
 -distribute result [$$28]
++cardinality: 1000000.0
++cost: 1000000.0
++distribute result [$$30] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+ -- DISTRIBUTE_RESULT  |PARTITIONED|
 -  exchange
++  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
 -    project ([$$28])
++    project ([$$30]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+     -- STREAM_PROJECT  |PARTITIONED|
 -      assign [$$28] <- [$$md.getField("name")]
++      assign [$$30] <- [$$md.getField("name")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+       -- ASSIGN  |PARTITIONED|
 -        project ([$$md])
++        project ([$$md]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+         -- STREAM_PROJECT  |PARTITIONED|
 -          exchange
 -          -- SORT_MERGE_EXCHANGE [$$30(ASC) ]  |PARTITIONED|
 -            select (neq(current-date(), date: { 1980-09-10 }))
++          exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
++          -- SORT_MERGE_EXCHANGE [$$32(ASC) ]  |PARTITIONED|
++            select (neq(current-date(), date: { 1980-09-10 })) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+             -- STREAM_SELECT  |PARTITIONED|
 -              exchange
++              exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
 -                data-scan []<-[$$30, $$md] <- test.MyDataset
++                data-scan []<-[$$32, $$md] <- test.MyDataset [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                 -- DATASOURCE_SCAN  |PARTITIONED|
 -                  exchange
++                  exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
 -                    empty-tuple-source
++                    empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|


[asterixdb] 04/07: [ASTERIXDB-3103][COMP] Extract non-pure functions

Posted by mb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit eede5bf7d1553b3275cf06d4f41572a8215368eb
Author: Wail Alkowaileet <wa...@couchbase.com>
AuthorDate: Sat Feb 4 08:43:56 2023 -0800

    [ASTERIXDB-3103][COMP] Extract non-pure functions
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    Currently, the SQL++ translator aggressively inlines all
    functions, including non-pure ones. This inlining could
    lead to producing multiple calls to non-pure functions
    where it should be a single call, and its value should
    be referenced instead.
    
    Change-Id: I59c524a109ef8e18a11844a96b690eac115b27f0
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17300
    Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Reviewed-by: Ali Alsuliman <al...@gmail.com>
---
 .../translator/LangExpressionToPlanTranslator.java |  51 +++--
 .../optimizerts/results/ASTERIXDB-2402.plan        | 223 ++++++++++-----------
 .../results/joins/nested_query_with_bcast.plan     |  40 ++--
 .../insert-primary-key-index-with-auto-gen-pk.plan |   6 +-
 .../limit-non-pure-function.1.query.sqlpp}         |  11 +-
 .../limit-non-pure-function.2.query.sqlpp}         |  10 +-
 .../constant_folding.7.query.sqlpp                 |   4 +
 .../load-record-fields.3.query.sqlpp               |   4 +-
 .../load-record-fields.4.query.sqlpp               |   4 +-
 ...uery.sqlpp => load-record-fields.5.query.sqlpp} |   2 +-
 ...uery.sqlpp => load-record-fields.6.query.sqlpp} |   2 +-
 .../limit-non-pure-function.1.plan                 |  14 ++
 .../limit-non-pure-function.2.plan                 |  18 ++
 .../misc/constant_folding/constant_folding.7.plan  |  10 +-
 .../load-record-fields/load-record-fields.4.plan   |  30 ++-
 .../load-record-fields/load-record-fields.5.adm    |   2 +
 .../load-record-fields/load-record-fields.6.plan   |  22 ++
 .../visitors/IsomorphismOperatorVisitor.java       |   4 +-
 .../rules/InlineSingleReferenceVariablesRule.java  |   3 +-
 .../rewriter/rules/InlineVariablesRule.java        |  69 ++++++-
 20 files changed, 325 insertions(+), 204 deletions(-)

diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
index 794a0b7db7..daa1d2f7fb 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
@@ -1716,8 +1716,7 @@ abstract class LangExpressionToPlanTranslator
             default:
                 if (expressionNeedsNoNesting(expr)) {
                     Pair<ILogicalOperator, LogicalVariable> p = expr.accept(this, topOpRef);
-                    ILogicalExpression exp = ((AssignOperator) p.first).getExpressions().get(0).getValue();
-                    return new Pair<>(exp, p.first.getInputs().get(0));
+                    return inlineAssignIfPossible((AssignOperator) p.first);
                 } else {
                     Mutable<ILogicalOperator> srcRef = new MutableObject<>();
                     Pair<ILogicalOperator, LogicalVariable> p = expr.accept(this, srcRef);
@@ -1749,6 +1748,32 @@ abstract class LangExpressionToPlanTranslator
         }
     }
 
+    /**
+     * TODO(wyk) I believe that inlining expressions should be done at the optimization level and not at the translation
+     *  level. By inlining at the translation level, we could possibly miss optimizing inlined expressions in rules
+     *  that do not inspect arguments of a function. I kept inlining all pure (a.k.a functional) functions for now to
+     *  match the previous behavior. For non-pure functions, the assign should be kept as we do not inline them at
+     *  first due to ASTERIXDB-3103
+     *
+     * @see org.apache.hyracks.algebricks.rewriter.rules.InlineVariablesRule
+     */
+    private Pair<ILogicalExpression, Mutable<ILogicalOperator>> inlineAssignIfPossible(AssignOperator assignOp) {
+        ILogicalExpression expr = assignOp.getExpressions().get(0).getValue();
+
+        if (expr.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) {
+            return new Pair<>(expr, assignOp.getInputs().get(0));
+        }
+
+        AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) expr;
+        if (funcExpr.isFunctional()) {
+            return new Pair<>(expr, assignOp.getInputs().get(0));
+        }
+
+        //Do not inline non-functional expressions (e.g. uuid()) and keep the assign
+        return new Pair<>(new VariableReferenceExpression(assignOp.getVariables().get(0)),
+                new MutableObject<>(assignOp));
+    }
+
     protected Pair<ILogicalOperator, LogicalVariable> aggListifyForSubquery(LogicalVariable var,
             Mutable<ILogicalOperator> opRef, boolean bProject) {
         SourceLocation sourceLoc = opRef.getValue().getSourceLocation();
@@ -1902,8 +1927,7 @@ abstract class LangExpressionToPlanTranslator
      * Eliminate shared operator references in a query plan. Deep copy a new query
      * plan subtree whenever there is a shared operator reference.
      *
-     * @param plan,
-     *            the query plan.
+     * @param plan, the query plan.
      * @throws CompilationException
      */
     protected void eliminateSharedOperatorReferenceForPlan(ILogicalPlan plan) throws CompilationException {
@@ -1918,12 +1942,10 @@ abstract class LangExpressionToPlanTranslator
      * <code>currentOpRef.getValue()</code>. Deep copy a new query plan subtree
      * whenever there is a shared operator reference.
      *
-     * @param currentOpRef,
-     *            the operator reference to consider
-     * @param opRefSet,
-     *            the set storing seen operator references so far.
+     * @param currentOpRef, the operator reference to consider
+     * @param opRefSet,     the set storing seen operator references so far.
      * @return a mapping that maps old variables to new variables, for the ancestors
-     *         of <code>currentOpRef</code> to replace variables properly.
+     * of <code>currentOpRef</code> to replace variables properly.
      * @throws CompilationException
      */
     private LinkedHashMap<LogicalVariable, LogicalVariable> eliminateSharedOperatorReference(
@@ -2005,14 +2027,11 @@ abstract class LangExpressionToPlanTranslator
     /**
      * Constructs a subplan operator for a branch in a if-else (or case) expression.
      *
-     * @param inputOp,
-     *            the input operator.
-     * @param selectExpr,
-     *            the expression to select tuples that are processed by this branch.
-     * @param branchExpression,
-     *            the expression to be evaluated in this branch.
+     * @param inputOp,          the input operator.
+     * @param selectExpr,       the expression to select tuples that are processed by this branch.
+     * @param branchExpression, the expression to be evaluated in this branch.
      * @return a pair of the constructed subplan operator and the output variable
-     *         for the branch.
+     * for the branch.
      * @throws CompilationException
      */
     protected Pair<ILogicalOperator, LogicalVariable> constructSubplanOperatorForBranch(ILogicalOperator inputOp,
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/ASTERIXDB-2402.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/ASTERIXDB-2402.plan
index 6b489417c6..efd14f7463 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/ASTERIXDB-2402.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/ASTERIXDB-2402.plan
@@ -34,98 +34,48 @@
                           -- STREAM_PROJECT  |PARTITIONED|
                             -- ASSIGN  |PARTITIONED|
                               -- STREAM_PROJECT  |PARTITIONED|
-                                -- ASSIGN  |PARTITIONED|
-                                  -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- PRE_CLUSTERED_GROUP_BY[$$252]  |PARTITIONED|
+                                          {
+                                            -- AGGREGATE  |LOCAL|
+                                              -- STREAM_SELECT  |LOCAL|
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          }
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      -- PRE_CLUSTERED_GROUP_BY[$$253]  |PARTITIONED|
-                                              {
-                                                -- AGGREGATE  |LOCAL|
-                                                  -- STREAM_SELECT  |LOCAL|
-                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                              }
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- STABLE_SORT [$$253(ASC)]  |PARTITIONED|
-                                            -- HASH_PARTITION_EXCHANGE [$$253]  |PARTITIONED|
-                                              -- STREAM_PROJECT  |PARTITIONED|
+                                      -- STABLE_SORT [$$252(ASC)]  |PARTITIONED|
+                                        -- HASH_PARTITION_EXCHANGE [$$252]  |PARTITIONED|
+                                          -- STREAM_PROJECT  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- HYBRID_HASH_JOIN [$$251][$$222]  |PARTITIONED|
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  -- HYBRID_HASH_JOIN [$$309][$$222]  |PARTITIONED|
-                                                    -- HASH_PARTITION_EXCHANGE [$$309]  |PARTITIONED|
-                                                      -- RUNNING_AGGREGATE  |PARTITIONED|
-                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                          -- UNNEST  |PARTITIONED|
-                                                            -- STREAM_PROJECT  |PARTITIONED|
-                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                -- PRE_CLUSTERED_GROUP_BY[$$317]  |PARTITIONED|
-                                                                        {
-                                                                          -- AGGREGATE  |LOCAL|
-                                                                            -- MICRO_PRE_CLUSTERED_GROUP_BY[$$319, $$321]  |LOCAL|
-                                                                                    {
-                                                                                      -- AGGREGATE  |LOCAL|
-                                                                                        -- STREAM_SELECT  |LOCAL|
-                                                                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                                                    }
-                                                                              -- STREAM_SELECT  |LOCAL|
-                                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                                        }
-                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                    -- STABLE_SORT [$$317(ASC), $$319(ASC), $$321(ASC)]  |PARTITIONED|
-                                                                      -- HASH_PARTITION_EXCHANGE [$$317]  |PARTITIONED|
-                                                                        -- UNION_ALL  |PARTITIONED|
-                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                            -- STREAM_PROJECT  |PARTITIONED|
-                                                                              -- STREAM_SELECT  |PARTITIONED|
-                                                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                                                  -- ASSIGN  |PARTITIONED|
-                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                      -- BTREE_SEARCH (channels.Shelters.Shelters)  |PARTITIONED|
-                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                          -- STREAM_PROJECT  |PARTITIONED|
-                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                              -- SPLIT  |PARTITIONED|
-                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                      -- RTREE_SEARCH (channels.Shelters.s_location)  |PARTITIONED|
-                                                                                                        -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                                          -- ASSIGN  |PARTITIONED|
-                                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                              -- NESTED_LOOP  |PARTITIONED|
-                                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                  -- NESTED_LOOP  |PARTITIONED|
-                                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                      -- RUNNING_AGGREGATE  |PARTITIONED|
-                                                                                                                        -- ASSIGN  |PARTITIONED|
-                                                                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                            -- DATASOURCE_SCAN (channels.EmergenciesNearMeChannelChannelSubscriptions)  |PARTITIONED|
-                                                                                                                              -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                                                                -- ASSIGN  |UNPARTITIONED|
-                                                                                                                                  -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
-                                                                                                                    -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                                                      -- ASSIGN  |PARTITIONED|
-                                                                                                                        -- STREAM_SELECT  |PARTITIONED|
-                                                                                                                          -- ASSIGN  |PARTITIONED|
-                                                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                              -- BTREE_SEARCH (channels.Reports.Reports)  |PARTITIONED|
-                                                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                  -- STABLE_SORT [$$260(ASC)]  |PARTITIONED|
-                                                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                      -- STREAM_PROJECT  |PARTITIONED|
-                                                                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                          -- BTREE_SEARCH (channels.Reports.report_time)  |PARTITIONED|
-                                                                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                              -- ASSIGN  |PARTITIONED|
-                                                                                                                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                                                  -- ASSIGN  |PARTITIONED|
-                                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                      -- DATASOURCE_SCAN (channels.UserLocations)  |PARTITIONED|
-                                                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                            -- STREAM_PROJECT  |PARTITIONED|
-                                                                              -- STREAM_SELECT  |PARTITIONED|
-                                                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                                                  -- ASSIGN  |PARTITIONED|
+                                                  -- RUNNING_AGGREGATE  |PARTITIONED|
+                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                      -- UNNEST  |PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                          -- PRE_CLUSTERED_GROUP_BY[$$313]  |PARTITIONED|
+                                                                  {
+                                                                    -- AGGREGATE  |LOCAL|
+                                                                      -- MICRO_PRE_CLUSTERED_GROUP_BY[$$315, $$316]  |LOCAL|
+                                                                              {
+                                                                                -- AGGREGATE  |LOCAL|
+                                                                                  -- STREAM_SELECT  |LOCAL|
+                                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                              }
+                                                                        -- STREAM_SELECT  |LOCAL|
+                                                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                  }
+                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                              -- STABLE_SORT [$$313(ASC), $$315(ASC), $$316(ASC)]  |PARTITIONED|
+                                                                -- HASH_PARTITION_EXCHANGE [$$313]  |PARTITIONED|
+                                                                  -- UNION_ALL  |PARTITIONED|
+                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                                        -- STREAM_SELECT  |PARTITIONED|
+                                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                                            -- ASSIGN  |PARTITIONED|
+                                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                -- BTREE_SEARCH (channels.Shelters.Shelters)  |PARTITIONED|
+                                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                     -- STREAM_PROJECT  |PARTITIONED|
                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                         -- SPLIT  |PARTITIONED|
@@ -140,13 +90,11 @@
                                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                             -- NESTED_LOOP  |PARTITIONED|
                                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                -- RUNNING_AGGREGATE  |PARTITIONED|
-                                                                                                                  -- ASSIGN  |PARTITIONED|
-                                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                      -- DATASOURCE_SCAN (channels.EmergenciesNearMeChannelChannelSubscriptions)  |PARTITIONED|
-                                                                                                                        -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                                                          -- ASSIGN  |UNPARTITIONED|
-                                                                                                                            -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                                                                                                                -- ASSIGN  |PARTITIONED|
+                                                                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                    -- DATASOURCE_SCAN (channels.EmergenciesNearMeChannelChannelSubscriptions)  |PARTITIONED|
+                                                                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                                                                               -- BROADCAST_EXCHANGE  |PARTITIONED|
                                                                                                                 -- ASSIGN  |PARTITIONED|
                                                                                                                   -- STREAM_SELECT  |PARTITIONED|
@@ -154,7 +102,7 @@
                                                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                                         -- BTREE_SEARCH (channels.Reports.Reports)  |PARTITIONED|
                                                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                            -- STABLE_SORT [$$260(ASC)]  |PARTITIONED|
+                                                                                                                            -- STABLE_SORT [$$259(ASC)]  |PARTITIONED|
                                                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -168,22 +116,67 @@
                                                                                                                 -- DATASOURCE_SCAN (channels.UserLocations)  |PARTITIONED|
                                                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                    -- HASH_PARTITION_EXCHANGE [$$222]  |PARTITIONED|
-                                                      -- ASSIGN  |PARTITIONED|
-                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            -- HYBRID_HASH_JOIN [$$233, $$235][$$224, $$225]  |PARTITIONED|
-                                                              -- HASH_PARTITION_EXCHANGE [$$233, $$235]  |PARTITIONED|
-                                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                                  -- ASSIGN  |PARTITIONED|
                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- DATASOURCE_SCAN (channels.EmergenciesNearMeChannelBrokerSubscriptions)  |PARTITIONED|
-                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                                  -- ASSIGN  |PARTITIONED|
+                                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                                        -- STREAM_SELECT  |PARTITIONED|
+                                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                                            -- ASSIGN  |PARTITIONED|
+                                                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                  -- SPLIT  |PARTITIONED|
+                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                          -- RTREE_SEARCH (channels.Shelters.s_location)  |PARTITIONED|
+                                                                                            -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                                              -- ASSIGN  |PARTITIONED|
+                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                  -- NESTED_LOOP  |PARTITIONED|
+                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                      -- NESTED_LOOP  |PARTITIONED|
+                                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                          -- ASSIGN  |PARTITIONED|
+                                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                              -- DATASOURCE_SCAN (channels.EmergenciesNearMeChannelChannelSubscriptions)  |PARTITIONED|
+                                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                                                        -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                                                          -- ASSIGN  |PARTITIONED|
+                                                                                                            -- STREAM_SELECT  |PARTITIONED|
+                                                                                                              -- ASSIGN  |PARTITIONED|
+                                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                  -- BTREE_SEARCH (channels.Reports.Reports)  |PARTITIONED|
+                                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                      -- STABLE_SORT [$$259(ASC)]  |PARTITIONED|
+                                                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                              -- BTREE_SEARCH (channels.Reports.report_time)  |PARTITIONED|
+                                                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                                  -- ASSIGN  |PARTITIONED|
+                                                                                                                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                                                    -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                                                      -- ASSIGN  |PARTITIONED|
+                                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                          -- DATASOURCE_SCAN (channels.UserLocations)  |PARTITIONED|
+                                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                -- HASH_PARTITION_EXCHANGE [$$222]  |PARTITIONED|
+                                                  -- ASSIGN  |PARTITIONED|
+                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                        -- HYBRID_HASH_JOIN [$$233, $$235][$$224, $$225]  |PARTITIONED|
+                                                          -- HASH_PARTITION_EXCHANGE [$$233, $$235]  |PARTITIONED|
+                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                              -- ASSIGN  |PARTITIONED|
+                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  -- DATASOURCE_SCAN (channels.EmergenciesNearMeChannelBrokerSubscriptions)  |PARTITIONED|
+                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                              -- ASSIGN  |PARTITIONED|
+                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  -- DATASOURCE_SCAN (channels.Broker)  |PARTITIONED|
                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- DATASOURCE_SCAN (channels.Broker)  |PARTITIONED|
-                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/joins/nested_query_with_bcast.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/joins/nested_query_with_bcast.plan
index 075f7af501..15c163dec4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/joins/nested_query_with_bcast.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/joins/nested_query_with_bcast.plan
@@ -9,31 +9,29 @@
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- ASSIGN  |PARTITIONED|
                     -- STREAM_PROJECT  |PARTITIONED|
-                      -- ASSIGN  |PARTITIONED|
-                        -- STREAM_PROJECT  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- PRE_CLUSTERED_GROUP_BY[$$38]  |PARTITIONED|
+                                {
+                                  -- AGGREGATE  |LOCAL|
+                                    -- STREAM_SELECT  |LOCAL|
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                }
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- PRE_CLUSTERED_GROUP_BY[$$38]  |PARTITIONED|
-                                    {
-                                      -- AGGREGATE  |LOCAL|
-                                        -- STREAM_SELECT  |LOCAL|
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                    }
+                            -- STABLE_SORT [$$38(ASC)]  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                -- STABLE_SORT [$$38(ASC)]  |PARTITIONED|
+                                -- STREAM_PROJECT  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    -- STREAM_PROJECT  |PARTITIONED|
+                                    -- HYBRID_HASH_JOIN [$$41][$$39]  |PARTITIONED|
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- HYBRID_HASH_JOIN [$$41][$$39]  |PARTITIONED|
+                                        -- ASSIGN  |PARTITIONED|
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- ASSIGN  |PARTITIONED|
+                                            -- DATASOURCE_SCAN (test.tweetDataset)  |PARTITIONED|
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                -- DATASOURCE_SCAN (test.tweetDataset)  |PARTITIONED|
-                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                          -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                            -- STREAM_PROJECT  |PARTITIONED|
-                                              -- ASSIGN  |PARTITIONED|
+                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                        -- STREAM_PROJECT  |PARTITIONED|
+                                          -- ASSIGN  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- DATASOURCE_SCAN (test.countryDataset)  |PARTITIONED|
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  -- DATASOURCE_SCAN (test.countryDataset)  |PARTITIONED|
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/primary-key-index/insert-primary-key-index-with-auto-gen-pk.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/primary-key-index/insert-primary-key-index-with-auto-gen-pk.plan
index 792b79d1bd..9a296a5e1c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/primary-key-index/insert-primary-key-index-with-auto-gen-pk.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/primary-key-index/insert-primary-key-index-with-auto-gen-pk.plan
@@ -6,7 +6,5 @@
           -- ASSIGN  |UNPARTITIONED|
             -- STREAM_PROJECT  |UNPARTITIONED|
               -- ASSIGN  |UNPARTITIONED|
-                -- STREAM_PROJECT  |UNPARTITIONED|
-                  -- ASSIGN  |UNPARTITIONED|
-                    -- ASSIGN  |UNPARTITIONED|
-                      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                -- ASSIGN  |UNPARTITIONED|
+                  -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/constant_folding/constant_folding.7.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/limit-non-pure-function/limit-non-pure-function.1.query.sqlpp
similarity index 82%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/constant_folding/constant_folding.7.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/limit-non-pure-function/limit-non-pure-function.1.query.sqlpp
index 517a996a2b..c23e98cb6d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/constant_folding/constant_folding.7.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/limit-non-pure-function/limit-non-pure-function.1.query.sqlpp
@@ -17,10 +17,7 @@
  * under the License.
  */
 
-/*
- * Description: No constant folding of OR with a non functional argument
- */
-
-explain select value true or get_year(current_date()) < x
-from range(1, 4) x
-order by x;
\ No newline at end of file
+EXPLAIN
+SELECT VALUE A
+FROM [1, 2, 3] AS A
+LIMIT random()
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/constant_folding/constant_folding.7.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/limit-non-pure-function/limit-non-pure-function.2.query.sqlpp
similarity index 83%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/constant_folding/constant_folding.7.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/limit-non-pure-function/limit-non-pure-function.2.query.sqlpp
index 517a996a2b..9c995e0597 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/constant_folding/constant_folding.7.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/limit-non-pure-function/limit-non-pure-function.2.query.sqlpp
@@ -18,9 +18,11 @@
  */
 
 /*
- * Description: No constant folding of OR with a non functional argument
+ * Description: Make sure that the call to random() (rand) is not inlined
  */
 
-explain select value true or get_year(current_date()) < x
-from range(1, 4) x
-order by x;
\ No newline at end of file
+EXPLAIN
+WITH rand AS random()
+SELECT A, rand
+FROM [1, 2, 3] AS A
+LIMIT rand
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/constant_folding/constant_folding.7.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/constant_folding/constant_folding.7.query.sqlpp
index 517a996a2b..dfb47e90e9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/constant_folding/constant_folding.7.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/constant_folding/constant_folding.7.query.sqlpp
@@ -19,6 +19,10 @@
 
 /*
  * Description: No constant folding of OR with a non functional argument
+ *
+ * Update/note: this should be folded as the non functional argument would short-circuited in runtime. Due to
+ * ASTERIXDB-3103, the constant folding rule doesn't see a non functional argument, but a variable. Hence,
+ * the expression 'get_year(current_date()) < x' is eliminated
  */
 
 explain select value true or get_year(current_date()) < x
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.3.query.sqlpp
index 278f5d2b1e..1ed0c05586 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.3.query.sqlpp
@@ -25,6 +25,6 @@ SET `compiler.sort.parallel` "false";
 
 SELECT VALUE md.name
 FROM MyDataset md
-LET currentData = {"myDate": current_date()}
-WHERE currentData.myDate = current_date()
+LET myObject = {"myUid": uuid()}
+WHERE myObject.myUid != uuid()
 ORDER BY md.id
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.4.query.sqlpp
index f44921f99b..96095b4f69 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.4.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.4.query.sqlpp
@@ -25,6 +25,6 @@ SET `compiler.sort.parallel` "false";
 EXPLAIN
 SELECT VALUE md.name
 FROM MyDataset md
-LET currentData = {"myDate": current_date()}
-WHERE currentData.myDate = current_date()
+LET myObject = {"myUid": uuid()}
+WHERE myObject.myUid != uuid()
 ORDER BY md.id
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.5.query.sqlpp
similarity index 95%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.3.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.5.query.sqlpp
index 278f5d2b1e..60f5d4b136 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.5.query.sqlpp
@@ -26,5 +26,5 @@ SET `compiler.sort.parallel` "false";
 SELECT VALUE md.name
 FROM MyDataset md
 LET currentData = {"myDate": current_date()}
-WHERE currentData.myDate = current_date()
+WHERE currentData.myDate != date("1980-09-10")
 ORDER BY md.id
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.6.query.sqlpp
similarity index 95%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.4.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.6.query.sqlpp
index f44921f99b..5dae0bc81c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.4.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/objects/load-record-fields/load-record-fields.6.query.sqlpp
@@ -26,5 +26,5 @@ EXPLAIN
 SELECT VALUE md.name
 FROM MyDataset md
 LET currentData = {"myDate": current_date()}
-WHERE currentData.myDate = current_date()
+WHERE currentData.myDate != date("1980-09-10")
 ORDER BY md.id
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/limit-non-pure-function/limit-non-pure-function.1.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/limit-non-pure-function/limit-non-pure-function.1.plan
new file mode 100644
index 0000000000..d5f6401e58
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/limit-non-pure-function/limit-non-pure-function.1.plan
@@ -0,0 +1,14 @@
+distribute result [$$A]
+-- DISTRIBUTE_RESULT  |UNPARTITIONED|
+  exchange
+  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+    project ([$$A])
+    -- STREAM_PROJECT  |UNPARTITIONED|
+      limit switch-case(gt($$13, 0), true, $$13, 0)
+      -- STREAM_LIMIT  |UNPARTITIONED|
+        assign [$$13] <- [treat-as-integer(random())]
+        -- ASSIGN  |UNPARTITIONED|
+          unnest $$A <- scan-collection(array: [ 1, 2, 3 ])
+          -- UNNEST  |UNPARTITIONED|
+            empty-tuple-source
+            -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/limit-non-pure-function/limit-non-pure-function.2.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/limit-non-pure-function/limit-non-pure-function.2.plan
new file mode 100644
index 0000000000..54efcb6035
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/limit-non-pure-function/limit-non-pure-function.2.plan
@@ -0,0 +1,18 @@
+distribute result [$$24]
+-- DISTRIBUTE_RESULT  |UNPARTITIONED|
+  exchange
+  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+    project ([$$24])
+    -- STREAM_PROJECT  |UNPARTITIONED|
+      limit switch-case(gt($$25, 0), true, $$25, 0)
+      -- STREAM_LIMIT  |UNPARTITIONED|
+        project ([$$25, $$24])
+        -- STREAM_PROJECT  |UNPARTITIONED|
+          assign [$$25, $$24] <- [treat-as-integer($$21), {"A": $$A, "rand": $$21}]
+          -- ASSIGN  |UNPARTITIONED|
+            unnest $$A <- scan-collection(array: [ 1, 2, 3 ])
+            -- UNNEST  |UNPARTITIONED|
+              assign [$$21] <- [random()]
+              -- ASSIGN  |UNPARTITIONED|
+                empty-tuple-source
+                -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/constant_folding/constant_folding.7.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/constant_folding/constant_folding.7.plan
index 775cc2a6c6..52ccc4f648 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/constant_folding/constant_folding.7.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/constant_folding/constant_folding.7.plan
@@ -2,10 +2,10 @@ distribute result [$$16]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$16])
-    -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$16] <- [or(true, lt(get-year(current-date()), $$x))]
-      -- ASSIGN  |UNPARTITIONED|
+    assign [$$16] <- [true]
+    -- ASSIGN  |UNPARTITIONED|
+      project ([])
+      -- STREAM_PROJECT  |UNPARTITIONED|
         exchange
         -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
           order (ASC, $$x)
@@ -15,4 +15,4 @@ distribute result [$$16]
               unnest $$x <- range(1, 4)
               -- UNNEST  |UNPARTITIONED|
                 empty-tuple-source
-                -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
\ No newline at end of file
+                -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.4.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.4.plan
index 5ac69f34ba..a4b2ce0e92 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.4.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.4.plan
@@ -4,23 +4,19 @@ distribute result [$$28]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     project ([$$28])
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange
-      -- SORT_MERGE_EXCHANGE [$$30(ASC) ]  |PARTITIONED|
-        project ([$$28, $$30])
+      assign [$$28] <- [$$md.getField("name")]
+      -- ASSIGN  |PARTITIONED|
+        project ([$$md])
         -- STREAM_PROJECT  |PARTITIONED|
-          select (eq($$31, current-date()))
-          -- STREAM_SELECT  |PARTITIONED|
-            assign [$$31] <- [current-date()]
-            -- ASSIGN  |PARTITIONED|
-              project ([$$30, $$28])
-              -- STREAM_PROJECT  |PARTITIONED|
-                assign [$$28] <- [$$md.getField("name")]
-                -- ASSIGN  |PARTITIONED|
+          exchange
+          -- SORT_MERGE_EXCHANGE [$$30(ASC) ]  |PARTITIONED|
+            select (neq(uuid(), uuid()))
+            -- STREAM_SELECT  |PARTITIONED|
+              exchange
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                data-scan []<-[$$30, $$md] <- test.MyDataset
+                -- DATASOURCE_SCAN  |PARTITIONED|
                   exchange
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$30, $$md] <- test.MyDataset
-                    -- DATASOURCE_SCAN  |PARTITIONED|
-                      exchange
-                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        empty-tuple-source
-                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                    empty-tuple-source
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.5.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.5.adm
new file mode 100644
index 0000000000..ac2dc970eb
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.5.adm
@@ -0,0 +1,2 @@
+"Alice"
+"Bob"
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.6.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.6.plan
new file mode 100644
index 0000000000..600472738a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/objects/load-record-fields/load-record-fields.6.plan
@@ -0,0 +1,22 @@
+distribute result [$$28]
+-- DISTRIBUTE_RESULT  |PARTITIONED|
+  exchange
+  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+    project ([$$28])
+    -- STREAM_PROJECT  |PARTITIONED|
+      assign [$$28] <- [$$md.getField("name")]
+      -- ASSIGN  |PARTITIONED|
+        project ([$$md])
+        -- STREAM_PROJECT  |PARTITIONED|
+          exchange
+          -- SORT_MERGE_EXCHANGE [$$30(ASC) ]  |PARTITIONED|
+            select (neq(current-date(), date: { 1980-09-10 }))
+            -- STREAM_SELECT  |PARTITIONED|
+              exchange
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                data-scan []<-[$$30, $$md] <- test.MyDataset
+                -- DATASOURCE_SCAN  |PARTITIONED|
+                  exchange
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    empty-tuple-source
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java
index e4df39724d..b44607513d 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java
@@ -249,8 +249,8 @@ public class IsomorphismOperatorVisitor implements ILogicalOperatorVisitor<Boole
             return Boolean.FALSE;
         }
         OrderOperator orderOpArg = (OrderOperator) copyAndSubstituteVar(op, arg);
-        boolean isomorphic = compareIOrderAndExpressions(op.getOrderExpressions(), orderOpArg.getOrderExpressions());
-        return isomorphic;
+        return op.getTopK() == orderOpArg.getTopK()
+                && compareIOrderAndExpressions(op.getOrderExpressions(), orderOpArg.getOrderExpressions());
     }
 
     @Override
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineSingleReferenceVariablesRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineSingleReferenceVariablesRule.java
index f072312f54..be169f42d6 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineSingleReferenceVariablesRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineSingleReferenceVariablesRule.java
@@ -27,7 +27,6 @@ import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
 import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
 import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
-import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.VariableUtilities;
 
 /**
@@ -83,7 +82,7 @@ public class InlineSingleReferenceVariablesRule extends InlineVariablesRule {
     }
 
     @Override
-    protected boolean performBottomUpAction(AbstractLogicalOperator op) throws AlgebricksException {
+    protected boolean performBottomUpAction(ILogicalOperator op) throws AlgebricksException {
         usedVars.clear();
         VariableUtilities.getUsedVariables(op, usedVars);
         for (LogicalVariable var : usedVars) {
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineVariablesRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineVariablesRule.java
index cec830ed45..6ad50e6340 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineVariablesRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineVariablesRule.java
@@ -26,6 +26,7 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.commons.lang3.mutable.MutableInt;
 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;
@@ -37,7 +38,6 @@ import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
 import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
 import org.apache.hyracks.algebricks.core.algebra.expressions.VariableReferenceExpression;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
-import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractOperatorWithNestedPlans;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.AssignOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.WindowOperator;
@@ -80,6 +80,10 @@ public class InlineVariablesRule implements IAlgebraicRewriteRule {
     // set to prevent re-visiting a subtree from the other sides. Operators with multiple outputs are the ones that
     // could be re-visited twice or more (e.g. replicate and split operators)
     private final Map<ILogicalOperator, Boolean> subTreesDone = new HashMap<>();
+    // temporary set to get used variables
+    private final List<LogicalVariable> usedVars = new ArrayList<>();
+    // map of variables and the counts of how many times they were used
+    private final Map<LogicalVariable, MutableInt> usedVariableCounter = new HashMap<>();
 
     @Override
     public boolean rewritePost(Mutable<ILogicalOperator> opRef, IOptimizationContext context) {
@@ -108,9 +112,10 @@ public class InlineVariablesRule implements IAlgebraicRewriteRule {
         varAssignRhs.clear();
         inlineVisitor.setContext(context);
         subTreesDone.clear();
+        usedVariableCounter.clear();
     }
 
-    protected boolean performBottomUpAction(AbstractLogicalOperator op) throws AlgebricksException {
+    protected boolean performBottomUpAction(ILogicalOperator op) throws AlgebricksException {
         // Only inline variables in operators that can deal with arbitrary expressions.
         if (!op.requiresVariableReferenceExpressions()) {
             inlineVisitor.setOperator(op);
@@ -125,27 +130,33 @@ public class InlineVariablesRule implements IAlgebraicRewriteRule {
 
     private boolean inlineVariables(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
             throws AlgebricksException {
-        AbstractLogicalOperator op = (AbstractLogicalOperator) opRef.getValue();
+        ILogicalOperator op = opRef.getValue();
 
         // check if you have already visited the subtree rooted at this operator
         if (subTreesDone.containsKey(op)) {
             return subTreesDone.get(op);
         }
+
+        // compute how many times a variable was used
+        computeUsedVariableCount(op);
+
         // Update mapping from variables to expressions during top-down traversal.
         if (op.getOperatorTag() == LogicalOperatorTag.ASSIGN) {
             AssignOperator assignOp = (AssignOperator) op;
             List<LogicalVariable> vars = assignOp.getVariables();
             List<Mutable<ILogicalExpression>> exprs = assignOp.getExpressions();
             for (int i = 0; i < vars.size(); i++) {
+                LogicalVariable variable = vars.get(i);
                 ILogicalExpression expr = exprs.get(i).getValue();
                 // Ignore functions that are either in the doNotInline set or are non-functional
                 if (expr.getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) {
                     AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) expr;
-                    if (doNotInlineFuncs.contains(funcExpr.getFunctionIdentifier()) || !funcExpr.isFunctional()) {
+                    if (doNotInlineFuncs.contains(funcExpr.getFunctionIdentifier())
+                            || skipNonFunctional(variable, funcExpr)) {
                         continue;
                     }
                 }
-                varAssignRhs.put(vars.get(i), exprs.get(i).getValue());
+                varAssignRhs.put(variable, expr);
             }
         }
 
@@ -200,6 +211,54 @@ public class InlineVariablesRule implements IAlgebraicRewriteRule {
         return modified;
     }
 
+    /**
+     * Skip inlining non-pure functions if they are referenced more than once.
+     *
+     * @param variable assigned to the function
+     * @param expr     of the assigned variable (potentially a non-pure one)
+     * @return true if inlining should be skipped, false if the non-pure functions can be inlined
+     */
+    private boolean skipNonFunctional(LogicalVariable variable, AbstractFunctionCallExpression expr) {
+        return !expr.isFunctional() && usedVariableCounter.containsKey(variable)
+                && usedVariableCounter.get(variable).getValue() > 1;
+    }
+
+    /**
+     * Computes how many times the variables in the plan were used. The variable counts
+     * help to determine if whether we can inline non-pure functions (e.g., current_date()) or not.
+     * Inlining non-pure functions can help unlocking other optimizations. For instance, we can pushdown
+     * limits and selects into data-scans or avoid create_query_uuid().
+     * <p>
+     * Non-pure functions can only be inlined if they were referenced once. For example,
+     * in the following plan, the function current_date() (or variable $$x) can be inlined as it was used
+     * once by select:
+     * <p>
+     * Before:
+     * select (get_year($$x) > 2000)
+     * * assign [$$x] <- [current_date()]
+     * After:
+     * select (get_year(current_date()) > 2000)
+     * <p>
+     * However, the following current_date() (or variable $$x) cannot be inlined as it referenced twice:
+     * select (get_year($$x) > 2000 && get_month($$x) == 11)
+     * * assign [$$x] <- [current_date()]
+     *
+     * @param op the logical operator that potentially uses one or more variables
+     */
+    private void computeUsedVariableCount(ILogicalOperator op) throws AlgebricksException {
+        if (op.getOperatorTag() == LogicalOperatorTag.SUBPLAN) {
+            // to avoid count a variable twice as this routine traverses the subplan
+            return;
+        }
+
+        usedVars.clear();
+        VariableUtilities.getUsedVariables(op, usedVars);
+        for (LogicalVariable variable : usedVars) {
+            MutableInt counter = usedVariableCounter.computeIfAbsent(variable, k -> new MutableInt(0));
+            counter.increment();
+        }
+    }
+
     public static class InlineVariablesVisitor extends LogicalExpressionReferenceTransformVisitor
             implements ILogicalExpressionReferenceTransform {
 


[asterixdb] 05/07: [NO ISSUE][FUN] Move spatial-intersect() to asterix-runtime module

Posted by mb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 62699481f8a04f02f213c9871c96b8c94d5ed450
Author: Ali Alsuliman <al...@gmail.com>
AuthorDate: Sat Feb 4 14:55:36 2023 -0800

    [NO ISSUE][FUN] Move spatial-intersect() to asterix-runtime module
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Change-Id: If6ef297f1f903bade07c248c0bf21dcea3cc76fb
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17362
    Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Reviewed-by: Ali Alsuliman <al...@gmail.com>
    Reviewed-by: Wail Alkowaileet <wa...@gmail.com>
---
 .../java/org/apache/asterix/runtime/FuzzyJoinFunctionRegistrant.java  | 4 ----
 .../asterix/runtime/evaluators/functions/SimilarityDescriptor.java    | 2 +-
 .../java/org/apache/asterix/runtime/evaluators/common}/IntArray.java  | 2 +-
 .../runtime/evaluators/functions/SpatialIntersectDescriptor.java      | 2 +-
 .../java/org/apache/asterix/runtime/functions/FunctionCollection.java | 2 ++
 5 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/FuzzyJoinFunctionRegistrant.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/FuzzyJoinFunctionRegistrant.java
index 83ebc986c7..c21ac5890f 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/FuzzyJoinFunctionRegistrant.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/FuzzyJoinFunctionRegistrant.java
@@ -37,7 +37,6 @@ import org.apache.asterix.runtime.evaluators.functions.SimilarityJaccardPrefixCh
 import org.apache.asterix.runtime.evaluators.functions.SimilarityJaccardPrefixDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.SimilarityJaccardSortedCheckDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.SimilarityJaccardSortedDescriptor;
-import org.apache.asterix.runtime.evaluators.functions.SpatialIntersectDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.WordTokensDescriptor;
 
 public class FuzzyJoinFunctionRegistrant implements IFunctionRegistrant {
@@ -48,9 +47,6 @@ public class FuzzyJoinFunctionRegistrant implements IFunctionRegistrant {
         fc.add(SimilarityJaccardPrefixDescriptor.FACTORY);
         fc.add(SimilarityJaccardPrefixCheckDescriptor.FACTORY);
 
-        // Spatial
-        fc.add(SpatialIntersectDescriptor.FACTORY);
-
         // fuzzyjoin function
         fc.add(PrefixLenJaccardDescriptor.FACTORY);
         fc.add(WordTokensDescriptor.FACTORY);
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/SimilarityDescriptor.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/SimilarityDescriptor.java
index 95fd5bf95b..341dfe8ea8 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/SimilarityDescriptor.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/SimilarityDescriptor.java
@@ -26,7 +26,6 @@ import org.apache.asterix.dataflow.data.nontagged.serde.ADoubleSerializerDeseria
 import org.apache.asterix.dataflow.data.nontagged.serde.AOrderedListSerializerDeserializer;
 import org.apache.asterix.dataflow.data.nontagged.serde.AUnorderedListSerializerDeserializer;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
-import org.apache.asterix.fuzzyjoin.IntArray;
 import org.apache.asterix.fuzzyjoin.similarity.PartialIntersect;
 import org.apache.asterix.fuzzyjoin.similarity.SimilarityFilters;
 import org.apache.asterix.fuzzyjoin.similarity.SimilarityMetric;
@@ -36,6 +35,7 @@ import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.IntArray;
 import org.apache.asterix.runtime.evaluators.common.SimilarityFiltersCache;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/IntArray.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/IntArray.java
similarity index 97%
rename from asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/IntArray.java
rename to asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/IntArray.java
index 91fb8b43a8..627ed89c1a 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/IntArray.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/IntArray.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.asterix.fuzzyjoin;
+package org.apache.asterix.runtime.evaluators.common;
 
 import java.util.Arrays;
 
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialIntersectDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialIntersectDescriptor.java
similarity index 99%
rename from asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialIntersectDescriptor.java
rename to asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialIntersectDescriptor.java
index 5a01007567..4e69b43f4a 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialIntersectDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialIntersectDescriptor.java
@@ -31,7 +31,6 @@ import org.apache.asterix.dataflow.data.nontagged.serde.APointSerializerDeserial
 import org.apache.asterix.dataflow.data.nontagged.serde.APolygonSerializerDeserializer;
 import org.apache.asterix.dataflow.data.nontagged.serde.ARectangleSerializerDeserializer;
 import org.apache.asterix.formats.nontagged.BinaryComparatorFactoryProvider;
-import org.apache.asterix.fuzzyjoin.IntArray;
 import org.apache.asterix.om.base.ABoolean;
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
@@ -39,6 +38,7 @@ import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
 import org.apache.asterix.runtime.evaluators.common.DoubleArray;
+import org.apache.asterix.runtime.evaluators.common.IntArray;
 import org.apache.asterix.runtime.evaluators.common.SpatialUtils;
 import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
index 867a8d0c4c..4b418b65c5 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
@@ -451,6 +451,7 @@ import org.apache.asterix.runtime.evaluators.functions.SleepDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.SpatialAreaDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.SpatialCellDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.SpatialDistanceDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.SpatialIntersectDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.StringConcatDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.StringContainsDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.StringEndsWithDescriptor;
@@ -1170,6 +1171,7 @@ public final class FunctionCollection implements IFunctionCollection {
         fc.add(LineRectanglePolygonAccessor.FACTORY);
         fc.add(ReferenceTileDescriptor.FACTORY);
         fc.add(GetIntersectionDescriptor.FACTORY);
+        fc.add(SpatialIntersectDescriptor.FACTORY);
 
         // full-text function
         fc.add(FullTextContainsFunctionDescriptor.FACTORY);


[asterixdb] 06/07: [NO ISSUE][OTH] Add some logging when join build fails to insert tuple

Posted by mb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit a31f0658a2a698b7b491c224c59a02e5caa1fddf
Author: Ali Alsuliman <al...@gmail.com>
AuthorDate: Mon Feb 6 12:48:29 2023 -0800

    [NO ISSUE][OTH] Add some logging when join build fails to insert tuple
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Change-Id: I5e342019d4831bfef0a10d6154a080c3cb524256
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17363
    Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Reviewed-by: Murtadha Hubail <mh...@apache.org>
---
 .../PreferToSpillFullyOccupiedFramePolicy.java             | 10 ++++++++++
 .../hyracks/dataflow/std/join/OptimizedHybridHashJoin.java | 14 ++++++++++++--
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/buffermanager/PreferToSpillFullyOccupiedFramePolicy.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/buffermanager/PreferToSpillFullyOccupiedFramePolicy.java
index 12985c0bec..613a396831 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/buffermanager/PreferToSpillFullyOccupiedFramePolicy.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/buffermanager/PreferToSpillFullyOccupiedFramePolicy.java
@@ -98,4 +98,14 @@ public class PreferToSpillFullyOccupiedFramePolicy {
             }
         };
     }
+
+    public String partitionsStatus() {
+        StringBuilder sb = new StringBuilder();
+        int numPartitions = bufferManager.getNumPartitions();
+        for (int p = 0; p < numPartitions; p++) {
+            sb.append("p:").append(p).append(",#t:").append(bufferManager.getNumTuples(p)).append(",s:")
+                    .append(spilledStatus.get(p)).append(",s:").append(bufferManager.getPhysicalSize(p)).append('\n');
+        }
+        return sb.toString();
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoin.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoin.java
index 7a9bb25ff3..02a381de14 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoin.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoin.java
@@ -49,6 +49,8 @@ import org.apache.hyracks.dataflow.std.buffermanager.VPartitionTupleBufferManage
 import org.apache.hyracks.dataflow.std.structures.ISerializableTable;
 import org.apache.hyracks.dataflow.std.structures.SerializableHashTable;
 import org.apache.hyracks.dataflow.std.structures.TuplePointer;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * This class mainly applies one level of HHJ on a pair of
@@ -56,6 +58,7 @@ import org.apache.hyracks.dataflow.std.structures.TuplePointer;
  */
 public class OptimizedHybridHashJoin {
 
+    private static final Logger LOGGER = LogManager.getLogger();
     // Used for special probe BigObject which can not be held into the Join memory
     private FrameTupleAppender bigFrameAppender;
 
@@ -155,12 +158,19 @@ public class OptimizedHybridHashJoin {
             int recordSize = VPartitionTupleBufferManager.calculateActualSize(null, accessorBuild.getTupleLength(tid));
             double numFrames = (double) recordSize / (double) jobletCtx.getInitialFrameSize();
             int victimPartition;
-            if (numFrames > bufferManager.getConstrain().frameLimit(pid)
-                    || (victimPartition = spillPolicy.selectVictimPartition(pid)) < 0) {
+            int partitionFrameLimit = bufferManager.getConstrain().frameLimit(pid);
+            if (numFrames > partitionFrameLimit || (victimPartition = spillPolicy.selectVictimPartition(pid)) < 0) {
                 // insert request can never be satisfied
                 if (numFrames > memSizeInFrames || recordSize < jobletCtx.getInitialFrameSize()) {
                     // the tuple is greater than the memory budget or although the record is small we could not find
                     // a frame for it (possibly due to a bug)
+                    String details = String.format(
+                            "partition %s, tuple size %s, needed # frames %s, partition frame limit %s, join "
+                                    + "memory in frames %s, initial frame size %s",
+                            pid, recordSize, numFrames, partitionFrameLimit, memSizeInFrames,
+                            jobletCtx.getInitialFrameSize());
+                    LOGGER.debug("can't insert tuple in join memory. {}", details);
+                    LOGGER.debug("partitions status:\n{}", spillPolicy.partitionsStatus());
                     throw HyracksDataException.create(ErrorCode.INSUFFICIENT_MEMORY);
                 }
                 // Record is large but insertion failed either 1) we could not satisfy the request because of the


[asterixdb] 01/07: [ASTERIXDB-3097][OTH] Print "build-side" only for hash join

Posted by mb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f6e3615cb385feebc13086d3dec9eaea0ba1c59f
Author: Ali Alsuliman <al...@gmail.com>
AuthorDate: Thu Feb 2 20:20:53 2023 -0800

    [ASTERIXDB-3097][OTH] Print "build-side" only for hash join
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    Fix the JSON plan printer to only print the "build-side" for
    hash join.
    
    Change-Id: Ic418905d45fa9edb7c77e5ccb748d07bbd0d8c64
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17358
    Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Reviewed-by: Murtadha Hubail <mh...@apache.org>
---
 .../algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java   | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
index 661e0cfad6..64a5e1a10b 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
@@ -954,8 +954,9 @@ public class LogicalOperatorPrettyPrintVisitorJson extends AbstractLogicalOperat
     }
 
     private void writeBuildSide(AbstractBinaryJoinOperator op) throws IOException {
-        int buildInputIndex = printInputsInReverse(op) ? 0 : 1;
-        jsonGenerator.writeNumberField("build-side", buildInputIndex);
+        if (isHashJoin(op)) {
+            jsonGenerator.writeNumberField("build-side", 0);
+        }
     }
 
     private static boolean printInputsInReverse(AbstractLogicalOperator op) {


[asterixdb] 03/07: [NO ISSUE] Change dataverse 'Test' to 'test'

Posted by mb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3e56dc0a1738e2851b4346f57425e2a0bebc5056
Author: Wail Alkowaileet <wa...@couchbase.com>
AuthorDate: Fri Feb 3 12:14:45 2023 -0800

    [NO ISSUE] Change dataverse 'Test' to 'test'
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    Change dataverse names in some to tests from 'Test'
    to 'test' as Mac file naming is case insensitive to
    prevent overwriting dataverses' files.
    
    Change-Id: I0890ce2edfc8ca554061177391062f0b06ee3833
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17357
    Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Reviewed-by: Wail Alkowaileet <wa...@gmail.com>
    Reviewed-by: Glenn Galvizo <gg...@uci.edu>
---
 .../select-quantified-queries/multiple-indexes/query1.sqlpp       | 6 +++---
 .../select-quantified-queries/multiple-indexes/query2.sqlpp       | 6 +++---
 .../select-unnest-queries/open/multiple-indexes/query1.sqlpp      | 6 +++---
 .../select-unnest-queries/open/multiple-indexes/query2.sqlpp      | 6 +++---
 .../select-quantified-queries/multiple-indexes/query1.plan        | 6 +++---
 .../select-quantified-queries/multiple-indexes/query2.plan        | 8 ++++----
 .../select-unnest-queries/open/multiple-indexes/query1.plan       | 6 +++---
 .../select-unnest-queries/open/multiple-indexes/query2.plan       | 8 ++++----
 .../multiple-indexes/multiple-indexes.1.ddl.sqlpp                 | 6 +++---
 .../multiple-indexes/multiple-indexes.2.update.sqlpp              | 2 +-
 .../multiple-indexes/multiple-indexes.3.query.sqlpp               | 2 +-
 .../multiple-indexes/multiple-indexes.4.query.sqlpp               | 2 +-
 .../open/multiple-indexes/multiple-indexes.1.ddl.sqlpp            | 6 +++---
 .../open/multiple-indexes/multiple-indexes.2.update.sqlpp         | 2 +-
 .../open/multiple-indexes/multiple-indexes.3.query.sqlpp          | 2 +-
 .../open/multiple-indexes/multiple-indexes.4.query.sqlpp          | 2 +-
 16 files changed, 38 insertions(+), 38 deletions(-)

diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-quantified-queries/multiple-indexes/query1.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-quantified-queries/multiple-indexes/query1.sqlpp
index 114fc2753f..0412602f25 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-quantified-queries/multiple-indexes/query1.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-quantified-queries/multiple-indexes/query1.sqlpp
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-DROP   DATAVERSE Test IF EXISTS;
-CREATE DATAVERSE Test;
-USE    Test;
+DROP   DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+USE    test;
 
 CREATE TYPE GenericType AS { _id: uuid };
 CREATE DATASET KSI (GenericType)
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-quantified-queries/multiple-indexes/query2.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-quantified-queries/multiple-indexes/query2.sqlpp
index 6316ab080d..2f2bb8ad57 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-quantified-queries/multiple-indexes/query2.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-quantified-queries/multiple-indexes/query2.sqlpp
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-DROP   DATAVERSE Test IF EXISTS;
-CREATE DATAVERSE Test;
-USE    Test;
+DROP   DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+USE    test;
 
 CREATE TYPE GenericType AS { _id: uuid };
 CREATE DATASET KSI (GenericType)
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-unnest-queries/open/multiple-indexes/query1.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-unnest-queries/open/multiple-indexes/query1.sqlpp
index 56b061a0be..687ac95087 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-unnest-queries/open/multiple-indexes/query1.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-unnest-queries/open/multiple-indexes/query1.sqlpp
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-DROP   DATAVERSE Test IF EXISTS;
-CREATE DATAVERSE Test;
-USE    Test;
+DROP   DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+USE    test;
 
 CREATE TYPE GenericType AS { _id: uuid };
 CREATE DATASET KSI (GenericType)
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-unnest-queries/open/multiple-indexes/query2.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-unnest-queries/open/multiple-indexes/query2.sqlpp
index b926f71bd3..b1d7640860 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-unnest-queries/open/multiple-indexes/query2.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-unnest-queries/open/multiple-indexes/query2.sqlpp
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-DROP   DATAVERSE Test IF EXISTS;
-CREATE DATAVERSE Test;
-USE    Test;
+DROP   DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+USE    test;
 
 CREATE TYPE GenericType AS { _id: uuid };
 CREATE DATASET KSI (GenericType)
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query1.plan
index 060ee79e75..0d37f51100 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query1.plan
@@ -16,7 +16,7 @@
                 -- ASSIGN  |PARTITIONED|
                   -- STREAM_PROJECT  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- BTREE_SEARCH (Test.KSI.KSI)  |PARTITIONED|
+                      -- BTREE_SEARCH (test.KSI.KSI)  |PARTITIONED|
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           -- INTERSECT  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -26,7 +26,7 @@
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- BTREE_SEARCH (Test.KSI.KS1_array_index1)  |PARTITIONED|
+                                          -- BTREE_SEARCH (test.KSI.KS1_array_index1)  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                               -- ASSIGN  |PARTITIONED|
                                                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
@@ -37,7 +37,7 @@
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- BTREE_SEARCH (Test.KSI.KS1_array_index2)  |PARTITIONED|
+                                          -- BTREE_SEARCH (test.KSI.KS1_array_index2)  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                               -- ASSIGN  |PARTITIONED|
                                                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query2.plan
index e3d1c5d407..b793939cac 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query2.plan
@@ -16,7 +16,7 @@
                 -- ASSIGN  |PARTITIONED|
                   -- STREAM_PROJECT  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- BTREE_SEARCH (Test.KSI.KSI)  |PARTITIONED|
+                      -- BTREE_SEARCH (test.KSI.KSI)  |PARTITIONED|
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           -- INTERSECT  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -26,7 +26,7 @@
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- BTREE_SEARCH (Test.KSI.KS1_array_index1)  |PARTITIONED|
+                                          -- BTREE_SEARCH (test.KSI.KS1_array_index1)  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                               -- ASSIGN  |PARTITIONED|
                                                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
@@ -37,7 +37,7 @@
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- BTREE_SEARCH (Test.KSI.KS1_array_index2)  |PARTITIONED|
+                                          -- BTREE_SEARCH (test.KSI.KS1_array_index2)  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                               -- ASSIGN  |PARTITIONED|
                                                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
@@ -48,7 +48,7 @@
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- BTREE_SEARCH (Test.KSI.KS1_array_index3)  |PARTITIONED|
+                                          -- BTREE_SEARCH (test.KSI.KS1_array_index3)  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                               -- ASSIGN  |PARTITIONED|
                                                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-unnest-queries/open/multiple-indexes/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-unnest-queries/open/multiple-indexes/query1.plan
index def9040769..4c76ea064e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-unnest-queries/open/multiple-indexes/query1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-unnest-queries/open/multiple-indexes/query1.plan
@@ -8,7 +8,7 @@
               -- ASSIGN  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    -- BTREE_SEARCH (Test.KSI.KSI)  |PARTITIONED|
+                    -- BTREE_SEARCH (test.KSI.KSI)  |PARTITIONED|
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- INTERSECT  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -18,7 +18,7 @@
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- STREAM_PROJECT  |PARTITIONED|
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- BTREE_SEARCH (Test.KSI.KS1_array_index1)  |PARTITIONED|
+                                        -- BTREE_SEARCH (test.KSI.KS1_array_index1)  |PARTITIONED|
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                             -- ASSIGN  |PARTITIONED|
                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
@@ -29,7 +29,7 @@
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- STREAM_PROJECT  |PARTITIONED|
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- BTREE_SEARCH (Test.KSI.KS1_array_index2)  |PARTITIONED|
+                                        -- BTREE_SEARCH (test.KSI.KS1_array_index2)  |PARTITIONED|
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                             -- ASSIGN  |PARTITIONED|
                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-unnest-queries/open/multiple-indexes/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-unnest-queries/open/multiple-indexes/query2.plan
index 1c73ebc934..7a2f7ce8ed 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-unnest-queries/open/multiple-indexes/query2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-unnest-queries/open/multiple-indexes/query2.plan
@@ -8,7 +8,7 @@
               -- ASSIGN  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    -- BTREE_SEARCH (Test.KSI.KSI)  |PARTITIONED|
+                    -- BTREE_SEARCH (test.KSI.KSI)  |PARTITIONED|
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- INTERSECT  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -18,7 +18,7 @@
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- STREAM_PROJECT  |PARTITIONED|
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- BTREE_SEARCH (Test.KSI.KS1_array_index1)  |PARTITIONED|
+                                        -- BTREE_SEARCH (test.KSI.KS1_array_index1)  |PARTITIONED|
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                             -- ASSIGN  |PARTITIONED|
                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
@@ -29,7 +29,7 @@
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- STREAM_PROJECT  |PARTITIONED|
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- BTREE_SEARCH (Test.KSI.KS1_array_index2)  |PARTITIONED|
+                                        -- BTREE_SEARCH (test.KSI.KS1_array_index2)  |PARTITIONED|
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                             -- ASSIGN  |PARTITIONED|
                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
@@ -40,7 +40,7 @@
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- STREAM_PROJECT  |PARTITIONED|
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- BTREE_SEARCH (Test.KSI.KS1_array_index3)  |PARTITIONED|
+                                        -- BTREE_SEARCH (test.KSI.KS1_array_index3)  |PARTITIONED|
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                             -- ASSIGN  |PARTITIONED|
                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.1.ddl.sqlpp
index 73e442e736..d5894572d8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.1.ddl.sqlpp
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-DROP   DATAVERSE Test IF EXISTS;
-CREATE DATAVERSE Test;
-USE    Test;
+DROP   DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+USE    test;
 
 CREATE TYPE GenericType AS { id: bigint };
 CREATE DATASET KSI (GenericType)
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.2.update.sqlpp
index 1276c972b1..1d1f638e2a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.2.update.sqlpp
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-USE    Test;
+USE    test;
 
 INSERT INTO KSI [
   { "id": 1, "uarr_i": [ {"a": 1, "b": 1, "c": 1 } ] },
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.3.query.sqlpp
index 697cca1f0c..ce7f053fd9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.3.query.sqlpp
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-USE    Test;
+USE    test;
 
 FROM     KSI k
 WHERE    ( SOME i IN k.uarr_i
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.4.query.sqlpp
index 948d367009..1314ad8ae4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.4.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.4.query.sqlpp
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-USE    Test;
+USE    test;
 
 FROM     KSI k
 WHERE    ( SOME i IN k.uarr_i
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.1.ddl.sqlpp
index 73e442e736..d5894572d8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.1.ddl.sqlpp
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-DROP   DATAVERSE Test IF EXISTS;
-CREATE DATAVERSE Test;
-USE    Test;
+DROP   DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+USE    test;
 
 CREATE TYPE GenericType AS { id: bigint };
 CREATE DATASET KSI (GenericType)
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.2.update.sqlpp
index 1276c972b1..1d1f638e2a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.2.update.sqlpp
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-USE    Test;
+USE    test;
 
 INSERT INTO KSI [
   { "id": 1, "uarr_i": [ {"a": 1, "b": 1, "c": 1 } ] },
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.3.query.sqlpp
index 38808015fb..c9b3208cb1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.3.query.sqlpp
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-USE    Test;
+USE    test;
 
 FROM     KSI k
 UNNEST   k.uarr_i i
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.4.query.sqlpp
index 252e07381c..96aee1c16a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.4.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.4.query.sqlpp
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-USE    Test;
+USE    test;
 
 FROM     KSI k
 UNNEST   k.uarr_i i


[asterixdb] 02/07: [ASTERIXDB-3104][FUN] Add function to return the serialized ADM size of a value

Posted by mb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3475ed37283a1aa0aadb05dd4537af7bb0a87d09
Author: Ali Alsuliman <al...@gmail.com>
AuthorDate: Fri Feb 3 11:43:50 2023 -0800

    [ASTERIXDB-3104][FUN] Add function to return the serialized ADM size of a value
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    
    Change-Id: I75de50afc22eb3cb0469bb05d9025efcebe94514
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17360
    Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Reviewed-by: Ali Alsuliman <al...@gmail.com>
    Reviewed-by: Till Westmann <ti...@apache.org>
---
 .../serialized_size_fun.01.query.sqlpp             | 29 ++++++++
 .../serialized_size_fun/serialized_size_fun.01.adm |  5 ++
 .../test/resources/runtimets/testsuite_sqlpp.xml   |  5 ++
 .../asterix/om/functions/BuiltinFunctions.java     |  4 +
 .../functions/SerializedSizeDescriptor.java        | 87 ++++++++++++++++++++++
 .../runtime/functions/FunctionCollection.java      |  2 +
 6 files changed, 132 insertions(+)

diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/serialized_size_fun/serialized_size_fun.01.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/serialized_size_fun/serialized_size_fun.01.query.sqlpp
new file mode 100644
index 0000000000..d3c8f1ae41
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/serialized_size_fun/serialized_size_fun.01.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+SET `import-private-functions` `true`;
+
+from [
+{"id": 1, "f": 1},
+{"id": 2, "f": true},
+{"id": 3, "f": "test"},
+{"id": 4, "f": [1,2]},
+{"id": 5, "f": {"f1": 1, "f2": [{"n": "str"}]}}
+] AS t
+select t.f AS val, serialized_size(t.f) AS serialized_size
+order by t.id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/serialized_size_fun/serialized_size_fun.01.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/serialized_size_fun/serialized_size_fun.01.adm
new file mode 100644
index 0000000000..511674be99
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/serialized_size_fun/serialized_size_fun.01.adm
@@ -0,0 +1,5 @@
+{ "serialized_size": 9, "val": 1 }
+{ "serialized_size": 2, "val": true }
+{ "serialized_size": 6, "val": "test" }
+{ "serialized_size": 36, "val": [ 1, 2 ] }
+{ "serialized_size": 88, "val": { "f1": 1, "f2": [ { "n": "str" } ] } }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index b77dac5b85..755d65d581 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -7268,6 +7268,11 @@
         <output-dir compare="Text">query-ASTERIXDB-865</output-dir>
       </compilation-unit>
     </test-case>
+    <test-case FilePath="misc">
+      <compilation-unit name="serialized_size_fun">
+        <output-dir compare="Text">serialized_size_fun</output-dir>
+      </compilation-unit>
+    </test-case>
   </test-group>
   <test-group name="multipart-dataverse">
     <test-case FilePath="multipart-dataverse">
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
index 56971ebbe2..4db68c347c 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
@@ -1699,6 +1699,9 @@ public class BuiltinFunctions {
     public static final FunctionIdentifier DECODE_DATAVERSE_NAME =
             new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "decode-dataverse-name", 1);
 
+    public static final FunctionIdentifier SERIALIZED_SIZE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "serialized-size", 1);
+
     static {
         // first, take care of Algebricks builtin functions
         addFunction(IS_MISSING, BooleanOnlyTypeComputer.INSTANCE, true);
@@ -2530,6 +2533,7 @@ public class BuiltinFunctions {
         addFunction(DECODE_DATAVERSE_NAME, OrderedListOfAStringTypeComputer.INSTANCE_NULLABLE, true);
 
         addPrivateFunction(COLLECTION_TO_SEQUENCE, CollectionToSequenceTypeComputer.INSTANCE, true);
+        addPrivateFunction(SERIALIZED_SIZE, AInt64TypeComputer.INSTANCE, true);
 
         // external lookup
         addPrivateFunction(EXTERNAL_LOOKUP, AnyTypeComputer.INSTANCE, false);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SerializedSizeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SerializedSizeDescriptor.java
new file mode 100644
index 0000000000..2669fd714c
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SerializedSizeDescriptor.java
@@ -0,0 +1,87 @@
+/*
+ * 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.runtime.evaluators.functions;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
+import org.apache.asterix.om.base.AInt64;
+import org.apache.asterix.om.base.AMutableInt64;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
+import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+
+public final class SerializedSizeDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    private static final long serialVersionUID = 1L;
+
+    public static final IFunctionDescriptorFactory FACTORY = SerializedSizeDescriptor::new;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractScalarEval(sourceLoc, getIdentifier()) {
+                    private final IScalarEvaluator eval0 = args[0].createScalarEvaluator(ctx);
+                    private final VoidPointable arg0 = VoidPointable.FACTORY.createPointable();
+                    private final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
+                    private final DataOutput resultOut = resultStorage.getDataOutput();
+
+                    @SuppressWarnings("unchecked")
+                    private final ISerializerDeserializer<AInt64> int64Serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
+                    private final AMutableInt64 int64 = new AMutableInt64(0);
+
+                    @Override
+                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+                        resultStorage.reset();
+                        eval0.evaluate(tuple, arg0);
+                        int64.setValue(arg0.getLength());
+                        try {
+                            int64Serde.serialize(int64, resultOut);
+                            result.set(resultStorage);
+                        } catch (IOException e) {
+                            throw HyracksDataException.create(e);
+                        }
+                    }
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.SERIALIZED_SIZE;
+    }
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
index 35993cf2b6..867a8d0c4c 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
@@ -446,6 +446,7 @@ import org.apache.asterix.runtime.evaluators.functions.OrDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.RandomDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.RandomWithSeedDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.ReferenceTileDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.SerializedSizeDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.SleepDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.SpatialAreaDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.SpatialCellDescriptor;
@@ -1315,6 +1316,7 @@ public final class FunctionCollection implements IFunctionCollection {
         // Other functions
         fc.add(DecodeDataverseNameDescriptor.FACTORY);
         fc.add(RandomWithSeedDescriptor.FACTORY);
+        fc.add(SerializedSizeDescriptor.FACTORY);
 
         ServiceLoader.load(IFunctionRegistrant.class).iterator().forEachRemaining(c -> c.register(fc));
         return fc;