[chore](Nereids): polish StatsCalculatorTest (#22884)

This commit is contained in:
jakevin
2023-08-11 18:08:18 +08:00
committed by GitHub
parent 7ac4df67ab
commit a2fd488438

View File

@ -31,7 +31,6 @@ import org.apache.doris.nereids.trees.expressions.Or;
import org.apache.doris.nereids.trees.expressions.SlotReference;
import org.apache.doris.nereids.trees.expressions.StatementScopeIdGenerator;
import org.apache.doris.nereids.trees.expressions.literal.IntegerLiteral;
import org.apache.doris.nereids.trees.plans.FakePlan;
import org.apache.doris.nereids.trees.plans.GroupPlan;
import org.apache.doris.nereids.trees.plans.LimitPhase;
import org.apache.doris.nereids.trees.plans.Plan;
@ -41,7 +40,6 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan;
import org.apache.doris.nereids.trees.plans.logical.LogicalTopN;
import org.apache.doris.nereids.types.IntegerType;
import org.apache.doris.nereids.util.PlanConstructor;
import org.apache.doris.qe.ConnectContext;
import org.apache.doris.statistics.ColumnStatistic;
import org.apache.doris.statistics.ColumnStatisticBuilder;
import org.apache.doris.statistics.Statistics;
@ -49,11 +47,9 @@ import org.apache.doris.statistics.Statistics;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import mockit.Mocked;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@ -61,11 +57,12 @@ import java.util.Map;
import java.util.Optional;
public class StatsCalculatorTest {
private final LogicalOlapScan scan = PlanConstructor.newLogicalOlapScan(0, "t1", 0);
private Group newGroup() {
GroupExpression groupExpression = new GroupExpression(new FakePlan());
Group group = new Group(null, groupExpression, null);
group.getPhysicalExpressions().remove(0);
private Group newFakeGroup() {
GroupExpression groupExpression = new GroupExpression(scan);
Group group = new Group(null, groupExpression, new LogicalProperties(Collections::emptyList));
group.getLogicalExpressions().remove(0);
return group;
}
@ -138,22 +135,19 @@ public class StatsCalculatorTest {
ImmutableSet and = ImmutableSet.of(eq1, eq2);
ImmutableSet or = ImmutableSet.of(new Or(eq1, eq2));
Group childGroup = newGroup();
childGroup.setLogicalProperties(new LogicalProperties(Collections::emptyList));
Group childGroup = newFakeGroup();
GroupPlan groupPlan = new GroupPlan(childGroup);
childGroup.setStatistics(childStats);
LogicalFilter<GroupPlan> logicalFilter = new LogicalFilter<>(and, groupPlan);
GroupExpression groupExpression = new GroupExpression(logicalFilter, ImmutableList.of(childGroup));
Group ownerGroup = newGroup();
groupExpression.setOwnerGroup(ownerGroup);
Group ownerGroup = new Group(null, groupExpression, null);
StatsCalculator.estimate(groupExpression, null);
Assertions.assertEquals((10000 * 0.1 * 0.05), ownerGroup.getStatistics().getRowCount(), 0.001);
LogicalFilter<GroupPlan> logicalFilterOr = new LogicalFilter<>(or, groupPlan);
GroupExpression groupExpressionOr = new GroupExpression(logicalFilterOr, ImmutableList.of(childGroup));
Group ownerGroupOr = newGroup();
groupExpressionOr.setOwnerGroup(ownerGroupOr);
Group ownerGroupOr = new Group(null, groupExpressionOr, null);
StatsCalculator.estimate(groupExpressionOr, null);
Assertions.assertEquals((long) (10000 * (0.1 + 0.05 - 0.1 * 0.05)),
ownerGroupOr.getStatistics().getRowCount(), 0.001);
@ -163,9 +157,7 @@ public class StatsCalculatorTest {
// a=200 and b=300 => output: 0 rows
@org.junit.Test
public void testFilterOutofRange() {
List<String> qualifier = Lists.newArrayList();
qualifier.add("test");
qualifier.add("t");
List<String> qualifier = ImmutableList.of("test", "t");
SlotReference slot1 = new SlotReference("c1", IntegerType.INSTANCE, true, qualifier);
SlotReference slot2 = new SlotReference("c2", IntegerType.INSTANCE, true, qualifier);
@ -191,21 +183,20 @@ public class StatsCalculatorTest {
ImmutableSet and = ImmutableSet.of(new And(eq1, eq2));
ImmutableSet or = ImmutableSet.of(new Or(eq1, eq2));
Group childGroup = newGroup();
childGroup.setLogicalProperties(new LogicalProperties(Collections::emptyList));
Group childGroup = newFakeGroup();
GroupPlan groupPlan = new GroupPlan(childGroup);
childGroup.setStatistics(childStats);
LogicalFilter<GroupPlan> logicalFilter = new LogicalFilter<>(and, groupPlan);
GroupExpression groupExpression = new GroupExpression(logicalFilter, ImmutableList.of(childGroup));
Group ownerGroup = newGroup();
Group ownerGroup = new Group(null, groupExpression, null);
groupExpression.setOwnerGroup(ownerGroup);
StatsCalculator.estimate(groupExpression, null);
Assertions.assertEquals(0, ownerGroup.getStatistics().getRowCount(), 0.001);
LogicalFilter<GroupPlan> logicalFilterOr = new LogicalFilter<>(or, groupPlan);
GroupExpression groupExpressionOr = new GroupExpression(logicalFilterOr, ImmutableList.of(childGroup));
Group ownerGroupOr = newGroup();
Group ownerGroupOr = new Group(null, groupExpressionOr, null);
groupExpressionOr.setOwnerGroup(ownerGroupOr);
StatsCalculator.estimate(groupExpressionOr, null);
Assertions.assertEquals(0, ownerGroupOr.getStatistics().getRowCount(), 0.001);
@ -249,20 +240,20 @@ public class StatsCalculatorTest {
// }
@Test
public void testOlapScan(@Mocked ConnectContext context) {
public void testOlapScan() {
long tableId1 = 0;
List<String> qualifier = ImmutableList.of("test", "t");
SlotReference slot1 = new SlotReference(new ExprId(0),
"c1", IntegerType.INSTANCE, true, qualifier, new Column("c1", PrimitiveType.INT));
OlapTable table1 = PlanConstructor.newOlapTable(tableId1, "t1", 0);
LogicalOlapScan logicalOlapScan1 = (LogicalOlapScan) new LogicalOlapScan(StatementScopeIdGenerator.newRelationId(), table1,
LogicalOlapScan logicalOlapScan1 = (LogicalOlapScan) new LogicalOlapScan(
StatementScopeIdGenerator.newRelationId(), table1,
Collections.emptyList()).withGroupExprLogicalPropChildren(Optional.empty(),
Optional.of(new LogicalProperties(() -> ImmutableList.of(slot1))), ImmutableList.of());
Group childGroup = newGroup();
GroupExpression groupExpression = new GroupExpression(logicalOlapScan1, ImmutableList.of(childGroup));
Group ownerGroup = newGroup();
groupExpression.setOwnerGroup(ownerGroup);
GroupExpression groupExpression = new GroupExpression(logicalOlapScan1, ImmutableList.of());
Group ownerGroup = new Group(null, groupExpression, null);
StatsCalculator.estimate(groupExpression, null);
Statistics stats = ownerGroup.getStatistics();
Assertions.assertEquals(1, stats.columnStatistics().size());
@ -271,9 +262,7 @@ public class StatsCalculatorTest {
@Test
public void testLimit() {
List<String> qualifier = new ArrayList<>();
qualifier.add("test");
qualifier.add("t");
List<String> qualifier = ImmutableList.of("test", "t");
SlotReference slot1 = new SlotReference(new ExprId(0),
"c1", IntegerType.INSTANCE, true, qualifier, new Column("c1", PrimitiveType.INT));
ColumnStatisticBuilder columnStat1 = new ColumnStatisticBuilder();
@ -283,17 +272,14 @@ public class StatsCalculatorTest {
slotColumnStatsMap.put(slot1, columnStat1.build());
Statistics childStats = new Statistics(10, slotColumnStatsMap);
Group childGroup = newGroup();
childGroup.setLogicalProperties(new LogicalProperties(Collections::emptyList));
Group childGroup = newFakeGroup();
GroupPlan groupPlan = new GroupPlan(childGroup);
childGroup.setStatistics(childStats);
LogicalLimit<? extends Plan> logicalLimit = new LogicalLimit<>(1, 2,
LimitPhase.GLOBAL, new LogicalLimit<>(1, 2, LimitPhase.LOCAL, groupPlan)
);
LimitPhase.GLOBAL, new LogicalLimit<>(1, 2, LimitPhase.LOCAL, groupPlan));
GroupExpression groupExpression = new GroupExpression(logicalLimit, ImmutableList.of(childGroup));
Group ownerGroup = newGroup();
ownerGroup.addGroupExpression(groupExpression);
Group ownerGroup = new Group(null, groupExpression, null);
StatsCalculator.estimate(groupExpression, null);
Statistics limitStats = ownerGroup.getStatistics();
Assertions.assertEquals(1, limitStats.getRowCount());
@ -304,9 +290,7 @@ public class StatsCalculatorTest {
@Test
public void testTopN() {
List<String> qualifier = new ArrayList<>();
qualifier.add("test");
qualifier.add("t");
List<String> qualifier = ImmutableList.of("test", "t");
SlotReference slot1 = new SlotReference("c1", IntegerType.INSTANCE, true, qualifier);
ColumnStatisticBuilder columnStat1 = new ColumnStatisticBuilder();
columnStat1.setNdv(10);
@ -315,15 +299,13 @@ public class StatsCalculatorTest {
slotColumnStatsMap.put(slot1, columnStat1.build());
Statistics childStats = new Statistics(10, slotColumnStatsMap);
Group childGroup = newGroup();
childGroup.setLogicalProperties(new LogicalProperties(Collections::emptyList));
Group childGroup = newFakeGroup();
GroupPlan groupPlan = new GroupPlan(childGroup);
childGroup.setStatistics(childStats);
LogicalTopN<GroupPlan> logicalTopN = new LogicalTopN<>(Collections.emptyList(), 1, 2, groupPlan);
GroupExpression groupExpression = new GroupExpression(logicalTopN, ImmutableList.of(childGroup));
Group ownerGroup = newGroup();
ownerGroup.addGroupExpression(groupExpression);
Group ownerGroup = new Group(null, groupExpression, null);
StatsCalculator.estimate(groupExpression, null);
Statistics topNStats = ownerGroup.getStatistics();
Assertions.assertEquals(1, topNStats.getRowCount());