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

Commit dec8194

Browse files
committed
Templatized some of the core files:
- pattern - rule - ruleset - group - groupexpression - binding - memo - optimize_context - optimizer_task (TopDownRewrite/BottomUpRewrite) Templates generally followed: template <class Node, class OperatorType, class OperatorExpr> The template instantiation associated with: Node = Operator, OperatorType = OpType, OperatorExpr = OperatorExpression is used primarily by the core Optimizer. All references to the templated files/classes from core optimizer files were instantiated to that. Note worth mentioning: Operator class defines a public interface wrapper around BaseOperatorNode, basically defines a single logical/physical operator. OpType class defines the various logical/physical operations OperatorExpression class is essentially a tree of Operator
1 parent 484d76d commit dec8194

38 files changed

+836
-604
lines changed

src/include/optimizer/binding.h

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,63 +24,68 @@ namespace peloton {
2424
namespace optimizer {
2525

2626
class Optimizer;
27+
28+
template <class Node, class OperatorType, class OperatorExpr>
2729
class Memo;
2830

2931
//===--------------------------------------------------------------------===//
3032
// Binding Iterator
3133
//===--------------------------------------------------------------------===//
34+
template <class Node, class OperatorType, class OperatorExpr>
3235
class BindingIterator {
3336
public:
34-
BindingIterator(Memo& memo) : memo_(memo) {}
37+
BindingIterator(Memo<Node,OperatorType,OperatorExpr>& memo) : memo_(memo) {}
3538

3639
virtual ~BindingIterator(){};
3740

3841
virtual bool HasNext() = 0;
3942

40-
virtual std::shared_ptr<OperatorExpression> Next() = 0;
43+
virtual std::shared_ptr<OperatorExpr> Next() = 0;
4144

4245
protected:
43-
Memo &memo_;
46+
Memo<Node,OperatorType,OperatorExpr> &memo_;
4447
};
4548

46-
class GroupBindingIterator : public BindingIterator {
49+
template <class Node, class OperatorType, class OperatorExpr>
50+
class GroupBindingIterator : public BindingIterator<Node,OperatorType,OperatorExpr> {
4751
public:
48-
GroupBindingIterator(Memo& memo, GroupID id,
49-
std::shared_ptr<Pattern> pattern);
52+
GroupBindingIterator(Memo<Node,OperatorType,OperatorExpr>& memo,
53+
GroupID id,
54+
std::shared_ptr<Pattern<OperatorType>> pattern);
5055

5156
bool HasNext() override;
5257

53-
std::shared_ptr<OperatorExpression> Next() override;
58+
std::shared_ptr<OperatorExpr> Next() override;
5459

5560
private:
5661
GroupID group_id_;
57-
std::shared_ptr<Pattern> pattern_;
58-
Group *target_group_;
62+
std::shared_ptr<Pattern<OperatorType>> pattern_;
63+
Group<Node,OperatorType,OperatorExpr> *target_group_;
5964
size_t num_group_items_;
6065

6166
size_t current_item_index_;
62-
std::unique_ptr<BindingIterator> current_iterator_;
67+
std::unique_ptr<BindingIterator<Node,OperatorType,OperatorExpr>> current_iterator_;
6368
};
6469

65-
class GroupExprBindingIterator : public BindingIterator {
70+
template <class Node, class OperatorType, class OperatorExpr>
71+
class GroupExprBindingIterator : public BindingIterator<Node,OperatorType,OperatorExpr> {
6672
public:
67-
GroupExprBindingIterator(Memo& memo,
68-
GroupExpression *gexpr,
69-
std::shared_ptr<Pattern> pattern);
73+
GroupExprBindingIterator(Memo<Node,OperatorType,OperatorExpr>& memo,
74+
GroupExpression<Node,OperatorType,OperatorExpr> *gexpr,
75+
std::shared_ptr<Pattern<OperatorType>> pattern);
7076

7177
bool HasNext() override;
7278

73-
std::shared_ptr<OperatorExpression> Next() override;
79+
std::shared_ptr<OperatorExpr> Next() override;
7480

7581
private:
76-
GroupExpression* gexpr_;
77-
std::shared_ptr<Pattern> pattern_;
82+
GroupExpression<Node,OperatorType,OperatorExpr>* gexpr_;
83+
std::shared_ptr<Pattern<OperatorType>> pattern_;
7884

7985
bool first_;
8086
bool has_next_;
81-
std::shared_ptr<OperatorExpression> current_binding_;
82-
std::vector<std::vector<std::shared_ptr<OperatorExpression>>>
83-
children_bindings_;
87+
std::shared_ptr<OperatorExpr> current_binding_;
88+
std::vector<std::vector<std::shared_ptr<OperatorExpr>>> children_bindings_;
8489
std::vector<size_t> children_bindings_pos_;
8590
};
8691

src/include/optimizer/child_property_deriver.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@
1313
#pragma once
1414
#include <memory>
1515
#include "optimizer/operator_visitor.h"
16+
#include "optimizer/operator_expression.h"
1617

1718
namespace peloton {
1819

1920
namespace optimizer {
21+
template <class Node, class OpType, class OperatorExpr>
2022
class Memo;
2123
}
2224

@@ -33,8 +35,10 @@ class ChildPropertyDeriver : public OperatorVisitor {
3335
public:
3436
std::vector<std::pair<std::shared_ptr<PropertySet>,
3537
std::vector<std::shared_ptr<PropertySet>>>>
36-
GetProperties(GroupExpression *gexpr,
37-
std::shared_ptr<PropertySet> requirements, Memo *memo);
38+
39+
GetProperties(GroupExpression<Operator,OpType,OperatorExpression> *gexpr,
40+
std::shared_ptr<PropertySet> requirements,
41+
Memo<Operator,OpType,OperatorExpression> *memo);
3842

3943
void Visit(const DummyScan *) override;
4044
void Visit(const PhysicalSeqScan *) override;
@@ -74,8 +78,8 @@ class ChildPropertyDeriver : public OperatorVisitor {
7478
* @brief We need the memo and gexpr because some property may depend on
7579
* child's schema
7680
*/
77-
Memo *memo_;
78-
GroupExpression *gexpr_;
81+
Memo<Operator,OpType,OperatorExpression> *memo_;
82+
GroupExpression<Operator,OpType,OperatorExpression> *gexpr_;
7983
};
8084

8185
} // namespace optimizer

src/include/optimizer/cost_model/abstract_cost_model.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@
1313
#pragma once
1414

1515
#include "optimizer/operator_visitor.h"
16+
#include "optimizer/operator_expression.h"
1617

1718
namespace peloton {
1819
namespace optimizer {
1920

21+
template <class Node, class OperatorType, class OperatorExpr>
2022
class Memo;
2123

2224
// Default cost when cost model cannot compute correct cost.
@@ -34,7 +36,8 @@ static constexpr double DEFAULT_OPERATOR_COST = 0.0025;
3436

3537
class AbstractCostModel : public OperatorVisitor {
3638
public:
37-
virtual double CalculateCost(GroupExpression *gexpr, Memo *memo,
39+
virtual double CalculateCost(GroupExpression<Operator,OpType,OperatorExpression> *gexpr,
40+
Memo<Operator,OpType,OperatorExpression> *memo,
3841
concurrency::TransactionContext *txn) = 0;
3942
};
4043

src/include/optimizer/cost_model/default_cost_model.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,17 @@
2323
namespace peloton {
2424
namespace optimizer {
2525

26+
template <class Node, class OperatorType, class OperatorExpr>
2627
class Memo;
28+
2729
// Derive cost for a physical group expression
2830
class DefaultCostModel : public AbstractCostModel {
2931
public:
3032
DefaultCostModel(){};
3133

32-
double CalculateCost(GroupExpression *gexpr, Memo *memo,
33-
concurrency::TransactionContext *txn) {
34+
double CalculateCost(GroupExpression<Operator,OpType,OperatorExpression> *gexpr,
35+
Memo<Operator,OpType,OperatorExpression> *memo,
36+
concurrency::TransactionContext *txn) {
3437
gexpr_ = gexpr;
3538
memo_ = memo;
3639
txn_ = txn;
@@ -151,8 +154,8 @@ class DefaultCostModel : public AbstractCostModel {
151154
return child_num_rows * DEFAULT_TUPLE_COST;
152155
}
153156

154-
GroupExpression *gexpr_;
155-
Memo *memo_;
157+
GroupExpression<Operator,OpType,OperatorExpression> *gexpr_;
158+
Memo<Operator,OpType,OperatorExpression> *memo_;
156159
concurrency::TransactionContext *txn_;
157160
double output_cost_ = 0;
158161
};

src/include/optimizer/cost_model/postgres_cost_model.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,16 @@
2828
namespace peloton {
2929
namespace optimizer {
3030

31+
template <class Node, class OperatorType, class OperatorExpr>
3132
class Memo;
33+
3234
// Derive cost for a physical group expression
3335
class PostgresCostModel : public AbstractCostModel {
3436
public:
3537
PostgresCostModel(){};
3638

37-
double CalculateCost(GroupExpression *gexpr, Memo *memo,
39+
double CalculateCost(GroupExpression<Operator,OpType,OperatorExpression> *gexpr,
40+
Memo<Operator,OpType,OperatorExpression> *memo,
3841
concurrency::TransactionContext *txn) override {
3942
gexpr_ = gexpr;
4043
memo_ = memo;
@@ -230,8 +233,8 @@ class PostgresCostModel : public AbstractCostModel {
230233
}
231234

232235

233-
GroupExpression *gexpr_;
234-
Memo *memo_;
236+
GroupExpression<Operator,OpType,OperatorExpression> *gexpr_;
237+
Memo<Operator,OpType,OperatorExpression> *memo_;
235238
concurrency::TransactionContext *txn_;
236239
double output_cost_ = 0;
237240

@@ -279,4 +282,4 @@ class PostgresCostModel : public AbstractCostModel {
279282
};
280283

281284
} // namespace optimizer
282-
} // namespace peloton
285+
} // namespace peloton

src/include/optimizer/cost_model/trivial_cost_model.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,15 @@
3131
namespace peloton {
3232
namespace optimizer {
3333

34+
template <class Node, class OperatorType, class OperatorExpr>
3435
class Memo;
36+
3537
class TrivialCostModel : public AbstractCostModel {
3638
public:
3739
TrivialCostModel(){};
3840

39-
double CalculateCost(GroupExpression *gexpr, Memo *memo,
41+
double CalculateCost(GroupExpression<Operator,OpType,OperatorExpression> *gexpr,
42+
Memo<Operator,OpType,OperatorExpression> *memo,
4043
concurrency::TransactionContext *txn) override {
4144
gexpr_ = gexpr;
4245
memo_ = memo;
@@ -109,11 +112,11 @@ class TrivialCostModel : public AbstractCostModel {
109112
}
110113

111114
private:
112-
GroupExpression *gexpr_;
113-
Memo *memo_;
115+
GroupExpression<Operator,OpType,OperatorExpression> *gexpr_;
116+
Memo<Operator,OpType,OperatorExpression> *memo_;
114117
concurrency::TransactionContext *txn_;
115118
double output_cost_ = 0;
116119
};
117120

118121
} // namespace optimizer
119-
} // namespace peloton
122+
} // namespace peloton

src/include/optimizer/group.h

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,36 +32,38 @@ class ColumnStats;
3232
//===--------------------------------------------------------------------===//
3333
// Group
3434
//===--------------------------------------------------------------------===//
35+
template <class Node, class OperatorType, class OperatorExpr>
3536
class Group : public Printable {
3637
public:
3738
Group(GroupID id, std::unordered_set<std::string> table_alias);
3839

3940
// If the GroupExpression is generated by applying a
4041
// property enforcer, we add them to enforced_exprs_
4142
// which will not be enumerated during OptimizeExpression
42-
void AddExpression(std::shared_ptr<GroupExpression> expr, bool enforced);
43+
void AddExpression(std::shared_ptr<GroupExpression<Node,OperatorType,OperatorExpr>> expr,
44+
bool enforced);
4345

4446
void RemoveLogicalExpression(size_t idx) {
4547
logical_expressions_.erase(logical_expressions_.begin() + idx);
4648
}
4749

48-
bool SetExpressionCost(GroupExpression *expr, double cost,
50+
bool SetExpressionCost(GroupExpression<Node,OperatorType,OperatorExpr> *expr, double cost,
4951
std::shared_ptr<PropertySet> &properties);
5052

51-
GroupExpression *GetBestExpression(std::shared_ptr<PropertySet> &properties);
53+
GroupExpression<Node,OperatorType,OperatorExpr> *GetBestExpression(std::shared_ptr<PropertySet> &properties);
5254

5355
inline const std::unordered_set<std::string> &GetTableAliases() const {
5456
return table_aliases_;
5557
}
5658

5759
// TODO: thread safety?
58-
const std::vector<std::shared_ptr<GroupExpression>> GetLogicalExpressions()
60+
const std::vector<std::shared_ptr<GroupExpression<Node,OperatorType,OperatorExpr>>> GetLogicalExpressions()
5961
const {
6062
return logical_expressions_;
6163
}
6264

6365
// TODO: thread safety?
64-
const std::vector<std::shared_ptr<GroupExpression>> GetPhysicalExpressions()
66+
const std::vector<std::shared_ptr<GroupExpression<Node,OperatorType,OperatorExpr>>> GetPhysicalExpressions()
6567
const {
6668
return physical_expressions_;
6769
}
@@ -105,7 +107,7 @@ class Group : public Printable {
105107

106108
// This should only be called in rewrite phase to retrieve the only logical
107109
// expr in the group
108-
inline GroupExpression *GetLogicalExpression() {
110+
inline GroupExpression<Node,OperatorType,OperatorExpr> *GetLogicalExpression() {
109111
PELOTON_ASSERT(logical_expressions_.size() == 1);
110112
PELOTON_ASSERT(physical_expressions_.size() == 0);
111113
return logical_expressions_[0].get();
@@ -117,15 +119,15 @@ class Group : public Printable {
117119
// TODO(boweic) Do not use string, store table alias id
118120
std::unordered_set<std::string> table_aliases_;
119121
std::unordered_map<std::shared_ptr<PropertySet>,
120-
std::tuple<double, GroupExpression *>, PropSetPtrHash,
122+
std::tuple<double, GroupExpression<Node,OperatorType,OperatorExpr> *>, PropSetPtrHash,
121123
PropSetPtrEq> lowest_cost_expressions_;
122124

123125
// Whether equivalent logical expressions have been explored for this group
124126
bool has_explored_;
125127

126-
std::vector<std::shared_ptr<GroupExpression>> logical_expressions_;
127-
std::vector<std::shared_ptr<GroupExpression>> physical_expressions_;
128-
std::vector<std::shared_ptr<GroupExpression>> enforced_exprs_;
128+
std::vector<std::shared_ptr<GroupExpression<Node,OperatorType,OperatorExpr>>> logical_expressions_;
129+
std::vector<std::shared_ptr<GroupExpression<Node,OperatorType,OperatorExpr>>> physical_expressions_;
130+
std::vector<std::shared_ptr<GroupExpression<Node,OperatorType,OperatorExpr>>> enforced_exprs_;
129131

130132
// We'll add stats lazily
131133
// TODO(boweic):

src/include/optimizer/group_expression.h

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,18 @@
2525
namespace peloton {
2626
namespace optimizer {
2727

28+
template <class Node, class OperatorType, class OperatorExpr>
2829
class Rule;
2930

3031
using GroupID = int32_t;
3132

3233
//===--------------------------------------------------------------------===//
3334
// Group Expression
3435
//===--------------------------------------------------------------------===//
36+
template <class Node, class OperatorType, class OperatorExpr>
3537
class GroupExpression {
3638
public:
37-
GroupExpression(Operator op, std::vector<GroupID> child_groups);
39+
GroupExpression(Node op, std::vector<GroupID> child_groups);
3840

3941
GroupID GetGroupID() const;
4042

@@ -46,7 +48,7 @@ class GroupExpression {
4648

4749
GroupID GetChildGroupId(int child_idx) const;
4850

49-
Operator Op() const;
51+
Node Op() const;
5052

5153
double GetCost(std::shared_ptr<PropertySet>& requirements) const;
5254

@@ -61,11 +63,11 @@ class GroupExpression {
6163

6264
hash_t Hash() const;
6365

64-
bool operator==(const GroupExpression &r);
66+
bool operator==(const GroupExpression<Node, OperatorType, OperatorExpr> &r);
6567

66-
void SetRuleExplored(Rule *rule);
68+
void SetRuleExplored(Rule<Node,OperatorType,OperatorExpr> *rule);
6769

68-
bool HasRuleExplored(Rule *rule);
70+
bool HasRuleExplored(Rule<Node,OperatorType,OperatorExpr> *rule);
6971

7072
void SetDerivedStats() { stats_derived_ = true; }
7173

@@ -75,7 +77,7 @@ class GroupExpression {
7577

7678
private:
7779
GroupID group_id;
78-
Operator op;
80+
Node op;
7981
std::vector<GroupID> child_groups;
8082
std::bitset<static_cast<uint32_t>(RuleType::NUM_RULES)> rule_mask_;
8183
bool stats_derived_;
@@ -92,9 +94,9 @@ class GroupExpression {
9294

9395
namespace std {
9496

95-
template <>
96-
struct hash<peloton::optimizer::GroupExpression> {
97-
typedef peloton::optimizer::GroupExpression argument_type;
97+
template <class Node, class OperatorType, class OperatorExpr>
98+
struct hash<peloton::optimizer::GroupExpression<Node,OperatorType,OperatorExpr>> {
99+
typedef peloton::optimizer::GroupExpression<Node,OperatorType,OperatorExpr> argument_type;
98100
typedef std::size_t result_type;
99101
result_type operator()(argument_type const &s) const { return s.Hash(); }
100102
};

0 commit comments

Comments
 (0)