changeset 3445:e07b18f2482e fairway-avail-csv

Write fairway-depth as CSV, too.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 24 May 2019 12:13:55 +0200
parents d7ddb21f7017
children 4a0fab451f87
files pkg/controllers/bottlenecks.go
diffstat 1 files changed, 74 insertions(+), 75 deletions(-) [+]
line wrap: on
line diff
--- 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 {