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