# HG changeset patch # User Sascha L. Teichmann # Date 1556480480 -7200 # Node ID ff0b9a94e0e4e7e92eae8c8c680f22e90c2cfca2 # Parent 524bc6545b201a4567cec34ae41a5367846f4e7c Simpified code. diff -r 524bc6545b20 -r ff0b9a94e0e4 pkg/controllers/bottlenecks.go --- a/pkg/controllers/bottlenecks.go Sun Apr 28 21:29:41 2019 +0200 +++ b/pkg/controllers/bottlenecks.go Sun Apr 28 21:41:20 2019 +0200 @@ -14,6 +14,7 @@ package controllers import ( + "context" "database/sql" "fmt" "log" @@ -240,6 +241,91 @@ return t.UTC(), nil } +func loadDepthValues( + ctx context.Context, + conn *sql.Conn, + bottleneck string, + los int, + from, to time.Time, +) (availMeasurements, error) { + + rows, err := conn.QueryContext( + ctx, selectAvailableDepthSQL, bottleneck, los, from, to) + if err != nil { + return nil, err + } + defer rows.Close() + + var ms availMeasurements + + for rows.Next() { + var m availMeasurement + if err := rows.Scan(&m.when, &m.depth, &m.value); err != nil { + return nil, err + } + m.when = m.when.UTC() + ms = append(ms, m) + } + + if err := rows.Err(); err != nil { + return nil, err + } + + return ms, nil +} + +func loadLNWLReferenceValues( + ctx context.Context, + conn *sql.Conn, + bottleneck string, +) ([]referenceValue, error) { + rows, err := conn.QueryContext(ctx, selectGaugeLevelsSQL, bottleneck) + if err != nil { + return nil, err + } + defer rows.Close() + + var levels []referenceValue + +loop: + for rows.Next() { + var what string + var value int + if err := rows.Scan(&what, &value); err != nil { + return nil, err + } + var level int + switch { + case strings.HasPrefix(what, "LDC"): + level = 0 + case strings.HasPrefix(what, "MW"): + level = 1 + case strings.HasPrefix(what, "HDC"): + level = 2 + default: + return nil, fmt.Errorf("Unexpected reference level type '%s'", what) + } + for i := range levels { + if levels[i].level == level { + levels[i].value = float64(value) + continue loop + } + } + levels = append(levels, referenceValue{ + level: level, + value: float64(value), + }) + } + + if err := rows.Err(); err != nil { + return nil, err + } + + sort.Slice(levels, func(i, j int) bool { return levels[i].level < levels[j].level }) + + return levels, nil +} + func bottleneckAvailabilty( _ interface{}, req *http.Request, @@ -294,56 +380,8 @@ ctx := req.Context() - loadLNWLReferenceValues := func() ([]referenceValue, error) { - rows, err := conn.QueryContext(ctx, selectGaugeLevelsSQL, bn) - if err != nil { - return nil, err - } - defer rows.Close() - - var levels []referenceValue - - loop: - for rows.Next() { - var what string - var value int - if err := rows.Scan(&what, &value); err != nil { - return nil, err - } - var level int - switch { - case strings.HasPrefix(what, "LDC"): - level = 0 - case strings.HasPrefix(what, "MW"): - level = 1 - case strings.HasPrefix(what, "HDC"): - level = 2 - default: - return nil, fmt.Errorf("Unexpected reference level type '%s'", what) - } - for i := range levels { - if levels[i].level == level { - levels[i].value = float64(value) - continue loop - } - } - levels = append(levels, referenceValue{ - level: level, - value: float64(value), - }) - } - - if err := rows.Err(); err != nil { - return nil, err - } - - sort.Slice(levels, func(i, j int) bool { return levels[i].level < levels[j].level }) - - return levels, nil - } - var lnwlRefs []referenceValue - if lnwlRefs, err = loadLNWLReferenceValues(); err != nil { + if lnwlRefs, err = loadLNWLReferenceValues(ctx, conn, bn); err != nil { return } @@ -352,37 +390,11 @@ Code: http.StatusNotFound, Message: "No gauge reference values found for bottleneck", } - } - - loadDepthValues := func() (availMeasurements, error) { - - rows, err := conn.QueryContext( - ctx, selectAvailableDepthSQL, bn, los, from, to) - if err != nil { - return nil, err - } - defer rows.Close() - - var ms availMeasurements - - for rows.Next() { - var m availMeasurement - if err := rows.Scan(&m.when, &m.depth, &m.value); err != nil { - return nil, err - } - m.when = m.when.UTC() - ms = append(ms, m) - } - - if err := rows.Err(); err != nil { - return nil, err - } - - return ms, nil + return } var ms availMeasurements - if ms, err = loadDepthValues(); err != nil { + if ms, err = loadDepthValues(ctx, conn, bn, los, from, to); err != nil { return }