Skip to content
This repository was archived by the owner on Sep 27, 2019. It is now read-only.

Commit 6ffb0b3

Browse files
Fixed AnalyzeAllTables
1 parent c5a0bc9 commit 6ffb0b3

File tree

2 files changed

+70
-60
lines changed

2 files changed

+70
-60
lines changed

src/optimizer/stats/stats_storage.cpp

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -261,30 +261,38 @@ std::shared_ptr<TableStats> StatsStorage::GetTableStats(
261261
// Needs to be handled differently. Used only in tests.
262262
ResultType StatsStorage::AnalyzeStatsForAllTables(
263263
UNUSED_ATTRIBUTE concurrency::TransactionContext *txn) {
264-
// if (txn == nullptr) {
265-
// LOG_TRACE("Do not have transaction to analyze all tables' stats.");
266-
// return ResultType::FAILURE;
267-
// }
268-
//
269-
// auto storage_manager = storage::StorageManager::GetInstance();
270-
//
271-
// oid_t database_count = storage_manager->GetDatabaseCount();
272-
// LOG_TRACE("Database count: %u", database_count);
273-
// for (oid_t db_offset = 0; db_offset < database_count; db_offset++) {
274-
// auto database = storage_manager->GetDatabaseWithOffset(db_offset);
275-
// if (database->GetOid() == CATALOG_DATABASE_OID) {
276-
// continue;
277-
// }
278-
// oid_t table_count = database->GetTableCount();
279-
// for (oid_t table_offset = 0; table_offset < table_count; table_offset++) {
280-
// auto table = database->GetTable(table_offset);
281-
// LOG_TRACE("Analyzing table: %s", table->GetName().c_str());
282-
// std::unique_ptr<TableStatsCollector> table_stats_collector(
283-
// new TableStatsCollector(table));
284-
// table_stats_collector->CollectColumnStats();
285-
// InsertOrUpdateTableStats(table, table_stats_collector.get(), txn);
286-
// }
287-
// }
264+
if (txn == nullptr) {
265+
LOG_TRACE("Do not have transaction to analyze all tables' stats.");
266+
return ResultType::FAILURE;
267+
}
268+
269+
auto storage_manager = storage::StorageManager::GetInstance();
270+
271+
oid_t database_count = storage_manager->GetDatabaseCount();
272+
LOG_TRACE("Database count: %u", database_count);
273+
for (oid_t db_offset = 0; db_offset < database_count; db_offset++) {
274+
auto database = storage_manager->GetDatabaseWithOffset(db_offset);
275+
auto database_oid = database->GetOid();
276+
if (database_oid == CATALOG_DATABASE_OID) {
277+
continue;
278+
}
279+
auto pg_database = catalog::Catalog::GetInstance()
280+
->GetDatabaseObject(database_oid, txn);
281+
auto table_objects = pg_database->GetTableObjects();
282+
for (auto &table_object_entry : table_objects) {
283+
auto table_oid = table_object_entry.first;
284+
auto table_object = table_object_entry.second;
285+
if (table_object->GetSchemaName() == CATALOG_SCHEMA_NAME) {
286+
continue;
287+
}
288+
LOG_TRACE("Analyzing table: %s", table_object->GetTableName().c_str());
289+
auto table = database->GetTableWithOid(table_oid);
290+
std::unique_ptr<TableStatsCollector> table_stats_collector(
291+
new TableStatsCollector(table));
292+
table_stats_collector->CollectColumnStats();
293+
InsertOrUpdateTableStats(table, table_stats_collector.get(), txn);
294+
}
295+
}
288296
return ResultType::SUCCESS;
289297
}
290298

test/optimizer/stats_storage_test.cpp

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -232,43 +232,45 @@ TEST_F(StatsStorageTests, AnalyzeStatsForTableTest) {
232232
}
233233

234234
// TODO: Add more tables.
235-
//TEST_F(StatsStorageTests, AnalyzeStatsForAllTablesTest) {
236-
// const std::string db_name = "test_db";
237-
// auto data_table = CreateTestDBAndTable();
238-
//
239-
// StatsStorage *stats_storage = StatsStorage::GetInstance();
240-
//
241-
// // Must pass in the transaction.
242-
// ResultType result = stats_storage->AnalyzeStatsForAllTables();
243-
// EXPECT_EQ(result, ResultType::FAILURE);
244-
//
245-
// auto &txn_manager = concurrency::TransactionManagerFactory::GetInstance();
246-
// auto txn = txn_manager.BeginTransaction();
247-
// result = stats_storage->AnalyzeStatsForAllTables(txn);
248-
// EXPECT_EQ(result, ResultType::SUCCESS);
249-
// txn_manager.CommitTransaction(txn);
250-
//
251-
// // Check the correctness of the stats.
252-
// VerifyAndPrintColumnStats(data_table, 4);
253-
// TestingExecutorUtil::DeleteDatabase(db_name);
254-
//
255-
//}
235+
TEST_F(StatsStorageTests, AnalyzeStatsForAllTablesTest) {
236+
const std::string db_name = "test_db";
237+
auto data_table = CreateTestDBAndTable();
256238

257-
//TEST_F(StatsStorageTests, GetTableStatsTest) {
258-
// auto data_table = InitializeTestTable();
259-
// StatsStorage *stats_storage = StatsStorage::GetInstance();
260-
//
261-
// auto &txn_manager = concurrency::TransactionManagerFactory::GetInstance();
262-
// auto txn = txn_manager.BeginTransaction();
263-
// stats_storage->AnalyzeStatsForAllTables(txn);
264-
// txn_manager.CommitTransaction(txn);
265-
//
266-
// txn = txn_manager.BeginTransaction();
267-
// std::shared_ptr<TableStats> table_stats = stats_storage->GetTableStats(
268-
// data_table->GetDatabaseOid(), data_table->GetOid(), txn);
269-
// txn_manager.CommitTransaction(txn);
270-
// EXPECT_EQ(table_stats->num_rows, tuple_count);
271-
//}
239+
StatsStorage *stats_storage = StatsStorage::GetInstance();
240+
241+
// Must pass in the transaction.
242+
ResultType result = stats_storage->AnalyzeStatsForAllTables();
243+
EXPECT_EQ(result, ResultType::FAILURE);
244+
245+
auto &txn_manager = concurrency::TransactionManagerFactory::GetInstance();
246+
auto txn = txn_manager.BeginTransaction();
247+
result = stats_storage->AnalyzeStatsForAllTables(txn);
248+
EXPECT_EQ(result, ResultType::SUCCESS);
249+
txn_manager.CommitTransaction(txn);
250+
251+
// Check the correctness of the stats.
252+
VerifyAndPrintColumnStats(data_table, 4);
253+
TestingExecutorUtil::DeleteDatabase(db_name);
254+
255+
}
256+
257+
TEST_F(StatsStorageTests, GetTableStatsTest) {
258+
const std::string db_name = "test_db";
259+
auto data_table = CreateTestDBAndTable();
260+
StatsStorage *stats_storage = StatsStorage::GetInstance();
261+
262+
auto &txn_manager = concurrency::TransactionManagerFactory::GetInstance();
263+
auto txn = txn_manager.BeginTransaction();
264+
stats_storage->AnalyzeStatsForAllTables(txn);
265+
txn_manager.CommitTransaction(txn);
266+
267+
txn = txn_manager.BeginTransaction();
268+
std::shared_ptr<TableStats> table_stats = stats_storage->GetTableStats(
269+
data_table->GetDatabaseOid(), data_table->GetOid(), txn);
270+
txn_manager.CommitTransaction(txn);
271+
EXPECT_EQ(table_stats->num_rows, tuple_count);
272+
TestingExecutorUtil::DeleteDatabase(db_name);
273+
}
272274

273275
} // namespace test
274276
} // namespace peloton

0 commit comments

Comments
 (0)