2011-09-19 01:42:16 +00:00
# pragma once
2013-02-08 19:34:44 +00:00
# include <DB/Common/Arena.h>
2011-09-19 01:42:16 +00:00
# include <DB/AggregateFunctions/IAggregateFunction.h>
# include <DB/Columns/ColumnVector.h>
namespace DB
{
2013-02-08 23:41:05 +00:00
2011-09-19 01:42:16 +00:00
/** Столбец, хранящий состояния агрегатных функций.
2013-02-08 20:34:30 +00:00
* С о с т о я н и я а г р е г а т н ы х ф у н к ц и й х р а н я т с я в п у л е ( arena ) ,
* ( в о з м о ж н о , в н е с к о л ь к и х )
* а в м а с с и в е ( ColumnVector ) х р а н я т с я у к а з а т е л и н а н и х .
2013-02-08 19:34:44 +00:00
* С т о л б е ц з а х в а т ы в а е т в л а д е н и е п у л о м и в с е м и а г р е г а т н ы м и ф у н к ц и я м и ,
* к о т о р ы е в н е г о п е р е д а н ы ( у н и ч т о ж а е т и х в д е с т р к у т о р е ) .
2011-09-19 01:42:16 +00:00
*/
2013-02-08 23:41:05 +00:00
class ColumnAggregateFunction : public ColumnVectorBase < AggregateDataPtr >
2011-09-19 01:42:16 +00:00
{
2013-02-08 19:34:44 +00:00
private :
2013-07-28 03:14:03 +00:00
AggregateFunctionPtr func ; /// Используется только для уничтожения состояний.
2013-02-08 20:34:30 +00:00
Arenas arenas ;
2011-09-19 01:42:16 +00:00
public :
2013-02-08 23:41:05 +00:00
ColumnAggregateFunction ( const AggregateFunctionPtr & func_ )
: func ( func_ )
2013-02-08 19:34:44 +00:00
{
}
2013-02-08 23:41:05 +00:00
ColumnAggregateFunction ( const AggregateFunctionPtr & func_ , const Arenas & arenas_ )
: func ( func_ ) , arenas ( arenas_ )
{
}
void set ( const AggregateFunctionPtr & func_ )
2013-02-08 19:34:44 +00:00
{
func = func_ ;
2013-02-08 20:34:30 +00:00
}
/// Захватить владение ареной.
2013-02-08 23:41:05 +00:00
void addArena ( ArenaPtr arena_ )
2013-02-08 20:34:30 +00:00
{
arenas . push_back ( arena_ ) ;
2013-02-08 19:34:44 +00:00
}
2013-02-08 23:41:05 +00:00
2013-02-03 23:11:21 +00:00
~ ColumnAggregateFunction ( )
{
for ( size_t i = 0 , s = data . size ( ) ; i < s ; + + i )
2013-02-08 19:34:44 +00:00
func - > destroy ( data [ i ] ) ;
2013-02-03 23:11:21 +00:00
}
2011-09-19 01:42:16 +00:00
std : : string getName ( ) const { return " ColumnAggregateFunction " ; }
2013-02-08 23:41:05 +00:00
ColumnPtr cloneEmpty ( ) const { return new ColumnAggregateFunction ( func , arenas ) ; } ;
2012-05-30 03:30:29 +00:00
2011-09-19 01:42:16 +00:00
bool isNumeric ( ) const { return false ; }
Field operator [ ] ( size_t n ) const
{
2013-02-08 23:41:05 +00:00
throw Exception ( " Method operator[] is not supported for ColumnAggregateFunction. You must access underlying vector directly. " , ErrorCodes : : NOT_IMPLEMENTED ) ; ;
2011-09-19 01:42:16 +00:00
}
2012-10-07 06:30:10 +00:00
2013-01-07 06:47:15 +00:00
void get ( size_t n , Field & res ) const
{
2013-02-08 23:41:05 +00:00
throw Exception ( " Method get is not supported for ColumnAggregateFunction. You must access underlying vector directly. " , ErrorCodes : : NOT_IMPLEMENTED ) ; ;
2013-01-07 06:47:15 +00:00
}
2012-10-07 06:30:10 +00:00
StringRef getDataAt ( size_t n ) const
{
2013-02-08 23:41:05 +00:00
throw Exception ( " Method getDataAt is not supported for ColumnAggregateFunction. You must access underlying vector directly. " , ErrorCodes : : NOT_IMPLEMENTED ) ;
2012-10-07 06:30:10 +00:00
}
2013-02-16 20:15:45 +00:00
void insertData ( const char * pos , size_t length )
{
throw Exception ( " Method insertData is not supported for " + getName ( ) , ErrorCodes : : NOT_IMPLEMENTED ) ;
}
2011-09-19 01:42:16 +00:00
2013-05-03 05:23:14 +00:00
ColumnPtr cut ( size_t start , size_t length ) const
{
throw Exception ( " Method cut is not supported for ColumnAggregateFunction. " , ErrorCodes : : NOT_IMPLEMENTED ) ;
}
ColumnPtr filter ( const Filter & filter ) const
{
throw Exception ( " Method filter is not supported for ColumnAggregateFunction. " , ErrorCodes : : NOT_IMPLEMENTED ) ;
}
ColumnPtr permute ( const Permutation & perm ) const
{
throw Exception ( " Method permute is not supported for ColumnAggregateFunction. " , ErrorCodes : : NOT_IMPLEMENTED ) ;
}
ColumnPtr replicate ( const Offsets_t & offsets ) const
2013-02-08 23:41:05 +00:00
{
throw Exception ( " Method replicate is not supported for ColumnAggregateFunction. " , ErrorCodes : : NOT_IMPLEMENTED ) ;
}
2011-09-19 01:42:16 +00:00
void insert ( const Field & x )
{
2013-02-08 19:34:44 +00:00
throw Exception ( " Method insert is not supported for ColumnAggregateFunction. You must access underlying vector directly. " ,
ErrorCodes : : NOT_IMPLEMENTED ) ;
2011-09-19 01:42:16 +00:00
}
int compareAt ( size_t n , size_t m , const IColumn & rhs_ ) const
{
return 0 ;
}
2011-09-26 11:05:38 +00:00
2013-01-21 06:43:38 +00:00
Permutation getPermutation ( ) const
2011-09-26 11:05:38 +00:00
{
size_t s = data . size ( ) ;
2013-01-21 06:43:38 +00:00
Permutation res ( s ) ;
2011-09-26 11:05:38 +00:00
for ( size_t i = 0 ; i < s ; + + i )
res [ i ] = i ;
2013-01-21 06:43:38 +00:00
return res ;
2011-09-26 11:05:38 +00:00
}
2011-09-19 01:42:16 +00:00
} ;
}