another fixes

This commit is contained in:
Nikita Mikhaylov 2020-09-07 16:15:04 +03:00
parent 4fadb6c3ec
commit c09d86e5e4
3 changed files with 65 additions and 8 deletions

View File

@ -331,6 +331,12 @@ void ColumnNullable::getPermutation(bool reverse, size_t limit, int null_directi
void ColumnNullable::updatePermutation(bool reverse, size_t limit, int null_direction_hint, IColumn::Permutation & res, EqualRanges & equal_ranges) const
{
// std::cout << "ColumnNullable" << std::endl;
//
// std::cout << "equal_ranges " << equal_ranges.size() << std::endl;
// for (auto [first, last] : equal_ranges)
// std::cout << "first " << first << " last " << last << std::endl;
if (equal_ranges.empty())
return;
@ -344,20 +350,24 @@ void ColumnNullable::updatePermutation(bool reverse, size_t limit, int null_dire
if (is_nulls_last)
{
// std::cout << "NULL LAST" << std::endl;
/// Shift all NULL values to the end.
for (const auto & [first, last] : equal_ranges)
{
// std::cout << "current range " << first << ' ' << last << std::endl;
/// Consider a half interval [first, last)
size_t read_idx = first;
size_t write_idx = first;
size_t end_idx = last;
if (!limit)
limit = end_idx;
limit = end_idx - read_idx;
else
limit = std::min(end_idx - first + 1, limit);
limit = std::min(end_idx - read_idx, limit);
while (read_idx < limit && !isNullAt(res[read_idx]))
/// We simply check the limit not to do extra work.
/// Since interval begins from `first`, not from zero, we add `first` to the right side of the inequality.
while (read_idx < first + limit && !isNullAt(res[read_idx]))
{
++read_idx;
++write_idx;
@ -375,7 +385,7 @@ void ColumnNullable::updatePermutation(bool reverse, size_t limit, int null_dire
/// Relative order of NULL elements could be changed,
/// but relative order of non-NULLs is preserved.
while (read_idx < end_idx && write_idx < limit)
while (read_idx < end_idx && write_idx < first + limit)
{
if (!isNullAt(res[read_idx]))
{
@ -397,6 +407,7 @@ void ColumnNullable::updatePermutation(bool reverse, size_t limit, int null_dire
}
else
{
// std::cout << "NULLS FIRST" << std::endl;
for (const auto & [first, last] : equal_ranges)
{
/// Shift all NULL values to the beginning.
@ -436,13 +447,21 @@ void ColumnNullable::updatePermutation(bool reverse, size_t limit, int null_dire
getNestedColumn().updatePermutation(reverse, 0, null_direction_hint, res, new_ranges);
std::cout << "new_ranges " << new_ranges.size() << std::endl;
std::cout << "null_ranges " << null_ranges.size() << std::endl;
// std::cout << "new_ranges " << new_ranges.size() << std::endl;
// for (auto [first, last] : new_ranges)
// std::cout << "first " << first << " last " << last << std::endl;
// std::cout << "null_ranges " << null_ranges.size() << std::endl;
// for (auto [first, last] : null_ranges)
// std::cout << "first " << first << " last " << last << std::endl;
//
equal_ranges = std::move(new_ranges);
std::move(null_ranges.begin(), null_ranges.end(), std::back_inserter(equal_ranges));
std::cout << "end" << std::endl;
// std::cout << "equal_ranges_final " << equal_ranges.size() << std::endl;
// for (auto [first, last] : equal_ranges)
// std::cout << "first " << first << " last " << last << std::endl;
// std::cout << "end" << std::endl;
}
void ColumnNullable::gather(ColumnGathererStream & gatherer)

View File

@ -243,6 +243,12 @@ void ColumnVector<T>::getPermutation(bool reverse, size_t limit, int nan_directi
template <typename T>
void ColumnVector<T>::updatePermutation(bool reverse, size_t limit, int nan_direction_hint, IColumn::Permutation & res, EqualRanges & equal_range) const
{
// std::cout << "ColumnVector" << std::endl;
//
// std::cout << "equal_ranges " << equal_range.size() << std::endl;
// for (auto [first, last] : equal_range)
// std::cout << "first " << first << " last " << last << std::endl;
if (equal_range.empty())
return;

View File

@ -104,6 +104,19 @@ struct PartialSortingLessWithCollation
void sortBlock(Block & block, const SortDescription & description, UInt64 limit)
{
// std::cout << block.dumpStructure() << std::endl;
//
// for (const auto & column : block.getColumnsWithTypeAndName())
// {
// std::cout << column.name << " \t\t";
// auto column_size = column.column->size();
// for (size_t i = 0; i < column_size; ++i)
// {
// std::cout << toString(column.column->operator[](i)) << ", \t";
// }
// std::cout << std::endl;
// }
if (!block)
return;
@ -181,6 +194,8 @@ void sortBlock(Block & block, const SortDescription & description, UInt64 limit)
ranges.emplace_back(0, perm.size());
for (const auto & column : columns_with_sort_desc)
{
// std::cout << "need collation" << std::endl;
// std::cout << column.column->dumpStructure() << std::endl;
while (!ranges.empty() && limit && limit <= ranges.back().first)
ranges.pop_back();
@ -210,6 +225,9 @@ void sortBlock(Block & block, const SortDescription & description, UInt64 limit)
ranges.emplace_back(0, perm.size());
for (const auto & column : columns_with_sort_desc)
{
// std::cout << "no need collation" << std::endl;
// std::cout << column.column->dumpStructure() << std::endl;
while (!ranges.empty() && limit && limit <= ranges.back().first)
{
ranges.pop_back();
@ -229,6 +247,20 @@ void sortBlock(Block & block, const SortDescription & description, UInt64 limit)
block.getByPosition(i).column = block.getByPosition(i).column->permute(perm, limit);
}
}
//
// std::cout << "final block" << std::endl;
// std::cout << block.dumpStructure() << std::endl;
//
// for (const auto & column : block.getColumnsWithTypeAndName())
// {
// std::cout << column.name << " \t\t";
// auto column_size = column.column->size();
// for (size_t i = 0; i < column_size; ++i)
// {
// std::cout << toString(column.column->operator[](i)) << ", \t";
// }
// std::cout << std::endl;
// }
}