@@ -31,12 +31,12 @@ namespace {
31
31
32
32
class ProjectInputRedirector : public hdk ::ir::ExprRewriter {
33
33
public:
34
- ProjectInputRedirector (const std::unordered_set<const hdk::ir::Project*>& crt_inputs)
34
+ ProjectInputRedirector (const std::unordered_set<hdk::ir::Project*>& crt_inputs)
35
35
: crt_projects_(crt_inputs) {}
36
36
37
37
hdk::ir::ExprPtr visitColumnRef (const hdk::ir::ColumnRef* col_ref) override {
38
38
auto source = dynamic_cast <const hdk::ir::Project*>(col_ref->node ());
39
- if (source && crt_projects_.count (source)) {
39
+ if (source && crt_projects_.count (const_cast <hdk::ir::Project*>( source) )) {
40
40
auto new_source = source->getInput (0 );
41
41
auto new_col_ref = dynamic_cast <const hdk::ir::ColumnRef*>(
42
42
source->getExpr (col_ref->index ()).get ());
@@ -49,7 +49,7 @@ class ProjectInputRedirector : public hdk::ir::ExprRewriter {
49
49
}
50
50
51
51
private:
52
- const std::unordered_set<const hdk::ir::Project*>& crt_projects_;
52
+ const std::unordered_set<hdk::ir::Project*>& crt_projects_;
53
53
};
54
54
55
55
// TODO: use more generic InputRenumberVisitor instead.
@@ -81,13 +81,13 @@ class InputSimpleRenumberVisitor : public hdk::ir::ExprRewriter {
81
81
82
82
size_t get_actual_source_size (
83
83
const hdk::ir::Project* curr_project,
84
- const std::unordered_set<const hdk::ir::Project*>& projects_to_remove) {
84
+ const std::unordered_set<hdk::ir::Project*>& projects_to_remove) {
85
85
auto source = curr_project->getInput (0 );
86
86
while (auto filter = dynamic_cast <const hdk::ir::Filter*>(source)) {
87
87
source = filter->getInput (0 );
88
88
}
89
89
if (auto src_project = dynamic_cast <const hdk::ir::Project*>(source)) {
90
- if (projects_to_remove.count (src_project)) {
90
+ if (projects_to_remove.count (const_cast <hdk::ir::Project*>( src_project) )) {
91
91
return get_actual_source_size (src_project, projects_to_remove);
92
92
}
93
93
}
@@ -113,11 +113,11 @@ bool safe_to_redirect(
113
113
}
114
114
115
115
bool is_identical_copy (
116
- const hdk::ir::Project* project,
116
+ hdk::ir::Project* project,
117
117
const std::unordered_map<const hdk::ir::Node*,
118
118
std::unordered_set<const hdk::ir::Node*>>& du_web,
119
- const std::unordered_set<const hdk::ir::Project*>& projects_to_remove,
120
- std::unordered_set<const hdk::ir::Project*>& permutating_projects) {
119
+ const std::unordered_set<hdk::ir::Project*>& projects_to_remove,
120
+ std::unordered_set<hdk::ir::Project*>& permutating_projects) {
121
121
auto source_size = get_actual_source_size (project, projects_to_remove);
122
122
if (project->size () > source_size) {
123
123
return false ;
@@ -221,17 +221,17 @@ void propagate_rex_input_renumber(
221
221
// This function appears to redirect/remove redundant Projection input nodes(?)
222
222
void redirect_inputs_of (
223
223
std::shared_ptr<hdk::ir::Node> node,
224
- const std::unordered_set<const hdk::ir::Project*>& projects,
225
- const std::unordered_set<const hdk::ir::Project*>& permutating_projects,
224
+ const std::unordered_set<hdk::ir::Project*>& projects,
225
+ const std::unordered_set<hdk::ir::Project*>& permutating_projects,
226
226
const std::unordered_map<const hdk::ir::Node*,
227
227
std::unordered_set<const hdk::ir::Node*>>& du_web) {
228
228
if (dynamic_cast <hdk::ir::LogicalUnion*>(node.get ())) {
229
229
return ; // UNION keeps all Projection inputs.
230
230
}
231
- std::shared_ptr<const hdk::ir::Project> src_project = nullptr ;
231
+ std::shared_ptr<hdk::ir::Project> src_project = nullptr ;
232
232
for (size_t i = 0 ; i < node->inputCount (); ++i) {
233
233
if (auto project =
234
- std::dynamic_pointer_cast<const hdk::ir::Project>(node->getAndOwnInput (i))) {
234
+ std::dynamic_pointer_cast<hdk::ir::Project>(node->getAndOwnInput (i))) {
235
235
if (projects.count (project.get ())) {
236
236
src_project = project;
237
237
break ;
@@ -244,8 +244,8 @@ void redirect_inputs_of(
244
244
if (auto join = std::dynamic_pointer_cast<hdk::ir::Join>(node)) {
245
245
auto other_project =
246
246
src_project == node->getAndOwnInput (0 )
247
- ? std::dynamic_pointer_cast<const hdk::ir::Project>(node->getAndOwnInput (1 ))
248
- : std::dynamic_pointer_cast<const hdk::ir::Project>(node->getAndOwnInput (0 ));
247
+ ? std::dynamic_pointer_cast<hdk::ir::Project>(node->getAndOwnInput (1 ))
248
+ : std::dynamic_pointer_cast<hdk::ir::Project>(node->getAndOwnInput (0 ));
249
249
join->replaceInput (src_project, src_project->getAndOwnInput (0 ));
250
250
// Case when join users have to be adjusted is not expected.
251
251
CHECK (src_project != node->getAndOwnInput (0 ) ||
@@ -459,16 +459,16 @@ bool project_separates_sort(const hdk::ir::Project* project,
459
459
// TODO(miyu): allow more chance if proved safe
460
460
void eliminate_identical_copy (
461
461
std::vector<std::shared_ptr<hdk::ir::Node>>& nodes) noexcept {
462
- std::unordered_set<std::shared_ptr< const hdk::ir::Node> > copies;
462
+ std::unordered_set<hdk::ir::NodePtr > copies;
463
463
auto sink = nodes.back ();
464
464
for (auto node : nodes) {
465
- auto aggregate = std::dynamic_pointer_cast<const hdk::ir::Aggregate>(node);
465
+ auto aggregate = std::dynamic_pointer_cast<hdk::ir::Aggregate>(node);
466
466
if (!aggregate || aggregate == sink ||
467
467
!(aggregate->getGroupByCount () == 1 && aggregate->getAggsCount () == 0 )) {
468
468
continue ;
469
469
}
470
470
auto project =
471
- std::dynamic_pointer_cast<const hdk::ir::Project>(aggregate->getAndOwnInput (0 ));
471
+ std::dynamic_pointer_cast<hdk::ir::Project>(aggregate->getAndOwnInput (0 ));
472
472
if (project && project->size () == aggregate->size () &&
473
473
project->getFields () == aggregate->getFields ()) {
474
474
CHECK_EQ (size_t (0 ), copies.count (aggregate));
@@ -483,30 +483,29 @@ void eliminate_identical_copy(
483
483
if (!copies.count (last_source)) {
484
484
continue ;
485
485
}
486
- auto aggregate = std::dynamic_pointer_cast<const hdk::ir::Aggregate>(last_source);
486
+ auto aggregate = std::dynamic_pointer_cast<hdk::ir::Aggregate>(last_source);
487
487
CHECK (aggregate);
488
- if (!std::dynamic_pointer_cast<const hdk::ir::Join>(node) || aggregate->size () != 1 ) {
488
+ if (!std::dynamic_pointer_cast<hdk::ir::Join>(node) || aggregate->size () != 1 ) {
489
489
continue ;
490
490
}
491
491
auto project =
492
- std::dynamic_pointer_cast<const hdk::ir::Project>(aggregate->getAndOwnInput (0 ));
492
+ std::dynamic_pointer_cast<hdk::ir::Project>(aggregate->getAndOwnInput (0 ));
493
493
CHECK (project);
494
494
CHECK_EQ (size_t (1 ), project->size ());
495
495
if (!is_distinct (size_t (0 ), project.get ())) {
496
496
continue ;
497
497
}
498
498
auto new_source = project->getAndOwnInput (0 );
499
- if (std::dynamic_pointer_cast<const hdk::ir::Sort>(new_source) ||
500
- std::dynamic_pointer_cast<const hdk::ir::Scan>(new_source)) {
499
+ if (new_source->is <hdk::ir::Sort>() || new_source->is <hdk::ir::Scan>()) {
501
500
node->replaceInput (last_source, new_source);
502
501
}
503
502
}
504
503
decltype (copies)().swap (copies);
505
504
506
505
auto web = build_du_web (nodes);
507
506
508
- std::unordered_set<const hdk::ir::Project*> projects;
509
- std::unordered_set<const hdk::ir::Project*> permutating_projects;
507
+ std::unordered_set<hdk::ir::Project*> projects;
508
+ std::unordered_set<hdk::ir::Project*> permutating_projects;
510
509
auto const visible_projs = get_visible_projects (nodes.back ().get ());
511
510
for (auto node_it = nodes.begin (); node_it != nodes.end (); node_it++) {
512
511
auto node = *node_it;
@@ -1350,8 +1349,8 @@ class InputRedirector : public hdk::ir::ExprRewriter {
1350
1349
};
1351
1350
1352
1351
void replace_all_usages (
1353
- std::shared_ptr< const hdk::ir::Node> old_def_node,
1354
- std::shared_ptr< const hdk::ir::Node> new_def_node,
1352
+ hdk::ir::NodePtr old_def_node,
1353
+ hdk::ir::NodePtr new_def_node,
1355
1354
std::unordered_map<const hdk::ir::Node*, std::shared_ptr<hdk::ir::Node>>&
1356
1355
deconst_mapping,
1357
1356
std::unordered_map<const hdk::ir::Node*, std::unordered_set<const hdk::ir::Node*>>&
0 commit comments