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]>
