mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-21 17:20:50 +00:00
dbms: more clear code [#METR-2944].
This commit is contained in:
parent
629a224230
commit
4eb7ba0e60
@ -10,4 +10,12 @@ namespace DB
|
||||
/// Отсортировать один блок по описанию desc. Если limit != 0, то производится partial sort первых limit строк.
|
||||
void sortBlock(Block & block, const SortDescription & description, size_t limit = 0);
|
||||
|
||||
|
||||
/** Используется только в StorageMergeTree для сортировки данных при INSERT-е.
|
||||
* Сортировка стабильная. Это важно для сохранения порядка записей в движке CollapsingMergeTree
|
||||
* - так как на основе порядка записей определяется, удалять ли или оставлять группы строчек при коллапсировании.
|
||||
* Не поддерживаются collations. Не поддерживается частичная сортировка.
|
||||
*/
|
||||
void stableSortBlock(Block & block, const SortDescription & description);
|
||||
|
||||
}
|
||||
|
@ -122,7 +122,7 @@ private:
|
||||
LOG_TRACE(storage.log, "Sorting by primary key.");
|
||||
|
||||
/// Сортируем.
|
||||
sortBlock(block, storage.sort_descr);
|
||||
stableSortBlock(block, storage.sort_descr);
|
||||
|
||||
/// Наконец-то можно писать данные на диск.
|
||||
LOG_TRACE(storage.log, "Writing index.");
|
||||
|
@ -131,7 +131,7 @@ void sortBlock(Block & block, const SortDescription & description, size_t limit)
|
||||
if (limit)
|
||||
std::partial_sort(perm.begin(), perm.begin() + limit, perm.end(), less);
|
||||
else
|
||||
std::stable_sort(perm.begin(), perm.end(), less);
|
||||
std::sort(perm.begin(), perm.end(), less);
|
||||
}
|
||||
|
||||
size_t columns = block.columns();
|
||||
@ -140,4 +140,33 @@ void sortBlock(Block & block, const SortDescription & description, size_t limit)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void stableSortBlock(Block & block, const SortDescription & description)
|
||||
{
|
||||
if (!block)
|
||||
return;
|
||||
|
||||
size_t size = block.rows();
|
||||
IColumn::Permutation perm(size);
|
||||
for (size_t i = 0; i < size; ++i)
|
||||
perm[i] = i;
|
||||
|
||||
ColumnsWithSortDescriptions columns_with_sort_desc;
|
||||
|
||||
for (size_t i = 0, size = description.size(); i < size; ++i)
|
||||
{
|
||||
IColumn * column = !description[i].column_name.empty()
|
||||
? block.getByName(description[i].column_name).column
|
||||
: block.getByPosition(description[i].column_number).column;
|
||||
|
||||
columns_with_sort_desc.push_back(std::make_pair(column, description[i]));
|
||||
}
|
||||
|
||||
std::stable_sort(perm.begin(), perm.end(), PartialSortingLess(columns_with_sort_desc));
|
||||
|
||||
size_t columns = block.columns();
|
||||
for (size_t i = 0; i < columns; ++i)
|
||||
block.getByPosition(i).column = block.getByPosition(i).column->permute(perm, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user