// Dequeue a single day, and enqueue a job for each flight on that day func batchFlightDayHandler(w http.ResponseWriter, r *http.Request) { ctx := req2ctx(r) tags := []string{} //"ADSB"} // Maybe make this configurable ... n := 0 str := "" job := r.FormValue("job") if job == "" { http.Error(w, "Missing argument: &job=foo", http.StatusInternalServerError) } day := date.ArbitraryDatestring2MidnightPdt(r.FormValue("day"), "2006/01/02") fdb := oldfgae.NewDB(r) dStart, dEnd := date.WindowForTime(day) dEnd = dEnd.Add(-1 * time.Second) keys, err := fdb.KeysInTimeRangeByTags(tags, dStart, dEnd) if err != nil { log.Errorf(ctx, "upgradeHandler: enqueue: %v", err) http.Error(w, err.Error(), http.StatusInternalServerError) return } singleFlightUrl := "/backend/fdb-batch/flight" for _, key := range keys { str += fmt.Sprintf("Enqueing day=%s: %s?job=%s&key=%s\n", day.Format("2006.01.02"), singleFlightUrl, job, key.Encode()) if r.FormValue("dryrun") == "" { t := taskqueue.NewPOSTTask(singleFlightUrl, map[string][]string{ // "date": {day.Format("2006.01.02")}, "key": {key.Encode()}, "job": {job}, }) if _, err := taskqueue.Add(ctx, t, "batch"); err != nil { log.Errorf(ctx, "upgradeHandler: enqueue: %v", err) http.Error(w, err.Error(), http.StatusInternalServerError) return } } n++ } log.Infof(ctx, "enqueued %d batch items for '%s'", n, job) w.Header().Set("Content-Type", "text/plain") w.Write([]byte(fmt.Sprintf("OK, batch, enqueued %d tasks for %s\n%s", n, job, str))) }
// This widget assumes the values 'date', 'range_from', and 'range_to' func FormValueDateRange(r *http.Request) (s, e time.Time, err error) { err = nil switch r.FormValue("date") { case "today": s, _ = date.WindowForToday() e = s case "yesterday": s, _ = date.WindowForYesterday() e = s case "range": s = date.ArbitraryDatestring2MidnightPdt(r.FormValue("range_from"), "2006/01/02") e = date.ArbitraryDatestring2MidnightPdt(r.FormValue("range_to"), "2006/01/02") if s.After(e) { s, e = e, s } } e = e.Add(23*time.Hour + 59*time.Minute + 59*time.Second) // make sure e covers its whole day return }
func (cdb ComplaintDB) ResetGlobalStats() { if err := cdb.DeletAllGlobalStats(); err != nil { cdb.Errorf("Reset/DeleteAll fail, %v", err) return } profiles, err := cdb.GetAllProfiles() if err != nil { return } // Upon reset (writing a fresh new singleton), we need to generate a key rootKey := datastore.NewKey(cdb.Ctx(), kGlobalStatsKind, "foo", 0, nil) key := datastore.NewIncompleteKey(cdb.Ctx(), kGlobalStatsKind, rootKey) gs := GlobalStats{ DatastoreKey: key.Encode(), } // This is too slow to recalculate this way; it runs into the 10m timeout //start := date.ArbitraryDatestring2MidnightPdt("2015/08/09", "2006/01/02").Add(-1 * time.Second) start := date.ArbitraryDatestring2MidnightPdt("2016/03/15", "2006/01/02").Add(-1 * time.Second) end, _ := date.WindowForYesterday() // end is the final day we count for; yesterday midnights := date.IntermediateMidnights(start, end.Add(time.Minute)) for _, m := range midnights { dayStart, dayEnd := date.WindowForTime(m) dc := DailyCount{Datestring: date.Time2Datestring(dayStart)} for _, p := range profiles { if keys, err := cdb.GetComplaintKeysInSpanByEmailAddress(dayStart, dayEnd, p.EmailAddress); err != nil { cdb.Errorf("Reset/Lookup fail, %v", err) } else if len(keys) > 0 { dc.NumComplaints += len(keys) dc.NumComplainers += 1 } } gs.Counts = append(gs.Counts, dc) } if err := cdb.SaveGlobalStats(gs); err != nil { cdb.Errorf("Reset/Save fail, %v", err) } }