@@ -59,47 +59,50 @@ namespace doris::vectorized {
59
59
void MergeSorterState::reset () {
60
60
auto empty_queue = std::priority_queue<MergeSortCursor>();
61
61
priority_queue_.swap (empty_queue);
62
- std::vector<MergeSortCursorImpl> empty_cursors (0 );
62
+ std::vector<std::shared_ptr< MergeSortCursorImpl> > empty_cursors (0 );
63
63
cursors_.swap (empty_cursors);
64
- std::vector<Block> empty_blocks (0 );
64
+ std::vector<std::shared_ptr< Block> > empty_blocks (0 );
65
65
sorted_blocks_.swap (empty_blocks);
66
66
unsorted_block_ = Block::create_unique (unsorted_block_->clone_empty ());
67
67
in_mem_sorted_bocks_size_ = 0 ;
68
68
}
69
- Status MergeSorterState::add_sorted_block (Block& block) {
69
+ Status MergeSorterState::add_sorted_block (Block&& block) {
70
70
auto rows = block.rows ();
71
71
if (0 == rows) {
72
72
return Status::OK ();
73
73
}
74
74
in_mem_sorted_bocks_size_ += block.bytes ();
75
- sorted_blocks_.emplace_back (std::move (block));
75
+ sorted_blocks_.emplace_back (Block::create_shared ( std::move (block) ));
76
76
num_rows_ += rows;
77
77
return Status::OK ();
78
78
}
79
79
80
80
Status MergeSorterState::build_merge_tree (const SortDescription& sort_description) {
81
81
for (auto & block : sorted_blocks_) {
82
- cursors_.emplace_back (block, sort_description);
82
+ cursors_.emplace_back (
83
+ MergeSortCursorImpl::create_shared (std::move (block), sort_description));
83
84
}
84
85
85
- if (sorted_blocks_.size () > 1 ) {
86
+ sorted_blocks_.clear ();
87
+ if (cursors_.size () > 1 ) {
86
88
for (auto & cursor : cursors_) {
87
- priority_queue_.emplace (& cursor);
89
+ priority_queue_.emplace (std::move ( cursor) );
88
90
}
91
+ cursors_.clear ();
89
92
}
90
93
91
94
return Status::OK ();
92
95
}
93
96
94
97
Status MergeSorterState::merge_sort_read (doris::vectorized::Block* block, int batch_size,
95
98
bool * eos) {
96
- if (sorted_blocks_ .empty ()) {
99
+ if (cursors_. empty () && priority_queue_ .empty ()) {
97
100
*eos = true ;
98
- } else if (sorted_blocks_ .size () == 1 ) {
101
+ } else if (cursors_ .size () == 1 ) {
99
102
if (offset_ != 0 ) {
100
- sorted_blocks_ [0 ]. skip_num_rows (offset_);
103
+ cursors_ [0 ]-> block -> skip_num_rows (offset_);
101
104
}
102
- block->swap (sorted_blocks_ [0 ]);
105
+ block->swap (*cursors_ [0 ]-> block );
103
106
*eos = true ;
104
107
} else {
105
108
RETURN_IF_ERROR (_merge_sort_read_impl (batch_size, block, eos));
@@ -109,9 +112,14 @@ Status MergeSorterState::merge_sort_read(doris::vectorized::Block* block, int ba
109
112
110
113
Status MergeSorterState::_merge_sort_read_impl (int batch_size, doris::vectorized::Block* block,
111
114
bool * eos) {
112
- size_t num_columns = sorted_blocks_[0 ].columns ();
115
+ if (priority_queue_.empty ()) {
116
+ *eos = true ;
117
+ return Status::OK ();
118
+ }
119
+ size_t num_columns = priority_queue_.top ().impl ->block ->columns ();
113
120
114
- MutableBlock m_block = VectorizedUtils::build_mutable_mem_reuse_block (block, sorted_blocks_[0 ]);
121
+ MutableBlock m_block = VectorizedUtils::build_mutable_mem_reuse_block (
122
+ block, *priority_queue_.top ().impl ->block );
115
123
MutableColumns& merged_columns = m_block.mutable_columns ();
116
124
117
125
// / Take rows from queue in right order and push to 'merged'.
@@ -122,7 +130,7 @@ Status MergeSorterState::_merge_sort_read_impl(int batch_size, doris::vectorized
122
130
123
131
if (offset_ == 0 ) {
124
132
for (size_t i = 0 ; i < num_columns; ++i)
125
- merged_columns[i]->insert_from (*current->all_columns [i], current->pos );
133
+ merged_columns[i]->insert_from (*current->block -> get_columns () [i], current->pos );
126
134
++merged_rows;
127
135
} else {
128
136
offset_--;
@@ -133,7 +141,9 @@ Status MergeSorterState::_merge_sort_read_impl(int batch_size, doris::vectorized
133
141
priority_queue_.push (current);
134
142
}
135
143
136
- if (merged_rows == batch_size) break ;
144
+ if (merged_rows == batch_size) {
145
+ break ;
146
+ }
137
147
}
138
148
block->set_columns (std::move (merged_columns));
139
149
@@ -260,22 +270,24 @@ Status FullSorter::_do_sort() {
260
270
// if one block totally greater the heap top of _block_priority_queue
261
271
// we can throw the block data directly.
262
272
if (_state->num_rows () < _offset + _limit) {
263
- static_cast <void >(_state->add_sorted_block (desc_block));
264
- _block_priority_queue.emplace (_pool->add (
265
- new MergeSortCursorImpl (_state->last_sorted_block (), _sort_description)));
273
+ static_cast <void >(_state->add_sorted_block (std::move (desc_block)));
274
+ _block_priority_queue.emplace (
275
+ MergeSortBlockCursor::create_shared (MergeSortCursorImpl::create_shared (
276
+ _state->last_sorted_block (), _sort_description)));
266
277
} else {
267
- auto tmp_cursor_impl =
268
- std::make_unique<MergeSortCursorImpl>(desc_block, _sort_description);
269
- MergeSortBlockCursor block_cursor (tmp_cursor_impl.get ());
270
- if (!block_cursor.totally_greater (_block_priority_queue.top ())) {
271
- static_cast <void >(_state->add_sorted_block (desc_block));
272
- _block_priority_queue.emplace (_pool->add (
273
- new MergeSortCursorImpl (_state->last_sorted_block (), _sort_description)));
278
+ auto tmp_cursor_impl = MergeSortCursorImpl::create_shared (
279
+ Block::create_shared (std::move (desc_block)), _sort_description);
280
+ MergeSortBlockCursor block_cursor (tmp_cursor_impl);
281
+ if (!block_cursor.totally_greater (*_block_priority_queue.top ())) {
282
+ static_cast <void >(_state->add_sorted_block (std::move (*tmp_cursor_impl->block )));
283
+ _block_priority_queue.emplace (
284
+ MergeSortBlockCursor::create_shared (MergeSortCursorImpl::create_shared (
285
+ _state->last_sorted_block (), _sort_description)));
274
286
}
275
287
}
276
288
} else {
277
289
// dispose normal sort logic
278
- static_cast <void >(_state->add_sorted_block (desc_block));
290
+ static_cast <void >(_state->add_sorted_block (std::move ( desc_block) ));
279
291
}
280
292
return Status::OK ();
281
293
}
0 commit comments