changeset 3424:0a666ba899fa

fairway availabilty: removed level from class breaks.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 23 May 2019 15:49:59 +0200
parents 6592396f5061
children cb2f67a07400
files pkg/controllers/bottlenecks.go pkg/controllers/stretches.go
diffstat 2 files changed, 39 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/controllers/bottlenecks.go	Thu May 23 15:33:56 2019 +0200
+++ b/pkg/controllers/bottlenecks.go	Thu May 23 15:49:59 2019 +0200
@@ -100,11 +100,6 @@
 )
 
 type (
-	referenceValue struct {
-		level int
-		value float64
-	}
-
 	availMeasurement struct {
 		when  time.Time
 		depth int16
@@ -116,9 +111,9 @@
 )
 
 // afdRefs are the typical available fairway depth reference values.
-var afdRefs = []referenceValue{
-	{0, 230},
-	{1, 250},
+var afdRefs = []float64{
+	230,
+	250,
 }
 
 func (measurement *availMeasurement) getDepth() float64 {
@@ -147,7 +142,7 @@
 
 func (measurements availMeasurements) classify(
 	from, to time.Time,
-	breaks []referenceValue,
+	breaks []float64,
 	access func(*availMeasurement) float64,
 ) []time.Duration {
 
@@ -160,10 +155,10 @@
 	values := make([]time.Time, len(classes))
 
 	// Add sentinels
-	classes[0] = breaks[0].value - 9999
-	classes[len(classes)-1] = breaks[len(breaks)-1].value + 9999
+	classes[0] = breaks[0] - 9999
+	classes[len(classes)-1] = breaks[len(breaks)-1] + 9999
 	for i := range breaks {
-		classes[i+1] = breaks[i].value
+		classes[i+1] = breaks[i]
 	}
 
 	idx := sort.Search(len(measurements), func(i int) bool {
@@ -328,7 +323,7 @@
 	ctx context.Context,
 	conn *sql.Conn,
 	bottleneck string,
-) ([]referenceValue, error) {
+) ([]float64, error) {
 
 	var value float64
 	err := conn.QueryRowContext(ctx, selectGaugeLDCSQL, bottleneck).Scan(&value)
@@ -339,31 +334,32 @@
 		return nil, err
 	}
 	log.Printf("info: LDC = %.2f\n", value)
-	return []referenceValue{{0, value}}, nil
+	return []float64{value}, nil
 }
 
-func breaksToReferenceValue(breaks string) []referenceValue {
+func breaksToReferenceValue(breaks string) []float64 {
 	parts := strings.Split(breaks, ",")
-	values := map[float64]struct{}{}
+	var values []float64
+
 	for _, part := range parts {
 		part = strings.TrimSpace(part)
 		if v, err := strconv.ParseFloat(part, 64); err == nil {
-			values[v] = struct{}{}
+			values = append(values, v)
 		}
 	}
-	refs := make([]referenceValue, len(values))
-	var i int
-	for v := range values {
-		refs[i].value = v
-		i++
+
+	sort.Float64s(values)
+
+	// dedup
+	for i := 1; i < len(values); {
+		if values[i-1] == values[i] {
+			copy(values[i:], values[i+1:])
+			values = values[:len(values)-1]
+		} else {
+			i++
+		}
 	}
-	sort.Slice(refs, func(i, j int) bool {
-		return refs[i].value < refs[j].value
-	})
-	for i := range refs {
-		refs[i].level = i
-	}
-	return refs
+	return values
 }
 
 func bottleneckAvailabilty(
@@ -414,7 +410,7 @@
 		los = 1
 	}
 
-	var breaks []referenceValue
+	var breaks []float64
 	if b := req.FormValue("breaks"); b != "" {
 		breaks = breaksToReferenceValue(b)
 	} else {
@@ -423,7 +419,7 @@
 
 	ctx := req.Context()
 
-	var ldcRefs []referenceValue
+	var ldcRefs []float64
 	if ldcRefs, err = loadLDCReferenceValue(ctx, conn, bn); err != nil {
 		return
 	}
@@ -485,14 +481,14 @@
 	for i := range ldcRefs {
 		out.LNWL = append(out.LNWL, lnwlOutput{
 			Level:   "LDC",
-			Value:   ldcRefs[i].value,
+			Value:   ldcRefs[i],
 			Percent: lnwlPercents[i],
 		})
 	}
 
 	for i := range breaks {
 		out.AFD = append(out.AFD, afdOutput{
-			Value:   breaks[i].value,
+			Value:   breaks[i],
 			Percent: afdPercents[i],
 		})
 	}
@@ -613,7 +609,7 @@
 		return
 	}
 
-	var breaks []referenceValue
+	var breaks []float64
 	if b := req.FormValue("breaks"); b != "" {
 		breaks = breaksToReferenceValue(b)
 	} else {
@@ -630,9 +626,9 @@
 	record[1] = "# >= LDC [h]"
 	for i, v := range breaks {
 		if i == 0 {
-			record[2] = fmt.Sprintf("# < %.2f [h]", v.value)
+			record[2] = fmt.Sprintf("# < %.2f [h]", v)
 		}
-		record[i+3] = fmt.Sprintf("# >= %.2f [h]", v.value)
+		record[i+3] = fmt.Sprintf("# >= %.2f [h]", v)
 	}
 
 	if err := out.Write(record); err != nil {
--- a/pkg/controllers/stretches.go	Thu May 23 15:33:56 2019 +0200
+++ b/pkg/controllers/stretches.go	Thu May 23 15:49:59 2019 +0200
@@ -58,8 +58,8 @@
 	fullStretchBottleneck struct {
 		*stretchBottleneck
 		measurements availMeasurements
-		ldc          []referenceValue
-		breaks       []referenceValue
+		ldc          []float64
+		breaks       []float64
 		access       func(*availMeasurement) float64
 	}
 )
@@ -79,7 +79,7 @@
 	bn *stretchBottleneck,
 	los int,
 	from, to time.Time,
-	depthbreaks, widthbreaks []referenceValue,
+	depthbreaks, widthbreaks []float64,
 ) (*fullStretchBottleneck, error) {
 	measurements, err := loadDepthValues(ctx, conn, bn.name, los, from, to)
 	if err != nil {
@@ -91,7 +91,7 @@
 	}
 
 	var access func(*availMeasurement) float64
-	var breaks []referenceValue
+	var breaks []float64
 
 	switch bn.limiting {
 	case "width":
@@ -348,7 +348,7 @@
 
 	interval := intervals[mode](from, to)
 
-	var breaks []referenceValue
+	var breaks []float64
 
 	if useDepth {
 		breaks = depthbreaks
@@ -392,9 +392,9 @@
 			record[i+3] = fmt.Sprintf("# >= break_%d", i+1)
 		} else {
 			if i == 0 {
-				record[2] = fmt.Sprintf("# < %.2f [h]", v.value)
+				record[2] = fmt.Sprintf("# < %.2f [h]", v)
 			}
-			record[i+3] = fmt.Sprintf("# >= %.2f [h]", v.value)
+			record[i+3] = fmt.Sprintf("# >= %.2f [h]", v)
 		}
 	}