# HG changeset patch # User Sascha L. Teichmann # Date 1549992768 -3600 # Node ID 0aee7d4954aede1c97636870de1430962571ce2a # Parent cae0b597aefcb4d30d337c82dcf647c564758b37 Fairway availabilty import: Re-factored to be the base for the uploaded fairway availabilty import. diff -r cae0b597aefc -r 0aee7d4954ae pkg/imports/fa.go --- a/pkg/imports/fa.go Tue Feb 12 18:06:32 2019 +0100 +++ b/pkg/imports/fa.go Tue Feb 12 18:32:48 2019 +0100 @@ -259,12 +259,11 @@ return date, nil } -// Do executes the actual fairway availability import. -func (fa *FairwayAvailability) Do( +func storeFairwayAvailability( ctx context.Context, - importID int64, conn *sql.Conn, feedback Feedback, + fetch func(context.Context, *sql.Tx, bottlenecks) ([]*ifaf.FairwayAvailability, error), ) (interface{}, error) { start := time.Now() @@ -280,17 +279,17 @@ return nil, err } + fas, err := fetch(ctx, tx, bns) + if err != nil { + return nil, err + } + fairwayAvailabilities, err := loadFairwayAvailabilities(ctx, tx) if err != nil { return nil, err } - latest, err := latestDate(ctx, tx) - if err != nil { - return nil, err - } - - faids, err := fa.doForFAs(ctx, bns, fairwayAvailabilities, latest, tx, feedback) + faids, err := doForFAs(ctx, bns, fairwayAvailabilities, fas, tx, feedback) if err != nil { return nil, fmt.Errorf("Error processing data: %v", err) } @@ -300,8 +299,6 @@ } feedback.Info("Processed %d fairway availabilities", len(faids)) - feedback.Info("Storing fairway availabilities took %s", time.Since(start)) - if err = tx.Commit(); err == nil { feedback.Info( "Importing fairway availabilities successfully took %s", time.Since(start)) @@ -320,40 +317,15 @@ return &summary, nil } -func (fa *FairwayAvailability) doForFAs( +func doForFAs( ctx context.Context, bnIds bottlenecks, fairwayAvailabilities map[uniqueFairwayAvailability]int64, - latestDate pgtype.Timestamp, + fas []*ifaf.FairwayAvailability, tx *sql.Tx, feedback Feedback, ) ([]string, error) { - client := ifaf.NewFairwayAvailabilityService(fa.URL, fa.Insecure, nil) - - var period ifaf.RequestedPeriod - period.Date_start = latestDate.Time - period.Date_end = time.Now() - - ids := ifaf.ArrayOfString{ - String: bnIds, - } - - req := &ifaf.Get_bottleneck_fa{ - Bottleneck_id: &ids, - Period: &period, - } - resp, err := client.Get_bottleneck_fa(req) - if err != nil { - return nil, err - } - - if resp.Get_bottleneck_faResult == nil { - return nil, errors.New("no fairway availabilities found") - } - - result := resp.Get_bottleneck_faResult - insertFAStmt, err := tx.PrepareContext(ctx, insertFASQL) if err != nil { return nil, err @@ -377,8 +349,8 @@ var faIDs []string var faID int64 - feedback.Info("Found %d fairway availabilities", len(result.FairwayAvailability)) - for _, faRes := range result.FairwayAvailability { + feedback.Info("Found %d fairway availabilities", len(fas)) + for _, faRes := range fas { if !bnIds.contains(faRes.Bottleneck_id) { feedback.Warn("Bottleneck %s not found in database.", faRes.Bottleneck_id) continue @@ -492,3 +464,46 @@ } return faIDs, nil } + +// Do executes the actual fairway availability import. +func (fa *FairwayAvailability) Do( + ctx context.Context, + importID int64, + conn *sql.Conn, + feedback Feedback, +) (interface{}, error) { + + fetch := func(ctx context.Context, tx *sql.Tx, bns bottlenecks) ([]*ifaf.FairwayAvailability, error) { + + latest, err := latestDate(ctx, tx) + if err != nil { + return nil, err + } + + client := ifaf.NewFairwayAvailabilityService(fa.URL, fa.Insecure, nil) + + var period ifaf.RequestedPeriod + period.Date_start = latest.Time + period.Date_end = time.Now() + + ids := ifaf.ArrayOfString{String: bns} + + req := &ifaf.Get_bottleneck_fa{ + Bottleneck_id: &ids, + Period: &period, + } + resp, err := client.Get_bottleneck_fa(req) + if err != nil { + return nil, err + } + + if resp.Get_bottleneck_faResult == nil { + return nil, errors.New("no fairway availabilities found") + } + + result := resp.Get_bottleneck_faResult + return result.FairwayAvailability, nil + } + + return storeFairwayAvailability(ctx, conn, feedback, fetch) +}