This is an automated email from the ASF dual-hosted git repository.

kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new b1075446af9 [fix](stats) fix auto collector always create sample job 
no matter the table size #26968 (#26972)
b1075446af9 is described below

commit b1075446af96bd2f57eb11ca1a6a2590f96c0145
Author: AKIRA <33112463+kikyou1...@users.noreply.github.com>
AuthorDate: Wed Nov 15 09:37:30 2023 +0900

    [fix](stats) fix auto collector always create sample job no matter the 
table size #26968 (#26972)
---
 .../apache/doris/analysis/ShowColumnStatsStmt.java |  11 ++
 .../org/apache/doris/statistics/AnalysisInfo.java  |   8 +-
 .../doris/statistics/AnalysisInfoBuilder.java      |  45 ++-----
 .../apache/doris/statistics/AnalysisManager.java   |  22 +---
 .../apache/doris/statistics/HMSAnalysisTask.java   |   2 +-
 .../apache/doris/statistics/JdbcAnalysisTask.java  |   2 +-
 .../doris/statistics/StatisticsAutoCollector.java  |   9 +-
 .../apache/doris/statistics/TableStatsMeta.java    |  17 ++-
 .../doris/statistics/AnalysisManagerTest.java      |  17 ++-
 .../statistics/StatisticsAutoCollectorTest.java    | 138 ++++++++++++++++++++-
 10 files changed, 200 insertions(+), 71 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStatsStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStatsStmt.java
index f82c644b538..d88b024fffa 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStatsStmt.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStatsStmt.java
@@ -32,6 +32,7 @@ import org.apache.doris.mysql.privilege.PrivPredicate;
 import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.qe.ShowResultSet;
 import org.apache.doris.qe.ShowResultSetMetaData;
+import org.apache.doris.statistics.ColStatsMeta;
 import org.apache.doris.statistics.ColumnStatistic;
 
 import com.google.common.collect.ImmutableList;
@@ -54,6 +55,10 @@ public class ShowColumnStatsStmt extends ShowStmt {
                     .add("avg_size_byte")
                     .add("min")
                     .add("max")
+                    .add("method")
+                    .add("type")
+                    .add("trigger")
+                    .add("query_times")
                     .add("updated_time")
                     .build();
 
@@ -145,6 +150,12 @@ public class ShowColumnStatsStmt extends ShowStmt {
             row.add(String.valueOf(p.second.avgSizeByte));
             row.add(String.valueOf(p.second.minExpr == null ? "N/A" : 
p.second.minExpr.toSql()));
             row.add(String.valueOf(p.second.maxExpr == null ? "N/A" : 
p.second.maxExpr.toSql()));
+            ColStatsMeta colStatsMeta = 
Env.getCurrentEnv().getAnalysisManager().findColStatsMeta(table.getId(),
+                    p.first);
+            row.add(String.valueOf(colStatsMeta == null ? "N/A" : 
colStatsMeta.analysisMethod));
+            row.add(String.valueOf(colStatsMeta == null ? "N/A" : 
colStatsMeta.analysisType));
+            row.add(String.valueOf(colStatsMeta == null ? "N/A" : 
colStatsMeta.jobType));
+            row.add(String.valueOf(colStatsMeta == null ? "N/A" : 
colStatsMeta.queriedTimes));
             row.add(String.valueOf(p.second.updatedTime));
             result.add(row);
         });
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfo.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfo.java
index 9c298a6ea88..82dd036c3ab 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfo.java
@@ -182,6 +182,11 @@ public class AnalysisInfo implements Writable {
     @SerializedName("usingSqlForPartitionColumn")
     public final boolean usingSqlForPartitionColumn;
 
+    /**
+     * Used to store the newest partition version of tbl when creating this 
job.
+     */
+    public final long tblUpdateTime;
+
     public AnalysisInfo(long jobId, long taskId, List<Long> taskIds, long 
catalogId, long dbId, long tblId,
             Map<String, Set<String>> colToPartitions, Set<String> 
partitionNames, String colName, Long indexId,
             JobType jobType, AnalysisMode analysisMode, AnalysisMethod 
analysisMethod, AnalysisType analysisType,
@@ -189,7 +194,7 @@ public class AnalysisInfo implements Writable {
             long lastExecTimeInMs, long timeCostInMs, AnalysisState state, 
ScheduleType scheduleType,
             boolean isExternalTableLevelTask, boolean partitionOnly, boolean 
samplingPartition,
             boolean isAllPartition, long partitionCount, CronExpression 
cronExpression, boolean forceFull,
-            boolean usingSqlForPartitionColumn) {
+            boolean usingSqlForPartitionColumn, long tblUpdateTime) {
         this.jobId = jobId;
         this.taskId = taskId;
         this.taskIds = taskIds;
@@ -224,6 +229,7 @@ public class AnalysisInfo implements Writable {
         }
         this.forceFull = forceFull;
         this.usingSqlForPartitionColumn = usingSqlForPartitionColumn;
+        this.tblUpdateTime = tblUpdateTime;
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfoBuilder.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfoBuilder.java
index 18cf3e30792..204aba6d0f8 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfoBuilder.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfoBuilder.java
@@ -62,6 +62,8 @@ public class AnalysisInfoBuilder {
     private boolean forceFull;
     private boolean usingSqlForPartitionColumn;
 
+    private long tblUpdateTime;
+
     public AnalysisInfoBuilder() {
     }
 
@@ -97,6 +99,7 @@ public class AnalysisInfoBuilder {
         cronExpression = info.cronExpression;
         forceFull = info.forceFull;
         usingSqlForPartitionColumn = info.usingSqlForPartitionColumn;
+        tblUpdateTime = info.tblUpdateTime;
     }
 
     public AnalysisInfoBuilder setJobId(long jobId) {
@@ -254,45 +257,17 @@ public class AnalysisInfoBuilder {
         return this;
     }
 
+    public AnalysisInfoBuilder setTblUpdateTime(long tblUpdateTime) {
+        this.tblUpdateTime = tblUpdateTime;
+        return this;
+    }
+
     public AnalysisInfo build() {
         return new AnalysisInfo(jobId, taskId, taskIds, catalogId, dbId, 
tblId, colToPartitions, partitionNames,
                 colName, indexId, jobType, analysisMode, analysisMethod, 
analysisType, samplePercent,
                 sampleRows, maxBucketNum, periodTimeInMs, message, 
lastExecTimeInMs, timeCostInMs, state, scheduleType,
                 externalTableLevelTask, partitionOnly, samplingPartition, 
isAllPartition, partitionCount,
-                cronExpression, forceFull, usingSqlForPartitionColumn);
-    }
-
-    public AnalysisInfoBuilder copy() {
-        return new AnalysisInfoBuilder()
-                .setJobId(jobId)
-                .setTaskId(taskId)
-                .setTaskIds(taskIds)
-                .setCatalogId(catalogId)
-                .setDBId(dbId)
-                .setTblId(tblId)
-                .setColToPartitions(colToPartitions)
-                .setColName(colName)
-                .setIndexId(indexId)
-                .setJobType(jobType)
-                .setAnalysisMode(analysisMode)
-                .setAnalysisMethod(analysisMethod)
-                .setAnalysisType(analysisType)
-                .setSamplePercent(samplePercent)
-                .setSampleRows(sampleRows)
-                .setPeriodTimeInMs(periodTimeInMs)
-                .setMaxBucketNum(maxBucketNum)
-                .setMessage(message)
-                .setLastExecTimeInMs(lastExecTimeInMs)
-                .setTimeCostInMs(timeCostInMs)
-                .setState(state)
-                .setScheduleType(scheduleType)
-                .setExternalTableLevelTask(externalTableLevelTask)
-                .setSamplingPartition(samplingPartition)
-                .setPartitionOnly(partitionOnly)
-                .setAllPartition(isAllPartition)
-                .setPartitionCount(partitionCount)
-                .setCronExpression(cronExpression)
-                .setForceFull(forceFull)
-                .setUsingSqlForPartitionColumn(usingSqlForPartitionColumn);
+                cronExpression, forceFull, usingSqlForPartitionColumn, 
tblUpdateTime);
     }
+
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java
index c21f57eb098..d5b85bfaca6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java
@@ -29,7 +29,6 @@ import org.apache.doris.analysis.TableName;
 import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.Env;
-import org.apache.doris.catalog.Partition;
 import org.apache.doris.catalog.ScalarType;
 import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.View;
@@ -505,7 +504,7 @@ public class AnalysisManager implements Writable {
                 partitionNames, analysisType);
         infoBuilder.setColToPartitions(colToPartitions);
         infoBuilder.setTaskIds(Lists.newArrayList());
-
+        infoBuilder.setTblUpdateTime(table.getUpdateTime());
         return infoBuilder.build();
     }
 
@@ -601,9 +600,9 @@ public class AnalysisManager implements Writable {
         }
         TableStatsMeta tableStats = findTableStatsStatus(tbl.getId());
         if (tableStats == null) {
-            updateTableStatsStatus(new TableStatsMeta(tbl.getId(), 
tbl.estimatedRowCount(), jobInfo));
+            updateTableStatsStatus(new TableStatsMeta(tbl.estimatedRowCount(), 
jobInfo, tbl));
         } else {
-            tableStats.updateByJob(jobInfo);
+            tableStats.update(jobInfo, tbl);
             logCreateTableStats(tableStats);
         }
     }
@@ -1004,21 +1003,6 @@ public class AnalysisManager implements Writable {
         analysisJobIdToTaskMap.put(jobInfo.jobId, taskInfos);
     }
 
-    @VisibleForTesting
-    protected Set<String> findReAnalyzeNeededPartitions(TableIf table) {
-        TableStatsMeta tableStats = findTableStatsStatus(table.getId());
-        if (tableStats == null) {
-            return table.getPartitionNames().stream().map(table::getPartition)
-                    
.filter(Partition::hasData).map(Partition::getName).collect(Collectors.toSet());
-        }
-        return table.getPartitionNames().stream()
-                .map(table::getPartition)
-                .filter(Partition::hasData)
-                .filter(partition ->
-                        partition.getVisibleVersionTime() >= 
tableStats.updatedTime).map(Partition::getName)
-                .collect(Collectors.toSet());
-    }
-
     protected void logAutoJob(AnalysisInfo autoJob) {
         Env.getCurrentEnv().getEditLog().logAutoJob(autoJob);
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/HMSAnalysisTask.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/HMSAnalysisTask.java
index 812bd615a69..5be026e2acf 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/HMSAnalysisTask.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/HMSAnalysisTask.java
@@ -81,7 +81,7 @@ public class HMSAnalysisTask extends BaseAnalysisTask {
         String rowCount = columnResult.get(0).get(0);
         Env.getCurrentEnv().getAnalysisManager()
                 .updateTableStatsStatus(
-                        new TableStatsMeta(table.getId(), 
Long.parseLong(rowCount), info));
+                        new TableStatsMeta(Long.parseLong(rowCount), info, 
tbl));
         job.rowCountDone(this);
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/JdbcAnalysisTask.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/JdbcAnalysisTask.java
index 700710f6e42..e2e83aa8fa6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/JdbcAnalysisTask.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/JdbcAnalysisTask.java
@@ -76,7 +76,7 @@ public class JdbcAnalysisTask extends BaseAnalysisTask {
                 StatisticsUtil.execStatisticQuery(new 
StringSubstitutor(params).replace(ANALYZE_TABLE_COUNT_TEMPLATE));
         String rowCount = columnResult.get(0).get(0);
         Env.getCurrentEnv().getAnalysisManager()
-            .updateTableStatsStatus(new TableStatsMeta(table.getId(), 
Long.parseLong(rowCount), info));
+            .updateTableStatsStatus(new 
TableStatsMeta(Long.parseLong(rowCount), info, table));
         job.rowCountDone(this);
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsAutoCollector.java
 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsAutoCollector.java
index 32cf5cfb24b..02248fd9476 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsAutoCollector.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsAutoCollector.java
@@ -50,7 +50,7 @@ public class StatisticsAutoCollector extends 
StatisticsCollector {
 
     public StatisticsAutoCollector() {
         super("Automatic Analyzer",
-                
TimeUnit.MINUTES.toMillis(Config.auto_check_statistics_in_minutes),
+                
TimeUnit.SECONDS.toMillis(Config.auto_check_statistics_in_minutes),
                 new 
AnalysisTaskExecutor(Config.full_auto_analyze_simultaneously_running_task_num));
     }
 
@@ -142,12 +142,15 @@ public class StatisticsAutoCollector extends 
StatisticsCollector {
                 .setAnalysisType(AnalysisInfo.AnalysisType.FUNDAMENTALS)
                 .setAnalysisMode(AnalysisInfo.AnalysisMode.INCREMENTAL)
                 .setAnalysisMethod(analysisMethod)
-                .setSampleRows(StatisticsUtil.getHugeTableSampleRows())
+                .setSampleRows(analysisMethod.equals(AnalysisMethod.SAMPLE)
+                        ? StatisticsUtil.getHugeTableSampleRows() : -1)
                 .setScheduleType(ScheduleType.AUTOMATIC)
                 .setState(AnalysisState.PENDING)
                 .setTaskIds(new ArrayList<>())
                 .setLastExecTimeInMs(System.currentTimeMillis())
-                .setJobType(JobType.SYSTEM).build();
+                .setJobType(JobType.SYSTEM)
+                .setTblUpdateTime(table.getUpdateTime())
+                .build();
         analysisInfos.add(jobInfo);
     }
 
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 17ca61e9da5..0e32d030393 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
@@ -17,6 +17,8 @@
 
 package org.apache.doris.statistics;
 
+import org.apache.doris.catalog.Column;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.common.io.Text;
 import org.apache.doris.common.io.Writable;
 import org.apache.doris.persist.gson.GsonUtils;
@@ -64,11 +66,11 @@ public class TableStatsMeta implements Writable {
 
     // It's necessary to store these fields separately from AnalysisInfo, 
since the lifecycle between AnalysisInfo
     // and TableStats is quite different.
-    public TableStatsMeta(long tblId, long rowCount, AnalysisInfo analyzedJob) 
{
-        this.tblId = tblId;
+    public TableStatsMeta(long rowCount, AnalysisInfo analyzedJob, TableIf 
table) {
+        this.tblId = table.getId();
         this.idxId = -1;
         this.rowCount = rowCount;
-        updateByJob(analyzedJob);
+        update(analyzedJob, table);
     }
 
     @Override
@@ -112,8 +114,8 @@ public class TableStatsMeta implements Writable {
         colNameToColStatsMeta.values().forEach(ColStatsMeta::clear);
     }
 
-    public void updateByJob(AnalysisInfo analyzedJob) {
-        updatedTime = System.currentTimeMillis();
+    public void update(AnalysisInfo analyzedJob, TableIf tableIf) {
+        updatedTime = analyzedJob.tblUpdateTime;
         String colNameStr = analyzedJob.colName;
         // colName field AnalyzeJob's format likes: "[col1, col2]", we need to 
remove brackets here
         // TODO: Refactor this later
@@ -133,5 +135,10 @@ public class TableStatsMeta implements Writable {
             }
         }
         jobType = analyzedJob.jobType;
+        if (tableIf != null && analyzedJob.colToPartitions.keySet()
+                
.containsAll(tableIf.getColumns().stream().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 6372ce97d6e..f33a16f9b78 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
@@ -328,6 +328,8 @@ public class AnalysisManagerTest {
 
             int count = 0;
             int[] rowCount = new int[]{100, 200};
+
+            final Column c = new Column("col1", PrimitiveType.INT);
             @Mock
             public long getRowCount() {
                 return rowCount[count++];
@@ -335,16 +337,25 @@ public class AnalysisManagerTest {
 
             @Mock
             public List<Column> getBaseSchema() {
-                return Lists.newArrayList(new Column("col1", 
PrimitiveType.INT));
+                return Lists.newArrayList(c);
+            }
+
+            @Mock
+            public List<Column> getColumns() {
+                return Lists.newArrayList(c);
             }
 
         };
         OlapTable olapTable = new OlapTable();
-        TableStatsMeta stats1 = new TableStatsMeta(0, 50, new 
AnalysisInfoBuilder().setColName("col1").build());
+        TableStatsMeta stats1 = new TableStatsMeta(
+                50, new AnalysisInfoBuilder().setColToPartitions(new 
HashMap<>())
+                .setColName("col1").build(), olapTable);
         stats1.updatedRows.addAndGet(50);
 
         Assertions.assertTrue(olapTable.needReAnalyzeTable(stats1));
-        TableStatsMeta stats2 = new TableStatsMeta(0, 190, new 
AnalysisInfoBuilder().setColName("col1").build());
+        TableStatsMeta stats2 = new TableStatsMeta(
+                190, new AnalysisInfoBuilder()
+                .setColToPartitions(new 
HashMap<>()).setColName("col1").build(), olapTable);
         stats2.updatedRows.addAndGet(20);
         Assertions.assertFalse(olapTable.needReAnalyzeTable(stats2));
 
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 d441ce5b09d..00a68e204ab 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
@@ -20,6 +20,7 @@ package org.apache.doris.statistics;
 import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.DatabaseIf;
+import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.PrimitiveType;
 import org.apache.doris.catalog.Table;
@@ -179,15 +180,16 @@ public class StatisticsAutoCollectorTest {
                 return tableIf;
             }
         };
-        AnalysisInfo analysisInfo = new 
AnalysisInfoBuilder().setAnalysisMethod(AnalysisMethod.FULL).setAnalysisType(
+        AnalysisInfo analysisInfo = new 
AnalysisInfoBuilder().setAnalysisMethod(AnalysisMethod.FULL)
+                .setColToPartitions(new HashMap<>()).setAnalysisType(
                 
AnalysisType.FUNDAMENTALS).setColName("col1").setJobType(JobType.SYSTEM).build();
         new MockUp<AnalysisManager>() {
 
             int count = 0;
 
             TableStatsMeta[] tableStatsArr =
-                    new TableStatsMeta[] {new TableStatsMeta(0, 0, 
analysisInfo),
-                            new TableStatsMeta(0, 0, analysisInfo), null};
+                    new TableStatsMeta[] {new TableStatsMeta(0, analysisInfo, 
tableIf),
+                            new TableStatsMeta(0, analysisInfo, tableIf), 
null};
 
             {
                 tableStatsArr[0].updatedRows.addAndGet(100);
@@ -286,4 +288,134 @@ public class StatisticsAutoCollectorTest {
         // this is not olap table nor external table, so we should skip it 
this time
         Assertions.assertTrue(autoCollector.skip(anyOtherTable));
     }
+
+    // For small table, use full
+    @Test
+    public void testCreateAnalyzeJobForTbl1(
+            @Injectable OlapTable t1,
+            @Injectable Database db
+    ) throws Exception {
+        new MockUp<Database>() {
+
+            @Mock
+            public CatalogIf getCatalog() {
+                return Env.getCurrentInternalCatalog();
+            }
+
+            @Mock
+            public long getId() {
+                return 0;
+            }
+        };
+        new MockUp<OlapTable>() {
+
+            int count = 0;
+
+            @Mock
+            public List<Column> getBaseSchema() {
+                return Lists.newArrayList(new Column("test", 
PrimitiveType.INT));
+            }
+
+            @Mock
+            public long getDataSize(boolean singleReplica) {
+                return 1000;
+            }
+
+            @Mock
+            public BaseAnalysisTask createAnalysisTask(AnalysisInfo info) {
+                return new OlapAnalysisTask(info);
+            }
+        };
+
+        new MockUp<StatisticsUtil>() {
+            @Mock
+            public TableIf findTable(long catalogId, long dbId, long tblId) {
+                return t1;
+            }
+        };
+
+        StatisticsAutoCollector sac = new StatisticsAutoCollector();
+        List<AnalysisInfo> jobInfos = new ArrayList<>();
+        sac.createAnalyzeJobForTbl(db, jobInfos, t1);
+        AnalysisInfo jobInfo = jobInfos.get(0);
+        Map<String, Set<String>> colToPartitions = new HashMap<>();
+        colToPartitions.put("test", new HashSet<String>() {
+            {
+                add("p1");
+            }
+        });
+        jobInfo = new 
AnalysisInfoBuilder(jobInfo).setColToPartitions(colToPartitions).build();
+        Map<Long, BaseAnalysisTask> analysisTasks = new HashMap<>();
+        AnalysisManager analysisManager = 
Env.getCurrentEnv().getAnalysisManager();
+        analysisManager.createTaskForEachColumns(jobInfo, analysisTasks, 
false);
+        Assertions.assertEquals(1, analysisTasks.size());
+        for (BaseAnalysisTask task : analysisTasks.values()) {
+            Assertions.assertNull(task.getTableSample());
+        }
+    }
+
+    // for big table, use sample
+    @Test
+    public void testCreateAnalyzeJobForTbl2(
+            @Injectable OlapTable t1,
+            @Injectable Database db
+    ) throws Exception {
+        new MockUp<Database>() {
+
+            @Mock
+            public CatalogIf getCatalog() {
+                return Env.getCurrentInternalCatalog();
+            }
+
+            @Mock
+            public long getId() {
+                return 0;
+            }
+        };
+        new MockUp<OlapTable>() {
+
+            int count = 0;
+
+            @Mock
+            public List<Column> getBaseSchema() {
+                return Lists.newArrayList(new Column("test", 
PrimitiveType.INT));
+            }
+
+            @Mock
+            public long getDataSize(boolean singleReplica) {
+                return StatisticsUtil.getHugeTableLowerBoundSizeInBytes() * 2;
+            }
+
+            @Mock
+            public BaseAnalysisTask createAnalysisTask(AnalysisInfo info) {
+                return new OlapAnalysisTask(info);
+            }
+        };
+
+        new MockUp<StatisticsUtil>() {
+            @Mock
+            public TableIf findTable(long catalogId, long dbId, long tblId) {
+                return t1;
+            }
+        };
+
+        StatisticsAutoCollector sac = new StatisticsAutoCollector();
+        List<AnalysisInfo> jobInfos = new ArrayList<>();
+        sac.createAnalyzeJobForTbl(db, jobInfos, t1);
+        AnalysisInfo jobInfo = jobInfos.get(0);
+        Map<String, Set<String>> colToPartitions = new HashMap<>();
+        colToPartitions.put("test", new HashSet<String>() {
+            {
+                add("p1");
+            }
+        });
+        jobInfo = new 
AnalysisInfoBuilder(jobInfo).setColToPartitions(colToPartitions).build();
+        Map<Long, BaseAnalysisTask> analysisTasks = new HashMap<>();
+        AnalysisManager analysisManager = 
Env.getCurrentEnv().getAnalysisManager();
+        analysisManager.createTaskForEachColumns(jobInfo, analysisTasks, 
false);
+        Assertions.assertEquals(1, analysisTasks.size());
+        for (BaseAnalysisTask task : analysisTasks.values()) {
+            Assertions.assertNotNull(task.getTableSample());
+        }
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to