Mercurial > gemma
diff pkg/controllers/bottlenecks.go @ 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 | 5e284f39a081 |
children | 4b303c149db4 |
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 {