mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-27 10:02:01 +00:00
Improved Summing/Aggregating streams [#METR-12588].
This commit is contained in:
parent
054df259cd
commit
b664f367d8
@ -59,15 +59,15 @@ private:
|
|||||||
ColumnNumbers column_numbers_to_aggregate;
|
ColumnNumbers column_numbers_to_aggregate;
|
||||||
std::vector<ColumnAggregateFunction *> columns_to_aggregate;
|
std::vector<ColumnAggregateFunction *> columns_to_aggregate;
|
||||||
|
|
||||||
Row current_key; /// Текущий первичный ключ.
|
RowRef current_key; /// Текущий первичный ключ.
|
||||||
Row next_key; /// Первичный ключ следующей строки.
|
RowRef next_key; /// Первичный ключ следующей строки.
|
||||||
|
|
||||||
Row current_row;
|
RowRef current_row;
|
||||||
|
|
||||||
/** Делаем поддержку двух разных курсоров - с Collation и без.
|
/** Делаем поддержку двух разных курсоров - с Collation и без.
|
||||||
* Шаблоны используем вместо полиморфных SortCursor'ов и вызовов виртуальных функций.
|
* Шаблоны используем вместо полиморфных SortCursor'ов и вызовов виртуальных функций.
|
||||||
*/
|
*/
|
||||||
template<class TSortCursor>
|
template <class TSortCursor>
|
||||||
void merge(ColumnPlainPtrs & merged_columns, std::priority_queue<TSortCursor> & queue);
|
void merge(ColumnPlainPtrs & merged_columns, std::priority_queue<TSortCursor> & queue);
|
||||||
|
|
||||||
/// Вставить в результат первую строку для текущей группы.
|
/// Вставить в результат первую строку для текущей группы.
|
||||||
@ -75,7 +75,7 @@ private:
|
|||||||
|
|
||||||
/** Извлечь все состояния аггрегатных функций и объединить с текущей группой.
|
/** Извлечь все состояния аггрегатных функций и объединить с текущей группой.
|
||||||
*/
|
*/
|
||||||
template<class TSortCursor>
|
template <class TSortCursor>
|
||||||
void addRow(TSortCursor & cursor)
|
void addRow(TSortCursor & cursor)
|
||||||
{
|
{
|
||||||
for (size_t i = 0, size = column_numbers_to_aggregate.size(); i < size; ++i)
|
for (size_t i = 0, size = column_numbers_to_aggregate.size(); i < size; ++i)
|
||||||
|
@ -190,14 +190,6 @@ protected:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Сохранить первичный ключ, на который указывает cursor в row.
|
|
||||||
template <class TSortCursor>
|
|
||||||
void setPrimaryKey(Row & row, TSortCursor & cursor)
|
|
||||||
{
|
|
||||||
for (size_t i = 0; i < cursor->sort_columns_size; ++i)
|
|
||||||
cursor->sort_columns[i]->get(cursor->pos, row[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class TSortCursor>
|
template <class TSortCursor>
|
||||||
void setRowRef(RowRef & row_ref, TSortCursor & cursor)
|
void setRowRef(RowRef & row_ref, TSortCursor & cursor)
|
||||||
{
|
{
|
||||||
|
@ -79,13 +79,13 @@ private:
|
|||||||
/// Найденные вложенные Map таблицы
|
/// Найденные вложенные Map таблицы
|
||||||
std::vector<map_description> maps_to_sum;
|
std::vector<map_description> maps_to_sum;
|
||||||
|
|
||||||
Row current_key; /// Текущий первичный ключ.
|
RowRef current_key; /// Текущий первичный ключ.
|
||||||
Row next_key; /// Первичный ключ следующей строки.
|
RowRef next_key; /// Первичный ключ следующей строки.
|
||||||
|
|
||||||
Row current_row;
|
Row current_row;
|
||||||
bool current_row_is_zero = false; /// Текущая строчка просуммировалась в ноль, и её следует удалить.
|
bool current_row_is_zero = true; /// Текущая строчка просуммировалась в ноль, и её следует удалить.
|
||||||
|
|
||||||
bool output_is_non_empty = false; /// Отдали ли мы наружу хоть одну строку.
|
bool output_is_non_empty = false; /// Отдали ли мы наружу хоть одну строку.
|
||||||
|
|
||||||
/** Делаем поддержку двух разных курсоров - с Collation и без.
|
/** Делаем поддержку двух разных курсоров - с Collation и без.
|
||||||
* Шаблоны используем вместо полиморфных SortCursor'ов и вызовов виртуальных функций.
|
* Шаблоны используем вместо полиморфных SortCursor'ов и вызовов виртуальных функций.
|
||||||
|
@ -8,7 +8,7 @@ namespace DB
|
|||||||
void AggregatingSortedBlockInputStream::insertCurrentRow(ColumnPlainPtrs & merged_columns)
|
void AggregatingSortedBlockInputStream::insertCurrentRow(ColumnPlainPtrs & merged_columns)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < num_columns; ++i)
|
for (size_t i = 0; i < num_columns; ++i)
|
||||||
merged_columns[i]->insert(current_row[i]);
|
merged_columns[i]->insertFrom(*current_row.columns[i], current_row.row_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -30,9 +30,7 @@ Block AggregatingSortedBlockInputStream::readImpl()
|
|||||||
/// Дополнительная инициализация.
|
/// Дополнительная инициализация.
|
||||||
if (current_row.empty())
|
if (current_row.empty())
|
||||||
{
|
{
|
||||||
current_row.resize(num_columns);
|
current_row.columns.resize(num_columns);
|
||||||
current_key.resize(description.size());
|
|
||||||
next_key.resize(description.size());
|
|
||||||
|
|
||||||
/// Заполним номера столбцов, которые нужно доагрегировать.
|
/// Заполним номера столбцов, которые нужно доагрегировать.
|
||||||
for (size_t i = 0; i < num_columns; ++i)
|
for (size_t i = 0; i < num_columns; ++i)
|
||||||
@ -79,7 +77,15 @@ void AggregatingSortedBlockInputStream::merge(ColumnPlainPtrs & merged_columns,
|
|||||||
{
|
{
|
||||||
TSortCursor current = queue.top();
|
TSortCursor current = queue.top();
|
||||||
|
|
||||||
setPrimaryKey(next_key, current);
|
if (current_key.empty())
|
||||||
|
{
|
||||||
|
current_key.columns.resize(description.size());
|
||||||
|
next_key.columns.resize(description.size());
|
||||||
|
|
||||||
|
setPrimaryKeyRef(current_key, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
setPrimaryKeyRef(next_key, current);
|
||||||
|
|
||||||
bool key_differs = next_key != current_key;
|
bool key_differs = next_key != current_key;
|
||||||
|
|
||||||
@ -91,11 +97,10 @@ void AggregatingSortedBlockInputStream::merge(ColumnPlainPtrs & merged_columns,
|
|||||||
|
|
||||||
if (key_differs)
|
if (key_differs)
|
||||||
{
|
{
|
||||||
current_key = std::move(next_key);
|
current_key.swap(next_key);
|
||||||
next_key.resize(description.size());
|
|
||||||
|
|
||||||
/// Запишем данные для очередной группы.
|
/// Запишем данные для очередной группы.
|
||||||
setRow(current_row, current);
|
setRowRef(current_row, current);
|
||||||
insertCurrentRow(merged_columns);
|
insertCurrentRow(merged_columns);
|
||||||
++merged_rows;
|
++merged_rows;
|
||||||
}
|
}
|
||||||
|
@ -70,8 +70,6 @@ Block SummingSortedBlockInputStream::readImpl()
|
|||||||
if (current_row.empty())
|
if (current_row.empty())
|
||||||
{
|
{
|
||||||
current_row.resize(num_columns);
|
current_row.resize(num_columns);
|
||||||
current_key.resize(description.size());
|
|
||||||
next_key.resize(description.size());
|
|
||||||
|
|
||||||
std::unordered_map<std::string, std::vector<std::size_t>> discovered_maps;
|
std::unordered_map<std::string, std::vector<std::size_t>> discovered_maps;
|
||||||
/** Заполним номера столбцов, которые должны быть просуммированы.
|
/** Заполним номера столбцов, которые должны быть просуммированы.
|
||||||
@ -178,7 +176,15 @@ void SummingSortedBlockInputStream::merge(ColumnPlainPtrs & merged_columns, std:
|
|||||||
{
|
{
|
||||||
TSortCursor current = queue.top();
|
TSortCursor current = queue.top();
|
||||||
|
|
||||||
setPrimaryKey(next_key, current);
|
if (current_key.empty())
|
||||||
|
{
|
||||||
|
current_key.columns.resize(description.size());
|
||||||
|
next_key.columns.resize(description.size());
|
||||||
|
|
||||||
|
setPrimaryKeyRef(current_key, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
setPrimaryKeyRef(next_key, current);
|
||||||
|
|
||||||
bool key_differs = next_key != current_key;
|
bool key_differs = next_key != current_key;
|
||||||
|
|
||||||
@ -191,15 +197,14 @@ void SummingSortedBlockInputStream::merge(ColumnPlainPtrs & merged_columns, std:
|
|||||||
if (key_differs)
|
if (key_differs)
|
||||||
{
|
{
|
||||||
/// Запишем данные для предыдущей группы.
|
/// Запишем данные для предыдущей группы.
|
||||||
if (!current_key[0].isNull() && !current_row_is_zero)
|
if (!current_row_is_zero)
|
||||||
{
|
{
|
||||||
++merged_rows;
|
++merged_rows;
|
||||||
output_is_non_empty = true;
|
output_is_non_empty = true;
|
||||||
insertCurrentRow(merged_columns);
|
insertCurrentRow(merged_columns);
|
||||||
}
|
}
|
||||||
|
|
||||||
current_key = std::move(next_key);
|
current_key.swap(next_key);
|
||||||
next_key.resize(description.size());
|
|
||||||
|
|
||||||
setRow(current_row, current);
|
setRow(current_row, current);
|
||||||
current_row_is_zero = false;
|
current_row_is_zero = false;
|
||||||
|
Loading…
Reference in New Issue
Block a user