Xikui Wang has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/2933

Change subject: [NO-ISSUE][COMP] Avoid adding redundant var in 
AbstractIntroduceGroupByCombinerRule
......................................................................

[NO-ISSUE][COMP] Avoid adding redundant var in 
AbstractIntroduceGroupByCombinerRule

- user model changes: no
- storage format changes: no
- interface changes: no

For live variables added in new Group-by op, they should not be added
again.

Change-Id: Ic1ab9aee31db95d5782385bc3d53777da54f6d83
---
A 
asterixdb/asterix-app/src/test/resources/optimizerts/queries/redundant-var-in-groupby.sqlpp
A 
asterixdb/asterix-app/src/test/resources/optimizerts/results/redundant-var-in-groupby.plan
M 
hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractIntroduceGroupByCombinerRule.java
3 files changed, 140 insertions(+), 1 deletion(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/33/2933/1

diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/redundant-var-in-groupby.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/redundant-var-in-groupby.sqlpp
new file mode 100644
index 0000000..202a03d
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/redundant-var-in-groupby.sqlpp
@@ -0,0 +1,68 @@
+/*
+ * 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.
+ */
+
+drop  dataverse test if exists;
+create  dataverse test;
+use test;
+
+create type TweetType as open {
+  id : int64,
+  created_at : datetime
+};
+
+create type StoredTweetType as open {
+  tid : uuid
+};
+create dataset Tweets1(StoredTweetType) primary key tid autogenerated;
+create dataset Tweets2(StoredTweetType) primary key tid autogenerated;
+
+drop dataset ReligiousBuildingDataset if exists;
+drop type ReligiousBuildingType if exists;
+create type ReligiousBuildingType as open {
+    religiousBuildingId : string,
+    religionName : string,
+    buildingLocation : point,
+    registeredBeliever: int
+};
+create dataset ReligiousBuildingDataset(ReligiousBuildingType) primary key 
religiousBuildingId;
+
+drop dataset AttackEventsDataset if exists;
+drop type AttackEventsType if exists;
+create type AttackEventsType as open {
+    attackRecordId: string,
+    attackDatetime: datetime,
+    attackLocation: point,
+    relatedReligion: string
+};
+create dataset AttackEventsDataset(AttackEventsType) primary key 
attackRecordId;
+
+create function annotateTweet(x) {
+    LET nearby_religious_attack = (select r.religionName as Religion, 
count(a.attackRecordId) as AttackNum
+       from ReligiousBuildingDataset r, AttackEventsDataset a
+       where spatial_intersect(create_point(x.latitude, x.longitude), 
create_circle(r.buildingLocation, 3.0))
+       and x.created_at  < a.attackDatetime + duration("P2M")
+       and x.created_at  > a.attackDatetime
+       and r.religionName = a.relatedReligion
+       group by r.religionName)
+    select x.*, nearby_religious_attack
+};
+
+insert into Tweets2 (
+select annotateTweet(t) from Tweets1
+);
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results/redundant-var-in-groupby.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/redundant-var-in-groupby.plan
new file mode 100644
index 0000000..f3ae099
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/redundant-var-in-groupby.plan
@@ -0,0 +1,70 @@
+-- COMMIT  |PARTITIONED|
+  -- STREAM_PROJECT  |PARTITIONED|
+    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+      -- INSERT_DELETE  |PARTITIONED|
+        -- HASH_PARTITION_EXCHANGE [$$105]  |PARTITIONED|
+          -- ASSIGN  |PARTITIONED|
+            -- STREAM_PROJECT  |PARTITIONED|
+              -- ASSIGN  |PARTITIONED|
+                -- STREAM_PROJECT  |PARTITIONED|
+                  -- ASSIGN  |PARTITIONED|
+                    -- STREAM_PROJECT  |PARTITIONED|
+                      -- ASSIGN  |PARTITIONED|
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            -- PRE_CLUSTERED_GROUP_BY[$$128]  |PARTITIONED|
+                                    {
+                                      -- AGGREGATE  |LOCAL|
+                                        -- MICRO_PRE_CLUSTERED_GROUP_BY[]  
|LOCAL|
+                                                {
+                                                  -- AGGREGATE  |LOCAL|
+                                                    -- 
MICRO_PRE_CLUSTERED_GROUP_BY[$$129]  |LOCAL|
+                                                            {
+                                                              -- AGGREGATE  
|LOCAL|
+                                                                -- 
NESTED_TUPLE_SOURCE  |LOCAL|
+                                                            }
+                                                      -- STREAM_SELECT  |LOCAL|
+                                                        -- NESTED_TUPLE_SOURCE 
 |LOCAL|
+                                                }
+                                          -- IN_MEMORY_STABLE_SORT 
[$$129(ASC)]  |LOCAL|
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    }
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- STABLE_SORT [$$128(ASC)]  |PARTITIONED|
+                                  -- HASH_PARTITION_EXCHANGE [$$128]  
|PARTITIONED|
+                                    -- SORT_GROUP_BY[$$113, $$112, $$125]  
|PARTITIONED|
+                                            {
+                                              -- AGGREGATE  |LOCAL|
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            }
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- STREAM_PROJECT  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- NESTED_LOOP  |PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                -- ASSIGN  |PARTITIONED|
+                                                  -- ASSIGN  |PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                      -- DATASOURCE_SCAN  
|PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE 
 |PARTITIONED|
+                                                          -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                              -- BROADCAST_EXCHANGE  
|PARTITIONED|
+                                                -- ASSIGN  |PARTITIONED|
+                                                  -- STREAM_PROJECT  
|PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                      -- HYBRID_HASH_JOIN 
[$$112][$$118]  |PARTITIONED|
+                                                        -- 
HASH_PARTITION_EXCHANGE [$$112]  |PARTITIONED|
+                                                          -- STREAM_PROJECT  
|PARTITIONED|
+                                                            -- ASSIGN  
|PARTITIONED|
+                                                              -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  -- 
DATASOURCE_SCAN  |PARTITIONED|
+                                                                    -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                        -- 
HASH_PARTITION_EXCHANGE [$$118]  |PARTITIONED|
+                                                          -- STREAM_PROJECT  
|PARTITIONED|
+                                                            -- ASSIGN  
|PARTITIONED|
+                                                              -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- 
DATASOURCE_SCAN  |PARTITIONED|
+                                                                  -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                    -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git 
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractIntroduceGroupByCombinerRule.java
 
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractIntroduceGroupByCombinerRule.java
index dc48d96..b33cc77 100644
--- 
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractIntroduceGroupByCombinerRule.java
+++ 
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractIntroduceGroupByCombinerRule.java
@@ -88,6 +88,7 @@
                 // Let the left-hand side of gbyOp's decoration expressions 
populated through the combiner group-by without
                 // any intermediate assignment.
                 newGbyOp.addDecorExpression(null, p.second.getValue());
+                newGbyLiveVars.add(usedDecorVars.get(0));
             }
         }
         newGbyOp.setExecutionMode(ExecutionMode.LOCAL);
@@ -104,7 +105,7 @@
         OperatorPropertiesUtil.getFreeVariablesInSubplans(gbyOp, freeVars);
 
         for (LogicalVariable var : freeVars) {
-            if (!propagatedVars.contains(var)) {
+            if (!propagatedVars.contains(var) && 
!newGbyLiveVars.contains(var)) {
                 LogicalVariable newDecorVar = context.newVar();
                 VariableReferenceExpression varRef = new 
VariableReferenceExpression(var);
                 varRef.setSourceLocation(gbyOp.getSourceLocation());

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2933
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic1ab9aee31db95d5782385bc3d53777da54f6d83
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Xikui Wang <[email protected]>

Reply via email to