private async Task <SqlObject> IterateValues(MethodContext context, SqlExpression input, IGroupResolver groupResolver) { SqlObject result = null; for (long i = 0; i < groupResolver.Size; i++) { SqlObject value; var resolver = groupResolver.GetResolver(i); using (var reduce = context.Create("reduce", scope => scope.AddReferenceResolver(resolver))) { var reduced = await input.ReduceAsync(reduce); if (reduced.ExpressionType != SqlExpressionType.Constant) { throw new InvalidOperationException(); } value = ((SqlConstantExpression)reduced).Value; } using (var accumulate = new IterateContext(context, i, result, value)) { await IterateAsync(accumulate); if (accumulate.Result == null) { throw new MethodAccessException("No result value was provided by the iteration"); } result = accumulate.Result; if (!accumulate.Iterate) { break; } } } return(result); }