2014-03-27 12:48:09 +00:00
# pragma once
# include <DB/Columns/ColumnArray.h>
# include <DB/DataTypes/DataTypeArray.h>
# include <DB/DataTypes/DataTypesNumberFixed.h>
# include <DB/AggregateFunctions/IAggregateFunction.h>
namespace DB
{
/** Н е агрегатная функция, а адаптер агрегатных функций,
* к о т о р ы й л ю б у ю а г р е г а т н у ю ф у н к ц и ю agg ( x ) д е л а е т а г р е г а т н о й ф у н к ц и е й в и д а aggArray ( x ) .
* А д а п т и р о в а н н а я а г р е г а т н а я ф у н к ц и я в ы ч и с л я е т в л о ж е н н у ю а г р е г а т н у ю ф у н к ц и ю д л я к а ж д о г о э л е м е н т а м а с с и в а .
*/
2014-06-04 01:00:09 +00:00
class AggregateFunctionArray final : public IAggregateFunction
2014-03-27 12:48:09 +00:00
{
private :
AggregateFunctionPtr nested_func_owner ;
IAggregateFunction * nested_func ;
int num_agruments ;
public :
AggregateFunctionArray ( AggregateFunctionPtr nested_ ) : nested_func_owner ( nested_ ) , nested_func ( nested_func_owner . get ( ) ) { }
String getName ( ) const
{
return nested_func - > getName ( ) + " Array " ;
}
DataTypePtr getReturnType ( ) const
{
return nested_func - > getReturnType ( ) ;
}
void setArguments ( const DataTypes & arguments )
{
num_agruments = arguments . size ( ) ;
DataTypes nested_arguments ;
for ( int i = 0 ; i < num_agruments ; + + i )
{
2014-06-26 00:58:14 +00:00
if ( const DataTypeArray * array = typeid_cast < const DataTypeArray * > ( & * arguments [ i ] ) )
2014-03-27 12:48:09 +00:00
nested_arguments . push_back ( array - > getNestedType ( ) ) ;
else
throw Exception ( " Illegal type " + arguments [ i ] - > getName ( ) + " of argument # " + toString ( i + 1 ) + " for aggregate function " + getName ( ) + " . Must be array. " , ErrorCodes : : ILLEGAL_TYPE_OF_ARGUMENT ) ;
}
nested_func - > setArguments ( nested_arguments ) ;
}
void setParameters ( const Array & params )
{
nested_func - > setParameters ( params ) ;
}
void create ( AggregateDataPtr place ) const
{
nested_func - > create ( place ) ;
}
2014-05-23 01:09:18 +00:00
void destroy ( AggregateDataPtr place ) const noexcept
2014-03-27 12:48:09 +00:00
{
nested_func - > destroy ( place ) ;
}
bool hasTrivialDestructor ( ) const
{
return nested_func - > hasTrivialDestructor ( ) ;
}
size_t sizeOfData ( ) const
{
return nested_func - > sizeOfData ( ) ;
}
size_t alignOfData ( ) const
{
return nested_func - > alignOfData ( ) ;
}
void add ( AggregateDataPtr place , const IColumn * * columns , size_t row_num ) const
{
2014-03-27 20:32:12 +00:00
const IColumn * nested [ num_agruments ] ;
2014-03-27 12:48:09 +00:00
for ( int i = 0 ; i < num_agruments ; + + i )
2014-03-27 20:32:12 +00:00
nested [ i ] = & static_cast < const ColumnArray & > ( * columns [ i ] ) . getData ( ) ;
const ColumnArray & first_array_column = static_cast < const ColumnArray & > ( * columns [ 0 ] ) ;
const IColumn : : Offsets_t & offsets = first_array_column . getOffsets ( ) ;
size_t begin = row_num = = 0 ? 0 : offsets [ row_num - 1 ] ;
size_t end = offsets [ row_num ] ;
for ( size_t i = begin ; i < end ; + + i )
2014-03-27 12:48:09 +00:00
nested_func - > add ( place , nested , i ) ;
}
void merge ( AggregateDataPtr place , ConstAggregateDataPtr rhs ) const
{
nested_func - > merge ( place , rhs ) ;
}
void serialize ( ConstAggregateDataPtr place , WriteBuffer & buf ) const
{
nested_func - > serialize ( place , buf ) ;
}
void deserializeMerge ( AggregateDataPtr place , ReadBuffer & buf ) const
{
nested_func - > deserializeMerge ( place , buf ) ;
}
void insertResultInto ( ConstAggregateDataPtr place , IColumn & to ) const
{
nested_func - > insertResultInto ( place , to ) ;
}
} ;
}