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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]