13
13
#include " catalog/column_stats_catalog.h"
14
14
15
15
#include " catalog/catalog.h"
16
+ #include " catalog/schema.h"
16
17
#include " executor/logical_tile.h"
17
18
#include " optimizer/stats/column_stats_collector.h"
18
19
#include " storage/data_table.h"
21
22
namespace peloton {
22
23
namespace catalog {
23
24
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);
29
37
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);
56
38
}
57
39
58
40
ColumnStatsCatalog::~ColumnStatsCatalog () {}
59
41
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
+
60
91
bool 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,
62
93
double cardinality, double frac_null, std::string most_common_vals,
63
94
std::string most_common_freqs, std::string histogram_bounds,
64
95
std::string column_name, bool has_index, type::AbstractPool *pool,
65
96
concurrency::TransactionContext *txn) {
66
97
std::unique_ptr<storage::Tuple> tuple (
67
98
new storage::Tuple (catalog_table_->GetSchema (), true ));
68
99
69
- auto val_db_id = type::ValueFactory::GetIntegerValue (database_id);
70
100
auto val_table_id = type::ValueFactory::GetIntegerValue (table_id);
71
101
auto val_column_id = type::ValueFactory::GetIntegerValue (column_id);
72
102
auto val_num_row = type::ValueFactory::GetIntegerValue (num_rows);
@@ -96,7 +126,6 @@ bool ColumnStatsCatalog::InsertColumnStats(
96
126
type::ValueFactory::GetVarcharValue (column_name);
97
127
type::Value val_has_index = type::ValueFactory::GetBooleanValue (has_index);
98
128
99
- tuple->SetValue (ColumnId::DATABASE_ID, val_db_id, nullptr );
100
129
tuple->SetValue (ColumnId::TABLE_ID, val_table_id, nullptr );
101
130
tuple->SetValue (ColumnId::COLUMN_ID, val_column_id, nullptr );
102
131
tuple->SetValue (ColumnId::NUM_ROWS, val_num_row, nullptr );
@@ -113,20 +142,19 @@ bool ColumnStatsCatalog::InsertColumnStats(
113
142
}
114
143
115
144
bool 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) {
118
147
oid_t index_offset = IndexId::SECONDARY_KEY_0; // Secondary key index
119
148
120
149
std::vector<type::Value> values;
121
- values.push_back (type::ValueFactory::GetIntegerValue (database_id).Copy ());
122
150
values.push_back (type::ValueFactory::GetIntegerValue (table_id).Copy ());
123
151
values.push_back (type::ValueFactory::GetIntegerValue (column_id).Copy ());
124
152
125
153
return DeleteWithIndexScan (index_offset, values, txn);
126
154
}
127
155
128
156
std::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,
130
158
concurrency::TransactionContext *txn) {
131
159
std::vector<oid_t > column_ids (
132
160
{ColumnId::NUM_ROWS, ColumnId::CARDINALITY, ColumnId::FRAC_NULL,
@@ -135,7 +163,6 @@ std::unique_ptr<std::vector<type::Value>> ColumnStatsCatalog::GetColumnStats(
135
163
oid_t index_offset = IndexId::SECONDARY_KEY_0; // Secondary key index
136
164
137
165
std::vector<type::Value> values;
138
- values.push_back (type::ValueFactory::GetIntegerValue (database_id).Copy ());
139
166
values.push_back (type::ValueFactory::GetIntegerValue (table_id).Copy ());
140
167
values.push_back (type::ValueFactory::GetIntegerValue (column_id).Copy ());
141
168
@@ -175,7 +202,7 @@ std::unique_ptr<std::vector<type::Value>> ColumnStatsCatalog::GetColumnStats(
175
202
176
203
// Return value: number of column stats
177
204
size_t ColumnStatsCatalog::GetTableStats (
178
- oid_t database_id, oid_t table_id, concurrency::TransactionContext *txn,
205
+ oid_t table_id, concurrency::TransactionContext *txn,
179
206
std::map<oid_t , std::unique_ptr<std::vector<type::Value>>>
180
207
&column_stats_map) {
181
208
std::vector<oid_t > column_ids (
@@ -186,7 +213,6 @@ size_t ColumnStatsCatalog::GetTableStats(
186
213
oid_t index_offset = IndexId::SECONDARY_KEY_1; // Secondary key index
187
214
188
215
std::vector<type::Value> values;
189
- values.push_back (type::ValueFactory::GetIntegerValue (database_id).Copy ());
190
216
values.push_back (type::ValueFactory::GetIntegerValue (table_id).Copy ());
191
217
192
218
auto result_tiles =
0 commit comments