diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java index 97a2cd15186f24..04b9e3486b0827 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java @@ -18,6 +18,7 @@ package org.apache.doris.statistics; import org.apache.doris.catalog.Column; +import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.TableIf; import org.apache.doris.common.io.Text; import org.apache.doris.common.io.Writable; @@ -25,6 +26,7 @@ import org.apache.doris.statistics.AnalysisInfo.JobType; import org.apache.doris.statistics.util.StatisticsUtil; +import com.google.common.annotations.VisibleForTesting; import com.google.gson.annotations.SerializedName; import java.io.DataInput; @@ -54,7 +56,7 @@ public class TableStatsMeta implements Writable { // Used for external table. @SerializedName("rowCount") - public final long rowCount; + public long rowCount; @SerializedName("updateTime") public long updatedTime; @@ -65,6 +67,12 @@ public class TableStatsMeta implements Writable { @SerializedName("trigger") public JobType jobType; + @VisibleForTesting + public TableStatsMeta() { + tblId = 0; + idxId = 0; + } + // It's necessary to store these fields separately from AnalysisInfo, since the lifecycle between AnalysisInfo // and TableStats is quite different. public TableStatsMeta(long rowCount, AnalysisInfo analyzedJob, TableIf table) { @@ -136,11 +144,16 @@ public void update(AnalysisInfo analyzedJob, TableIf tableIf) { } } jobType = analyzedJob.jobType; - if (tableIf != null && analyzedJob.colToPartitions.keySet() - .containsAll(tableIf.getBaseSchema().stream() - .filter(c -> !StatisticsUtil.isUnsupportedType(c.getType())) - .map(Column::getName).collect(Collectors.toSet()))) { - updatedRows.set(0); + if (tableIf != null) { + if (tableIf instanceof OlapTable) { + rowCount = tableIf.getRowCount(); + } + if (analyzedJob.colToPartitions.keySet() + .containsAll(tableIf.getBaseSchema().stream() + .filter(c -> !StatisticsUtil.isUnsupportedType(c.getType())) + .map(Column::getName).collect(Collectors.toSet()))) { + updatedRows.set(0); + } } } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/statistics/AnalysisManagerTest.java b/fe/fe-core/src/test/java/org/apache/doris/statistics/AnalysisManagerTest.java index 418a33c5d7f588..2bb36a9425e780 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/statistics/AnalysisManagerTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/statistics/AnalysisManagerTest.java @@ -379,7 +379,7 @@ public void testReAnalyze() { new MockUp() { int count = 0; - int[] rowCount = new int[]{100, 200}; + int[] rowCount = new int[]{100, 100, 200, 200}; final Column c = new Column("col1", PrimitiveType.INT); @Mock diff --git a/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java b/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java index 732196ef31b861..56475201765230 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java @@ -471,7 +471,7 @@ public TableIf findTable(long catalogId, long dbId, long tblId) { new MockUp() { int count = 0; - int[] rowCounts = {100, 0}; + int[] rowCounts = {100, 100, 100, 0, 0, 0, 0}; @Mock public long getRowCount() { return rowCounts[count++]; diff --git a/fe/fe-core/src/test/java/org/apache/doris/statistics/TableStatsMetaTest.java b/fe/fe-core/src/test/java/org/apache/doris/statistics/TableStatsMetaTest.java new file mode 100644 index 00000000000000..b5e73ba09da728 --- /dev/null +++ b/fe/fe-core/src/test/java/org/apache/doris/statistics/TableStatsMetaTest.java @@ -0,0 +1,46 @@ +// 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.doris.statistics; + +import org.apache.doris.catalog.OlapTable; + +import mockit.Mock; +import mockit.MockUp; +import mockit.Mocked; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; + +class TableStatsMetaTest { + + @Test + void update(@Mocked OlapTable table) { + new MockUp() { + @Mock + public long getRowCount() { + return 4; + } + }; + TableStatsMeta tableStatsMeta = new TableStatsMeta(); + AnalysisInfo jobInfo = new AnalysisInfoBuilder().setColToPartitions(new HashMap<>()) + .setColName("col1").build(); + tableStatsMeta.update(jobInfo, table); + Assertions.assertEquals(4, tableStatsMeta.rowCount); + } +}