2018-05-12 15:49:17 +00:00
# include <AggregateFunctions/AggregateFunctionFactory.h>
# include <AggregateFunctions/AggregateFunctionWindowFunnel.h>
# include <AggregateFunctions/Helpers.h>
# include <AggregateFunctions/FactoryHelpers.h>
2019-05-17 11:17:52 +00:00
# include <DataTypes/DataTypeDate.h>
# include <DataTypes/DataTypeDateTime.h>
2018-05-12 15:49:17 +00:00
2019-05-17 11:30:09 +00:00
# include <ext/range.h>
2019-12-15 06:34:43 +00:00
# include "registerAggregateFunctions.h"
2019-05-17 11:30:09 +00:00
2018-05-12 15:49:17 +00:00
namespace DB
{
2020-02-25 18:10:48 +00:00
namespace ErrorCodes
{
extern const int ILLEGAL_TYPE_OF_ARGUMENT ;
extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH ;
}
2018-05-12 15:49:17 +00:00
namespace
{
2019-05-17 11:17:52 +00:00
template < template < typename > class Data >
2018-05-12 15:49:17 +00:00
AggregateFunctionPtr createAggregateFunctionWindowFunnel ( const std : : string & name , const DataTypes & arguments , const Array & params )
2019-05-17 11:41:18 +00:00
{
2020-03-09 03:44:48 +00:00
if ( params . empty ( ) )
2019-08-19 13:12:25 +00:00
throw Exception { " Aggregate function " + name + " requires at least one parameter: <window>, [option, [option, ...]] " , ErrorCodes : : NUMBER_OF_ARGUMENTS_DOESNT_MATCH } ;
2018-05-13 10:05:34 +00:00
if ( arguments . size ( ) < 2 )
throw Exception ( " Aggregate function " + name + " requires one timestamp argument and at least one event condition. " , ErrorCodes : : NUMBER_OF_ARGUMENTS_DOESNT_MATCH ) ;
2019-05-17 11:17:52 +00:00
if ( arguments . size ( ) > max_events + 1 )
2018-05-13 10:05:34 +00:00
throw Exception ( " Too many event arguments for aggregate function " + name , ErrorCodes : : NUMBER_OF_ARGUMENTS_DOESNT_MATCH ) ;
2018-05-12 15:49:17 +00:00
2019-05-17 11:30:09 +00:00
for ( const auto i : ext : : range ( 1 , arguments . size ( ) ) )
{
auto cond_arg = arguments [ i ] . get ( ) ;
if ( ! isUInt8 ( cond_arg ) )
throw Exception { " Illegal type " + cond_arg - > getName ( ) + " of argument " + toString ( i + 1 ) + " of aggregate function "
+ name + " , must be UInt8 " , ErrorCodes : : ILLEGAL_TYPE_OF_ARGUMENT } ;
}
2019-05-17 11:17:52 +00:00
AggregateFunctionPtr res ( createWithUnsignedIntegerType < AggregateFunctionWindowFunnel , Data > ( * arguments [ 0 ] , arguments , params ) ) ;
WhichDataType which ( arguments . front ( ) . get ( ) ) ;
if ( res )
return res ;
else if ( which . isDate ( ) )
return std : : make_shared < AggregateFunctionWindowFunnel < DataTypeDate : : FieldType , Data < DataTypeDate : : FieldType > > > ( arguments , params ) ;
else if ( which . isDateTime ( ) )
return std : : make_shared < AggregateFunctionWindowFunnel < DataTypeDateTime : : FieldType , Data < DataTypeDateTime : : FieldType > > > ( arguments , params ) ;
2019-05-18 01:34:55 +00:00
throw Exception { " Illegal type " + arguments . front ( ) . get ( ) - > getName ( )
+ " of first argument of aggregate function " + name + " , must be Unsigned Number, Date, DateTime " ,
ErrorCodes : : ILLEGAL_TYPE_OF_ARGUMENT } ;
2018-05-12 15:49:17 +00:00
}
}
void registerAggregateFunctionWindowFunnel ( AggregateFunctionFactory & factory )
{
2019-05-17 11:17:52 +00:00
factory . registerFunction ( " windowFunnel " , createAggregateFunctionWindowFunnel < AggregateFunctionWindowFunnelData > , AggregateFunctionFactory : : CaseInsensitive ) ;
2018-05-12 15:49:17 +00:00
}
}