-
Notifications
You must be signed in to change notification settings - Fork 3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add stats rule for DistinctLimitNode
- Loading branch information
Showing
3 changed files
with
57 additions
and
2 deletions.
There are no files selected for viewing
54 changes: 54 additions & 0 deletions
54
core/trino-main/src/main/java/io/trino/cost/DistinctLimitStatsRule.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
/* | ||
* Copyright Starburst Data, Inc. All rights reserved. | ||
* | ||
* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF STARBURST DATA. | ||
* The copyright notice above does not evidence any | ||
* actual or intended publication of such source code. | ||
* | ||
* Redistribution of this material is strictly prohibited. | ||
*/ | ||
package io.trino.cost; | ||
|
||
import com.google.common.collect.ImmutableMap; | ||
import io.trino.Session; | ||
import io.trino.matching.Pattern; | ||
import io.trino.sql.planner.TypeProvider; | ||
import io.trino.sql.planner.iterative.Lookup; | ||
import io.trino.sql.planner.plan.DistinctLimitNode; | ||
|
||
import java.util.Optional; | ||
|
||
import static io.trino.sql.planner.plan.Patterns.distinctLimit; | ||
import static java.lang.Math.min; | ||
|
||
public class DistinctLimitStatsRule | ||
extends SimpleStatsRule<DistinctLimitNode> | ||
{ | ||
private static final Pattern<DistinctLimitNode> PATTERN = distinctLimit(); | ||
|
||
public DistinctLimitStatsRule(StatsNormalizer normalizer) | ||
{ | ||
super(normalizer); | ||
} | ||
|
||
@Override | ||
public Pattern<DistinctLimitNode> getPattern() | ||
{ | ||
return PATTERN; | ||
} | ||
|
||
@Override | ||
protected Optional<PlanNodeStatsEstimate> doCalculate(DistinctLimitNode node, StatsProvider statsProvider, Lookup lookup, Session session, TypeProvider types) | ||
{ | ||
if (node.isPartial()) { | ||
return Optional.empty(); | ||
} | ||
|
||
PlanNodeStatsEstimate distinctStats = AggregationStatsRule.groupBy( | ||
statsProvider.getStats(node.getSource()), | ||
node.getDistinctSymbols(), | ||
ImmutableMap.of()); | ||
PlanNodeStatsEstimate distinctLimitStats = distinctStats.mapOutputRowCount(rowCount -> min(rowCount, node.getLimit())); | ||
return Optional.of(distinctLimitStats); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters