implement actual aggregate function