1313#include " catalog/column_stats_catalog.h"
1414
1515#include " catalog/catalog.h"
16+ #include " catalog/schema.h"
1617#include " executor/logical_tile.h"
1718#include " optimizer/stats/column_stats_collector.h"
1819#include " storage/data_table.h"
2122namespace peloton {
2223namespace catalog {
2324
24- ColumnStatsCatalog *ColumnStatsCatalog::GetInstance (
25- concurrency::TransactionContext *txn) {
26- static ColumnStatsCatalog column_stats_catalog{txn};
27- return &column_stats_catalog;
28- }
25+ ColumnStatsCatalog::ColumnStatsCatalog (
26+ storage::Database *pg_catalog,
27+ UNUSED_ATTRIBUTE type::AbstractPool *pool,
28+ UNUSED_ATTRIBUTE concurrency::TransactionContext *txn)
29+ : AbstractCatalog(COLUMN_STATS_CATALOG_OID, COLUMN_STATS_CATALOG_NAME,
30+ InitializeSchema ().release(), pg_catalog) {
31+ // Add indexes for pg_column_stats
32+ AddIndex ({ColumnId::TABLE_ID, ColumnId::COLUMN_ID},
33+ COLUMN_STATS_CATALOG_SKEY0_OID, COLUMN_STATS_CATALOG_NAME " _skey0" ,
34+ IndexConstraintType::UNIQUE);
35+ AddIndex ({ColumnId::TABLE_ID}, COLUMN_STATS_CATALOG_SKEY1_OID,
36+ COLUMN_STATS_CATALOG_NAME " _skey1" , IndexConstraintType::DEFAULT);
2937
30- ColumnStatsCatalog::ColumnStatsCatalog (concurrency::TransactionContext *txn)
31- : AbstractCatalog(" CREATE TABLE " CATALOG_DATABASE_NAME
32- " ." CATALOG_SCHEMA_NAME " ." COLUMN_STATS_CATALOG_NAME
33- " ("
34- " database_id INT NOT NULL, "
35- " table_id INT NOT NULL, "
36- " column_id INT NOT NULL, "
37- " num_rows INT NOT NULL, "
38- " cardinality DECIMAL NOT NULL, "
39- " frac_null DECIMAL NOT NULL, "
40- " most_common_vals VARCHAR, "
41- " most_common_freqs VARCHAR, "
42- " histogram_bounds VARCHAR, "
43- " column_name VARCHAR, "
44- " has_index BOOLEAN);" ,
45- txn) {
46- // unique key: (database_id, table_id, column_id)
47- Catalog::GetInstance ()->CreateIndex (
48- CATALOG_DATABASE_NAME, CATALOG_SCHEMA_NAME, COLUMN_STATS_CATALOG_NAME,
49- {0 , 1 , 2 }, COLUMN_STATS_CATALOG_NAME " _skey0" , true , IndexType::BWTREE,
50- txn);
51- // non-unique key: (database_id, table_id)
52- Catalog::GetInstance ()->CreateIndex (
53- CATALOG_DATABASE_NAME, CATALOG_SCHEMA_NAME, COLUMN_STATS_CATALOG_NAME,
54- {0 , 1 }, COLUMN_STATS_CATALOG_NAME " _skey1" , false , IndexType::BWTREE,
55- txn);
5638}
5739
5840ColumnStatsCatalog::~ColumnStatsCatalog () {}
5941
42+ std::unique_ptr<catalog::Schema> ColumnStatsCatalog::InitializeSchema () {
43+
44+ const std::string not_null_constraint_name = " notnull" ;
45+ const auto not_null_constraint = catalog::Constraint (
46+ ConstraintType::NOTNULL, not_null_constraint_name);
47+
48+ auto table_id_column = catalog::Column (
49+ type::TypeId::INTEGER, type::Type::GetTypeSize (type::TypeId::INTEGER),
50+ " table_id" , true );
51+ table_id_column.AddConstraint (not_null_constraint);
52+ auto column_id_column = catalog::Column (
53+ type::TypeId::INTEGER, type::Type::GetTypeSize (type::TypeId::INTEGER),
54+ " column_id" , true );
55+ column_id_column.AddConstraint (not_null_constraint);
56+ auto num_rows_column = catalog::Column (
57+ type::TypeId::INTEGER, type::Type::GetTypeSize (type::TypeId::INTEGER),
58+ " num_rows" , true );
59+ num_rows_column.AddConstraint (not_null_constraint);
60+ auto cardinality_column = catalog::Column (
61+ type::TypeId::DECIMAL, type::Type::GetTypeSize (type::TypeId::DECIMAL),
62+ " cardinality" , true );
63+ cardinality_column.AddConstraint (not_null_constraint);
64+ auto frac_null_column = catalog::Column (
65+ type::TypeId::DECIMAL, type::Type::GetTypeSize (type::TypeId::DECIMAL),
66+ " frac_null" , true );
67+ frac_null_column.AddConstraint (not_null_constraint);
68+ auto most_common_vals_column = catalog::Column (
69+ type::TypeId::VARCHAR, type::Type::GetTypeSize (type::TypeId::VARCHAR),
70+ " most_common_vals" , false );
71+ auto most_common_freqs_column = catalog::Column (
72+ type::TypeId::VARCHAR, type::Type::GetTypeSize (type::TypeId::VARCHAR),
73+ " most_common_freqs" , false );
74+ auto histogram_bounds_column = catalog::Column (
75+ type::TypeId::VARCHAR, type::Type::GetTypeSize (type::TypeId::VARCHAR),
76+ " histogram_bounds" , false );
77+ auto column_name_column = catalog::Column (
78+ type::TypeId::VARCHAR, type::Type::GetTypeSize (type::TypeId::VARCHAR),
79+ " column_name" , false );
80+ auto has_index_column = catalog::Column (
81+ type::TypeId::BOOLEAN, type::Type::GetTypeSize (type::TypeId::BOOLEAN),
82+ " has_index" , true );
83+
84+ std::unique_ptr<catalog::Schema> column_stats_schema (new catalog::Schema (
85+ {table_id_column, column_id_column, num_rows_column, cardinality_column,
86+ frac_null_column, most_common_vals_column, most_common_freqs_column,
87+ histogram_bounds_column, column_name_column, has_index_column}));
88+ return column_stats_schema;
89+ }
90+
6091bool ColumnStatsCatalog::InsertColumnStats (
61- oid_t database_id, oid_t table_id, oid_t column_id, int num_rows,
92+ oid_t table_id, oid_t column_id, int num_rows,
6293 double cardinality, double frac_null, std::string most_common_vals,
6394 std::string most_common_freqs, std::string histogram_bounds,
6495 std::string column_name, bool has_index, type::AbstractPool *pool,
6596 concurrency::TransactionContext *txn) {
6697 std::unique_ptr<storage::Tuple> tuple (
6798 new storage::Tuple (catalog_table_->GetSchema (), true ));
6899
69- auto val_db_id = type::ValueFactory::GetIntegerValue (database_id);
70100 auto val_table_id = type::ValueFactory::GetIntegerValue (table_id);
71101 auto val_column_id = type::ValueFactory::GetIntegerValue (column_id);
72102 auto val_num_row = type::ValueFactory::GetIntegerValue (num_rows);
@@ -96,7 +126,6 @@ bool ColumnStatsCatalog::InsertColumnStats(
96126 type::ValueFactory::GetVarcharValue (column_name);
97127 type::Value val_has_index = type::ValueFactory::GetBooleanValue (has_index);
98128
99- tuple->SetValue (ColumnId::DATABASE_ID, val_db_id, nullptr );
100129 tuple->SetValue (ColumnId::TABLE_ID, val_table_id, nullptr );
101130 tuple->SetValue (ColumnId::COLUMN_ID, val_column_id, nullptr );
102131 tuple->SetValue (ColumnId::NUM_ROWS, val_num_row, nullptr );
@@ -113,20 +142,19 @@ bool ColumnStatsCatalog::InsertColumnStats(
113142}
114143
115144bool ColumnStatsCatalog::DeleteColumnStats (
116- oid_t database_id, oid_t table_id, oid_t column_id,
117- concurrency::TransactionContext *txn) {
145+ oid_t table_id, oid_t column_id,
146+ concurrency::TransactionContext *txn) {
118147 oid_t index_offset = IndexId::SECONDARY_KEY_0; // Secondary key index
119148
120149 std::vector<type::Value> values;
121- values.push_back (type::ValueFactory::GetIntegerValue (database_id).Copy ());
122150 values.push_back (type::ValueFactory::GetIntegerValue (table_id).Copy ());
123151 values.push_back (type::ValueFactory::GetIntegerValue (column_id).Copy ());
124152
125153 return DeleteWithIndexScan (index_offset, values, txn);
126154}
127155
128156std::unique_ptr<std::vector<type::Value>> ColumnStatsCatalog::GetColumnStats (
129- oid_t database_id, oid_t table_id, oid_t column_id,
157+ oid_t table_id, oid_t column_id,
130158 concurrency::TransactionContext *txn) {
131159 std::vector<oid_t > column_ids (
132160 {ColumnId::NUM_ROWS, ColumnId::CARDINALITY, ColumnId::FRAC_NULL,
@@ -135,7 +163,6 @@ std::unique_ptr<std::vector<type::Value>> ColumnStatsCatalog::GetColumnStats(
135163 oid_t index_offset = IndexId::SECONDARY_KEY_0; // Secondary key index
136164
137165 std::vector<type::Value> values;
138- values.push_back (type::ValueFactory::GetIntegerValue (database_id).Copy ());
139166 values.push_back (type::ValueFactory::GetIntegerValue (table_id).Copy ());
140167 values.push_back (type::ValueFactory::GetIntegerValue (column_id).Copy ());
141168
@@ -175,7 +202,7 @@ std::unique_ptr<std::vector<type::Value>> ColumnStatsCatalog::GetColumnStats(
175202
176203// Return value: number of column stats
177204size_t ColumnStatsCatalog::GetTableStats (
178- oid_t database_id, oid_t table_id, concurrency::TransactionContext *txn,
205+ oid_t table_id, concurrency::TransactionContext *txn,
179206 std::map<oid_t , std::unique_ptr<std::vector<type::Value>>>
180207 &column_stats_map) {
181208 std::vector<oid_t > column_ids (
@@ -186,7 +213,6 @@ size_t ColumnStatsCatalog::GetTableStats(
186213 oid_t index_offset = IndexId::SECONDARY_KEY_1; // Secondary key index
187214
188215 std::vector<type::Value> values;
189- values.push_back (type::ValueFactory::GetIntegerValue (database_id).Copy ());
190216 values.push_back (type::ValueFactory::GetIntegerValue (table_id).Copy ());
191217
192218 auto result_tiles =
0 commit comments