func projections(c context.Context, u User, days int) (int64, int64, error) { var projected, earned int64 g := syncutil.Group{} g.Go(func() error { q := datastore.NewQuery("Task"). Filter("Disabled = ", false). Filter("Assignee = ", u.Email) for t := q.Run(c); ; { var x Task _, err := t.Next(&x) if err == datastore.Done { return nil } else if err != nil { return err } log.Debugf(c, "Item worth %v every %v", x.Value, x.Period) projected += int64(float64(x.Value) * (float64(days) / float64(x.Period))) } }) g.Go(func() error { q := datastore.NewQuery("LoggedTask"). Filter("User = "******"Completed >=", time.Now().Add(-24*time.Hour*time.Duration(days))) for t := q.Run(c); ; { var x LoggedTask _, err := t.Next(&x) if err == datastore.Done { return nil } else if err != nil { return err } log.Debugf(c, "Logged task worth %v", x.Amount) earned += int64(x.Amount) } }) g.Wait() return projected, earned, g.Err() }