dbms: development [#CONV-2944].

This commit is contained in:
Alexey Milovidov 2012-07-24 18:52:26 +00:00
parent 865ac88e0c
commit 8b372a6227
2 changed files with 2 additions and 89 deletions

View File

@ -34,14 +34,7 @@ private:
Logger * log;
/// Слить пару блоков.
void merge(Block & left, Block & right);
/** Слить сразу много блоков с помощью priority queue.
* Для более чем двух блоков это быстрее, чем древовидно сливать по два блока.
* Для двух блоков это медленнее на 20%.
*/
/// Слить блоки с помощью priority queue.
Block merge(Blocks & blocks);
};

View File

@ -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;
}
}