# HG changeset patch # User Sascha L. Teichmann # Date 1558692835 -7200 # Node ID e07b18f2482e02fcdbb18cd5a0ca5117478f3ef6 # Parent d7ddb21f70171ab5af795924ebf2e566031e8e87 Write fairway-depth as CSV, too. diff -r d7ddb21f7017 -r e07b18f2482e pkg/controllers/bottlenecks.go --- a/pkg/controllers/bottlenecks.go Fri May 24 11:20:15 2019 +0200 +++ b/pkg/controllers/bottlenecks.go Fri May 24 12:13:55 2019 +0200 @@ -298,6 +298,19 @@ return v, true } +func intervalMode(mode string) int { + switch strings.ToLower(mode) { + case "monthly": + return 0 + case "quarterly": + return 1 + case "yearly": + return 2 + default: + return 0 + } +} + func loadDepthValues( ctx context.Context, conn *sql.Conn, @@ -381,8 +394,6 @@ mode := intervalMode(req.FormValue("mode")) bn := mux.Vars(req)["objnam"] - var breaks []float64 - var ldcRefs []float64 if bn == "" { http.Error( @@ -434,6 +445,13 @@ return } + var breaks []float64 + if b := req.FormValue("breaks"); b != "" { + breaks = breaksToReferenceValue(b) + } else { + breaks = afdRefs + } + log.Printf("info: time interval: (%v - %v)\n", from, to) var ms availMeasurements @@ -450,6 +468,27 @@ return } + rw.Header().Add("Content-Type", "text/csv") + + out := csv.NewWriter(rw) + + record := make([]string, 1+2+len(breaks)+1) + record[0] = "#time" + record[1] = fmt.Sprintf("#LDC < %.3f [%%]", ldcRefs[0]) + record[2] = fmt.Sprintf("#LDC >= %.3f [%%]", ldcRefs[0]) + for i, v := range breaks { + if i == 0 { + record[3] = fmt.Sprintf("#d < %.3f [%%]", v) + } + record[i+4] = fmt.Sprintf("#d >= %.3f [%%]", v) + } + + if err := out.Write(record); err != nil { + // Too late for HTTP status message. + log.Printf("error: %v\n", err) + return + } + interval := intervals[mode](from, to) for pfrom, pto, label := interval(); label != ""; pfrom, pto, label = interval() { @@ -469,72 +508,29 @@ lnwlPercents := durationsToPercentage(duration, lnwl) afdPercents := durationsToPercentage(duration, afd) - _ = lnwlPercents - _ = afdPercents - } - - /* // TODO: Rewrite this - - type ldcOutput struct { - Value float64 `json:"value"` - Below float64 `json:"below"` - Above float64 `json:"above"` - } + record[0] = label + for i, v := range lnwlPercents { + record[1+i] = fmt.Sprintf("%.3f", v) + } + for i, v := range afdPercents { + record[3+i] = fmt.Sprintf("%.3f", v) + } - type intervalOutput struct { - From *float64 `json:"from,omitempty"` - To *float64 `json:"to,omitempty"` - Percent float64 `json:"percent"` - } - - type output struct { - LDC []intervalOutput `json:"ldc"` - AFD []intervalOutput `json:"afd"` - } - - out := output{ - LDC: []intervalOutput{ - {To: &ldcRefs[0], Percent: lnwlPercents[0]}, - {From: &ldcRefs[0], Percent: lnwlPercents[1]}, - }, + if err := out.Write(record); err != nil { + // Too late for HTTP status message. + log.Printf("error: %v\n", err) + return + } } - for i, percent := range afdPercents { - var from, to *float64 - switch { - case i == 0: - to = &breaks[i] - case i == len(afdPercents)-1: - from = &breaks[len(breaks)-1] - default: - from = &breaks[i-1] - to = &breaks[i] - } - out.AFD = append(out.AFD, intervalOutput{ - From: from, - To: to, - Percent: percent, - }) + out.Flush() + if err := out.Error(); err != nil { + // Too late for HTTP status message. + log.Printf("error: %v\n", err) } - - jr = JSONResult{Result: &out} - */ return } -func intervalMode(mode string) int { - switch strings.ToLower(mode) { - case "monthly": - return 0 - case "quarterly": - return 1 - case "yearly": - return 2 - default: - return 0 - } -} - func bottleneckAvailableFairwayDepth(rw http.ResponseWriter, req *http.Request) { mode := intervalMode(req.FormValue("mode")) @@ -620,15 +616,16 @@ out := csv.NewWriter(rw) - // label, classes, lnwl - record := make([]string, 1+1+len(breaks)+1) - record[0] = "#label" - record[1] = "# >= LDC [h]" + // label, ldc, classes + record := make([]string, 1+2+len(breaks)+1) + record[0] = "#time" + record[1] = fmt.Sprintf("#LDC < %.3f [h]", ldcRefs[0]) + record[2] = fmt.Sprintf("#LDC >= %.3f [h]", ldcRefs[0]) for i, v := range breaks { if i == 0 { - record[2] = fmt.Sprintf("# < %.2f [h]", v) + record[3] = fmt.Sprintf("# < %.3f [h]", v) } - record[i+3] = fmt.Sprintf("# >= %.2f [h]", v) + record[i+4] = fmt.Sprintf("# >= %.3f [h]", v) } if err := out.Write(record); err != nil { @@ -653,23 +650,25 @@ for pfrom, pto, label := interval(); label != ""; pfrom, pto, label = interval() { + ldc := ms.classify( + pfrom, pto, + ldcRefs, + access, + ) + ranges := ms.classify( pfrom, pto, breaks, access, ) - ldc := ms.classify( - pfrom, pto, - ldcRefs, - access, - ) - record[0] = label - record[1] = fmt.Sprintf("%.3f", ldc[1].Hours()) + for i, v := range ldc { + record[i+1] = fmt.Sprintf("%.3f", v.Hours()) + } for i, d := range ranges { - record[2+i] = fmt.Sprintf("%.3f", d.Hours()) + record[3+i] = fmt.Sprintf("%.3f", d.Hours()) } if err := out.Write(record); err != nil {