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-02-08 23:41:05 +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
AggregateFunctionPtr getFunction ( )
{
return func ;
}
2013-02-08 19:34:44 +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
void cut ( size_t start , size_t length )
{
2012-09-20 18:40:58 +00:00
if ( start + length > data . size ( ) )
2011-09-19 01:42:16 +00:00
throw Exception ( " Parameters start = "
+ Poco : : NumberFormatter : : format ( start ) + " , length = "
+ Poco : : NumberFormatter : : format ( length ) + " are out of bound in IColumnVector<T>::cut() method "
" (data.size() = " + Poco : : NumberFormatter : : format ( data . size ( ) ) + " ). " ,
ErrorCodes : : PARAMETER_OUT_OF_BOUND ) ;
if ( start = = 0 )
2013-02-08 23:41:05 +00:00
{
for ( size_t i = length , s = data . size ( ) ; i < s ; + + i )
func - > destroy ( data [ i ] ) ;
2011-09-19 01:42:16 +00:00
data . resize ( length ) ;
2013-02-08 23:41:05 +00:00
}
2011-09-19 01:42:16 +00:00
else
{
2013-02-08 23:41:05 +00:00
for ( size_t i = 0 ; i < start ; + + i )
func - > destroy ( data [ i ] ) ;
for ( size_t i = start + length , s = data . size ( ) ; i < s ; + + i )
func - > destroy ( data [ i ] ) ;
2011-09-19 01:42:16 +00:00
Container_t tmp ( data . begin ( ) + start , data . begin ( ) + start + length ) ;
tmp . swap ( data ) ;
}
}
2013-02-08 23:41:05 +00:00
void clear ( )
{
for ( size_t i = 0 , s = data . size ( ) ; i < s ; + + i )
func - > destroy ( data [ i ] ) ;
data . clear ( ) ;
}
void replicate ( const Offsets_t & offsets )
{
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
} ;
}