##! Calculate the sum.

@load ../main

module SumStats;

export {
	redef enum Calculation += {
		## Calculate the sum of the values.  For string values,
		## this will be the number of strings.
		SUM
	};

	redef record ResultVal += {
		## For numeric data, this tracks the sum of all values.
		sum: double &default=0.0;
	};

	#type threshold_function: function(key: SumStats::Key, result: SumStats::Result): count;
	#global sum_threshold: function(data_id: string): threshold_function;
}

#function sum_threshold(data_id: string): threshold_function
#	{
#	return function(key: SumStats::Key, result: SumStats::Result): count
#		{
#		print fmt("data_id: %s", data_id);
#		print result;
#		return double_to_count(result[data_id]$sum);
#		};
#	}

hook init_resultval_hook(r: Reducer, rv: ResultVal)
	{
	if ( SUM in r$apply && ! rv?$sum )
		rv$sum = 0;
	}

hook register_observe_plugins()
	{
	register_observe_plugin(SUM, function(r: Reducer, val: double, obs: Observation, rv: ResultVal)
		{
		rv$sum += val;
		});
	}

hook compose_resultvals_hook(result: ResultVal, rv1: ResultVal, rv2: ResultVal)
	{
	if ( rv1?$sum || rv2?$sum )
		{
		result$sum = rv1?$sum ? rv1$sum : 0;
		if ( rv2?$sum )
			result$sum += rv2$sum;
		}
	}
