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

Commit ff5b583

Browse files
Blade-Leelinmagit
authored andcommitted
Peloton Brain Recommended Indexes (#1274)
* need to work on 'SELECT' statements * tests passed for UPDATE, INSERT, DELETE & still need work on SELECT * SELECT half-way & code optimization * finished SELECT, but only works on 1 table & need to implement triplet and priority stuff * predicates in scanning node handled, need priority sorting & triplet * triplet added * priority sorting finished * added comments & code improvement * modified as suggested in PR review * added binder, now passing tests * fixed include validation error * fixed pointer issue * try to fix memory leak issue
1 parent 7040801 commit ff5b583

File tree

3 files changed

+334
-13
lines changed

3 files changed

+334
-13
lines changed

src/include/planner/plan_util.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include <set>
1616
#include <string>
17+
#include <tuple>
1718

1819
#include "planner/abstract_plan.h"
1920
#include "planner/abstract_scan_plan.h"
@@ -35,6 +36,7 @@ class SQLStatement;
3536
} // namespace parser
3637

3738
namespace planner {
39+
typedef std::tuple<oid_t, oid_t, oid_t> col_triplet;
3840

3941
class PlanUtil {
4042
public:
@@ -63,6 +65,18 @@ class PlanUtil {
6365
catalog::CatalogCache &catalog_cache,
6466
const parser::SQLStatement &sql_stmt);
6567

68+
/**
69+
* @brief Get the columns affected by a given query
70+
* @param CatalogCache
71+
* @param SQLStatementList
72+
* @param DBName
73+
* @return vector of affected column ids with triplet format
74+
*/
75+
static const std::vector<col_triplet> GetIndexableColumns(
76+
catalog::CatalogCache &catalog_cache,
77+
std::unique_ptr<parser::SQLStatementList> sql_stmt_list,
78+
const std::string &db_name);
79+
6680
private:
6781
///
6882
/// Helpers for GetInfo() and GetTablesReferenced()

src/planner/plan_util.cpp

Lines changed: 100 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,24 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
#include "planner/plan_util.h"
1314
#include <set>
1415
#include <string>
15-
1616
#include "catalog/catalog_cache.h"
1717
#include "catalog/column_catalog.h"
1818
#include "catalog/database_catalog.h"
1919
#include "catalog/index_catalog.h"
2020
#include "catalog/table_catalog.h"
21+
#include "common/statement.h"
22+
#include "concurrency/transaction_manager_factory.h"
23+
#include "expression/abstract_expression.h"
24+
#include "expression/expression_util.h"
25+
#include "optimizer/abstract_optimizer.h"
26+
#include "optimizer/optimizer.h"
2127
#include "parser/delete_statement.h"
2228
#include "parser/insert_statement.h"
2329
#include "parser/sql_statement.h"
2430
#include "parser/update_statement.h"
25-
#include "planner/plan_util.h"
2631
#include "util/set_util.h"
2732

2833
namespace peloton {
@@ -96,5 +101,98 @@ const std::set<oid_t> PlanUtil::GetAffectedIndexes(
96101
return (index_oids);
97102
}
98103

104+
const std::vector<col_triplet> PlanUtil::GetIndexableColumns(
105+
catalog::CatalogCache &catalog_cache,
106+
std::unique_ptr<parser::SQLStatementList> sql_stmt_list,
107+
const std::string &db_name) {
108+
std::vector<col_triplet> column_oids;
109+
std::string table_name;
110+
oid_t database_id, table_id;
111+
112+
// Assume that there is only one SQLStatement in the list
113+
auto sql_stmt = sql_stmt_list->GetStatement(0);
114+
switch (sql_stmt->GetType()) {
115+
// 1) use optimizer to get the plan tree
116+
// 2) aggregate results from all the leaf scan nodes
117+
case StatementType::UPDATE:
118+
PELOTON_FALLTHROUGH;
119+
case StatementType::DELETE:
120+
PELOTON_FALLTHROUGH;
121+
case StatementType::SELECT: {
122+
std::unique_ptr<optimizer::AbstractOptimizer> optimizer =
123+
std::unique_ptr<optimizer::AbstractOptimizer>(
124+
new optimizer::Optimizer());
125+
126+
auto &txn_manager = concurrency::TransactionManagerFactory::GetInstance();
127+
auto txn = txn_manager.BeginTransaction();
128+
129+
try {
130+
auto plan = optimizer->BuildPelotonPlanTree(sql_stmt_list, txn);
131+
132+
auto db_object = catalog_cache.GetDatabaseObject(db_name);
133+
database_id = db_object->GetDatabaseOid();
134+
135+
// Perform a breadth first search on plan tree
136+
std::queue<const AbstractPlan *> scan_queue;
137+
const AbstractPlan *temp_ptr;
138+
scan_queue.emplace(plan.get());
139+
140+
while (!scan_queue.empty()) {
141+
temp_ptr = scan_queue.front();
142+
scan_queue.pop();
143+
144+
// Leaf scanning node
145+
if (PlanNodeType::SEQSCAN == temp_ptr->GetPlanNodeType() ||
146+
PlanNodeType::INDEXSCAN == temp_ptr->GetPlanNodeType()) {
147+
auto temp_scan_ptr = static_cast<const AbstractScan *>(temp_ptr);
148+
149+
table_id = temp_scan_ptr->GetTable()->GetOid();
150+
151+
// Aggregate columns scanned in predicates
152+
ExprSet expr_set;
153+
auto predicate_ptr = temp_scan_ptr->GetPredicate();
154+
std::unique_ptr<expression::AbstractExpression> copied_predicate;
155+
if (nullptr == predicate_ptr) {
156+
copied_predicate = nullptr;
157+
} else {
158+
copied_predicate =
159+
std::unique_ptr<expression::AbstractExpression>(
160+
predicate_ptr->Copy());
161+
}
162+
expression::ExpressionUtil::GetTupleValueExprs(
163+
expr_set, copied_predicate.get());
164+
165+
for (const auto expr : expr_set) {
166+
auto tuple_value_expr =
167+
static_cast<const expression::TupleValueExpression *>(expr);
168+
169+
table_id =
170+
db_object->GetTableObject(tuple_value_expr->GetTableName())
171+
->GetTableOid();
172+
column_oids.emplace_back(database_id, table_id,
173+
(oid_t)tuple_value_expr->GetColumnId());
174+
}
175+
176+
} else {
177+
for (uint32_t idx = 0; idx < temp_ptr->GetChildrenSize(); ++idx) {
178+
scan_queue.emplace(temp_ptr->GetChild(idx));
179+
}
180+
}
181+
}
182+
183+
} catch (Exception &e) {
184+
LOG_ERROR("Error in BuildPelotonPlanTree: %s", e.what());
185+
}
186+
187+
// TODO: should transaction commit or not?
188+
txn_manager.AbortTransaction(txn);
189+
} break;
190+
default:
191+
LOG_TRACE("Return nothing for query type: %d",
192+
static_cast<int>(sql_stmt->GetType()));
193+
}
194+
return (column_oids);
195+
}
196+
99197
} // namespace planner
100198
} // namespace peloton

0 commit comments

Comments
 (0)