dataroaring commented on code in PR #19099: URL: https://github.com/apache/doris/pull/19099#discussion_r1191833860
########## be/src/olap/memtable.cpp: ########## @@ -267,79 +218,137 @@ void MemTable::_aggregate_two_row_in_block(RowInBlock* new_row, RowInBlock* row_ new_row->_row_pos, nullptr); } } +void MemTable::_add_rows_from_block(vectorized::Block& in_block) { + std::vector<int> row_pos_vec; + DCHECK(in_block.rows() <= std::numeric_limits<int>::max()); + row_pos_vec.reserve(in_block.rows()); + for (int i = 0; i < _row_in_blocks.size(); i++) { + row_pos_vec.emplace_back(_row_in_blocks[i]->_row_pos); + } + _output_mutable_block.add_rows(&in_block, row_pos_vec.data(), + row_pos_vec.data() + in_block.rows()); +} +int MemTable::_sort_row_in_blocks() { + vectorized::Block in_block = _input_mutable_block.to_block(); + vectorized::MutableBlock mutable_block = + vectorized::MutableBlock::build_mutable_block(&in_block); + _vec_row_comparator->set_block(&mutable_block); + auto new_row_it = std::next(_row_in_blocks.begin(), _last_sorted_pos); + size_t same_keys_num = 0; + // sort new rows + std::sort(new_row_it, _row_in_blocks.end(), + [this, &same_keys_num](const RowInBlock* l, const RowInBlock* r) -> bool { + auto value = (*(this->_vec_row_comparator))(l, r); + if (value == 0) { + same_keys_num++; + return l->_row_pos > r->_row_pos; + } else { + return value < 0; + } + }); + // merge new rows and old rows + std::inplace_merge(_row_in_blocks.begin(), new_row_it, _row_in_blocks.end(), + [this, &same_keys_num](const RowInBlock* l, const RowInBlock* r) -> bool { + auto value = (*(this->_vec_row_comparator))(l, r); + if (value == 0) { + same_keys_num++; + return l->_row_pos > r->_row_pos; + } else { + return value < 0; + } + }); + _last_sorted_pos = _row_in_blocks.size(); + return same_keys_num; +} + template <bool is_final> -void MemTable::_collect_vskiplist_results() { - VecTable::Iterator it(_vec_skip_list.get()); +void MemTable::_merge_row_in_blocks() { Review Comment: aggregate is a better name. ########## be/src/olap/memtable.cpp: ########## @@ -267,79 +218,137 @@ void MemTable::_aggregate_two_row_in_block(RowInBlock* new_row, RowInBlock* row_ new_row->_row_pos, nullptr); } } +void MemTable::_add_rows_from_block(vectorized::Block& in_block) { + std::vector<int> row_pos_vec; + DCHECK(in_block.rows() <= std::numeric_limits<int>::max()); + row_pos_vec.reserve(in_block.rows()); + for (int i = 0; i < _row_in_blocks.size(); i++) { + row_pos_vec.emplace_back(_row_in_blocks[i]->_row_pos); + } + _output_mutable_block.add_rows(&in_block, row_pos_vec.data(), + row_pos_vec.data() + in_block.rows()); +} +int MemTable::_sort_row_in_blocks() { + vectorized::Block in_block = _input_mutable_block.to_block(); + vectorized::MutableBlock mutable_block = + vectorized::MutableBlock::build_mutable_block(&in_block); + _vec_row_comparator->set_block(&mutable_block); + auto new_row_it = std::next(_row_in_blocks.begin(), _last_sorted_pos); + size_t same_keys_num = 0; + // sort new rows + std::sort(new_row_it, _row_in_blocks.end(), + [this, &same_keys_num](const RowInBlock* l, const RowInBlock* r) -> bool { + auto value = (*(this->_vec_row_comparator))(l, r); + if (value == 0) { + same_keys_num++; + return l->_row_pos > r->_row_pos; + } else { + return value < 0; + } + }); + // merge new rows and old rows + std::inplace_merge(_row_in_blocks.begin(), new_row_it, _row_in_blocks.end(), + [this, &same_keys_num](const RowInBlock* l, const RowInBlock* r) -> bool { + auto value = (*(this->_vec_row_comparator))(l, r); + if (value == 0) { + same_keys_num++; + return l->_row_pos > r->_row_pos; + } else { + return value < 0; + } + }); + _last_sorted_pos = _row_in_blocks.size(); + return same_keys_num; +} + template <bool is_final> -void MemTable::_collect_vskiplist_results() { - VecTable::Iterator it(_vec_skip_list.get()); +void MemTable::_merge_row_in_blocks() { Review Comment: _aggregate is a better name. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org