changeset 2202:0aee7d4954ae

Fairway availabilty import: Re-factored to be the base for the uploaded fairway availabilty import.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 12 Feb 2019 18:32:48 +0100
parents cae0b597aefc
children 8d1a945d0c3b
files pkg/imports/fa.go
diffstat 1 files changed, 55 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- 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)
+}