func serfr1ComplaintsReport(c appengine.Context, s, e time.Time, opt ReportOptions) ([]ReportRow, ReportMetadata, error) { fdb := fdb.FlightDB{C: c} maybeMemcache(&fdb, e) cdb := complaintdb.ComplaintDB{C: c, Memcache: true} meta := ReportMetadata{} memKey := fmt.Sprintf("serfr1complaintsreport:%s:%d-%d", s.Unix(), e.Unix()) if rows, meta, err := reportFromMemcache(c, memKey); err == nil { return rows, meta, err } if complaints, err := cdb.GetComplaintsInSpan(s, e); err != nil { return nil, nil, err } else { meta["[B] Total disturbance reports"] = float64(len(complaints)) nFlights := 0 nFpC := map[string]int{} // num flights per carrier nCpC := map[string]int{} // num complaints per carrier // Aggregate complaints per flightnumber (as seen from complaints) nC, nSB, nWC := map[string]int{}, map[string]int{}, map[string]int{} for _, comp := range complaints { if k := comp.AircraftOverhead.FlightNumber; k != "" { nC[k] += 1 nWC[k] += comp.Loudness if comp.HeardSpeedbreaks { nSB[k] += 1 nWC[k] += 4 } } } rows := []SCRow{} reportFunc := func(f *flightdb.Flight) { nFlights++ carrier := f.Id.Designator.IATAAirlineDesignator if carrier != "" { nFpC[carrier] += 1 } if k := f.Id.Designator.String(); k != "" { if carrier != "" { nCpC[carrier] += nC[k] } fClone := f.ShallowCopy() scRow := SCRow{ NumComplaints: nC[k], NumSpeedbrakes: nSB[k], WeightedComplaints: nWC[k], F: *fClone, } rows = append(rows, scRow) meta["[B] SERFR1 disturbance reports"] += float64(nC[k]) } } tags := []string{flightdb.KTagSERFR1} if err := fdb.IterWith(fdb.QueryTimeRangeByTags(tags, s, e), reportFunc); err != nil { return nil, nil, err } meta["[A] Total flights we saw on SERFR1"] += float64(nFlights) meta["[C] Average number of reports per overflight"] = float64(int64(float64(len(complaints)) / float64(nFlights))) sort.Sort(SCRowByNumComplaints(rows)) out := []ReportRow{} for _, r := range rows { out = append(out, r) } bestCarrier, worstCarrier := "", "" bestScore, worstScore := 999, -1 for carrier, nFlights := range nFpC { if nFlights < 3 { continue } cPerFlight := nCpC[carrier] / nFlights if cPerFlight < bestScore { bestCarrier, bestScore = carrier, cPerFlight } if cPerFlight > worstScore { worstCarrier, worstScore = carrier, cPerFlight } } meta["[D] Worst airline (average reports per overflight) - "+worstCarrier] = float64(worstScore) meta["[E] Best airline (average reports per overflight) - "+bestCarrier] = float64(bestScore) // reportToMemcache(c, out, meta, memKey) return out, meta, nil } }