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

Reply via email to