mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 23:52:03 +00:00
dbms: development [#CONV-2944].
This commit is contained in:
parent
865ac88e0c
commit
8b372a6227
@ -34,14 +34,7 @@ private:
|
||||
|
||||
Logger * log;
|
||||
|
||||
|
||||
/// Слить пару блоков.
|
||||
void merge(Block & left, Block & right);
|
||||
|
||||
/** Слить сразу много блоков с помощью priority queue.
|
||||
* Для более чем двух блоков это быстрее, чем древовидно сливать по два блока.
|
||||
* Для двух блоков это медленнее на 20%.
|
||||
*/
|
||||
/// Слить блоки с помощью priority queue.
|
||||
Block merge(Blocks & blocks);
|
||||
};
|
||||
|
||||
|
@ -25,17 +25,7 @@ Block MergeSortingBlockInputStream::readImpl()
|
||||
while (Block block = input->read())
|
||||
blocks.push_back(block);
|
||||
|
||||
if (blocks.empty())
|
||||
return Block();
|
||||
else if (blocks.size() == 1)
|
||||
return blocks[0];
|
||||
else if (blocks.size() == 2)
|
||||
{
|
||||
merge(blocks[0], blocks[1]);
|
||||
return blocks[0];
|
||||
}
|
||||
else
|
||||
return merge(blocks);
|
||||
return merge(blocks);
|
||||
}
|
||||
|
||||
|
||||
@ -148,74 +138,4 @@ Block MergeSortingBlockInputStream::merge(Blocks & blocks)
|
||||
return merged;
|
||||
}
|
||||
|
||||
|
||||
void MergeSortingBlockInputStream::merge(Block & left, Block & right)
|
||||
{
|
||||
Block merged = left.cloneEmpty();
|
||||
|
||||
size_t left_size = left.rows();
|
||||
size_t right_size = right.rows();
|
||||
|
||||
size_t left_pos = 0;
|
||||
size_t right_pos = 0;
|
||||
|
||||
/// Все столбцы блоков.
|
||||
ConstColumnPlainPtrs left_columns;
|
||||
ConstColumnPlainPtrs right_columns;
|
||||
ColumnPlainPtrs merged_columns;
|
||||
|
||||
/// Столбцы, по которым идёт сортировка.
|
||||
ConstColumnPlainPtrs left_sort_columns;
|
||||
ConstColumnPlainPtrs right_sort_columns;
|
||||
|
||||
size_t num_columns = left.columns();
|
||||
for (size_t i = 0; i < num_columns; ++i)
|
||||
{
|
||||
left_columns.push_back(&*left.getByPosition(i).column);
|
||||
right_columns.push_back(&*right.getByPosition(i).column);
|
||||
merged_columns.push_back(&*merged.getByPosition(i).column);
|
||||
}
|
||||
|
||||
for (size_t i = 0, size = description.size(); i < size; ++i)
|
||||
{
|
||||
size_t column_number = !description[i].column_name.empty()
|
||||
? left.getPositionByName(description[i].column_name)
|
||||
: description[i].column_number;
|
||||
|
||||
left_sort_columns.push_back(&*left.getByPosition(column_number).column);
|
||||
right_sort_columns.push_back(&*right.getByPosition(column_number).column);
|
||||
}
|
||||
|
||||
/// Объединяем.
|
||||
while (right_pos < right_size || left_pos < left_size)
|
||||
{
|
||||
/// Откуда брать строку - из левого или из правого блока?
|
||||
int res = 0;
|
||||
if (right_pos == right_size)
|
||||
res = -1;
|
||||
else if (left_pos == left_size)
|
||||
res = 1;
|
||||
else
|
||||
for (size_t i = 0, size = description.size(); i < size; ++i)
|
||||
if ((res = description[i].direction * left_sort_columns[i]->compareAt(left_pos, right_pos, *right_sort_columns[i])))
|
||||
break;
|
||||
|
||||
/// Вставляем строку в объединённый блок.
|
||||
if (res <= 0)
|
||||
{
|
||||
for (size_t i = 0; i < num_columns; ++i)
|
||||
merged_columns[i]->insert((*left_columns[i])[left_pos]);
|
||||
++left_pos;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (size_t i = 0; i < num_columns; ++i)
|
||||
merged_columns[i]->insert((*right_columns[i])[right_pos]);
|
||||
++right_pos;
|
||||
}
|
||||
}
|
||||
|
||||
left = merged;
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user