eldenmoon commented on code in PR #18654: URL: https://github.com/apache/doris/pull/18654#discussion_r1191863563
########## be/src/exec/rowid_fetcher.cpp: ########## @@ -133,20 +180,51 @@ Status RowIDFetcher::fetch(const vectorized::ColumnPtr& row_ids, _stubs[i]->multiget_data(&cntls[i], &mget_req, &resps[i], callback); } counter.wait(); - RETURN_IF_ERROR(MergeRPCResults(resps, cntls, &mblock)); - // final sort by row_ids sequence, since row_ids is already sorted - vectorized::Block tmp = mblock.to_block(); - std::unordered_map<std::string, uint32_t> row_order; - vectorized::ColumnPtr row_id_column = tmp.get_columns().back(); - for (size_t x = 0; x < row_id_column->size(); ++x) { + + // Merge + std::vector<RowId> rows_id; + rows_id.reserve(rows_id.size()); + RETURN_IF_ERROR(_merge_rpc_results(mget_req, resps, cntls, res_block, &rows_id)); + + // Final sort by row_ids sequence, since row_ids is already sorted if need + std::map<GlobalRowLoacation, size_t> positions; + for (size_t i = 0; i < rows_id.size(); ++i) { + RowsetId rowset_id; + rowset_id.init(rows_id[i].rowset_id()); + GlobalRowLoacation grl(rows_id[i].tablet_id(), rowset_id, rows_id[i].segment_id(), + rows_id[i].ordinal_id()); + positions[grl] = i; + }; + vectorized::IColumn::Permutation permutation; + permutation.reserve(column_row_ids->size()); + for (size_t i = 0; i < column_row_ids->size(); ++i) { auto location = - reinterpret_cast<const GlobalRowLoacation*>(row_id_column->get_data_at(x).data); - row_order[format_rowid(*location)] = x; + reinterpret_cast<const GlobalRowLoacation*>(column_row_ids->get_data_at(i).data); + permutation.push_back(positions[*location]); + } + size_t num_rows = res_block->rows(); + for (size_t i = 0; i < res_block->columns(); ++i) { + res_block->get_by_position(i).column = + res_block->get_by_position(i).column->permute(permutation, num_rows); } - for (size_t x = 0; x < row_ids->size(); ++x) { - auto location = reinterpret_cast<const GlobalRowLoacation*>(row_ids->get_data_at(x).data); - res_block->add_row(&tmp, row_order[format_rowid(*location)]); + // shrink for char type + std::vector<size_t> char_type_idx; + for (size_t i = 0; i < _fetch_option.desc->slots().size(); i++) { + auto column_desc = _fetch_option.desc->slots()[i]; + auto type_desc = column_desc->type(); + do { + if (type_desc.type == TYPE_CHAR) { + char_type_idx.emplace_back(i); + break; + } else if (type_desc.type != TYPE_ARRAY) { + break; + } + // for Array<Char> or Array<Array<Char>> + type_desc = type_desc.children[0]; + } while (true); } + res_block->shrink_char_type_column_suffix_zero(char_type_idx); Review Comment: char_type_idx will record all the indexes of char columns, so shrink will apply for all of them -- 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