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