timetable-extension #1
							
								
								
									
										55
									
								
								cif/convert.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								cif/convert.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,55 @@
 | 
			
		||||
package cif
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"strconv"
 | 
			
		||||
 | 
			
		||||
	"git.fjla.uk/owlboard/go-types/pkg/database"
 | 
			
		||||
	"git.fjla.uk/owlboard/go-types/pkg/upstreamApi"
 | 
			
		||||
	"git.fjla.uk/owlboard/timetable-mgr/helpers"
 | 
			
		||||
	"git.fjla.uk/owlboard/timetable-mgr/log"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func ConvertServiceType(input *upstreamApi.JsonScheduleV1, vstp bool) (*database.Service, error) {
 | 
			
		||||
	output := database.Service{
 | 
			
		||||
		TransactionType:   input.TransactionType,
 | 
			
		||||
		StpIndicator:      input.CifStpIndicator,
 | 
			
		||||
		Vstp:              vstp, // Simply uses the value passed into the function
 | 
			
		||||
		Operator:          input.AtocCode,
 | 
			
		||||
		TrainUid:          input.CifTrainUid,
 | 
			
		||||
		Headcode:          input.ScheduleSegment.SignallingId,
 | 
			
		||||
		PowerType:         input.ScheduleSegment.CifPowerType,
 | 
			
		||||
		PlanSpeed:         parseSpeed(&input.ScheduleSegment.CifSpeed),
 | 
			
		||||
		ScheduleStartDate: ParseCifDate(&input.ScheduleStartDate, "start"),
 | 
			
		||||
		ScheduleEndDate:   ParseCifDate(&input.ScheduleEndDate, "end"),
 | 
			
		||||
		DaysRun:           parseDaysRun(&input.ScheduleDaysRun),
 | 
			
		||||
		Stops:             parseStops(&input.ScheduleSegment.ScheduleLocation),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &output, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Converts CifSpeed input string to an int32, automatically corrects VSTP speeds which are not actual speed values
 | 
			
		||||
func parseSpeed(CIFSpeed *string) int32 {
 | 
			
		||||
	log.Msg.Debug("CIFSpeed Input: '" + *CIFSpeed + "'")
 | 
			
		||||
	if *CIFSpeed == "" || CIFSpeed == nil {
 | 
			
		||||
		log.Msg.Debug("Speed data not provided")
 | 
			
		||||
		return int32(0)
 | 
			
		||||
	}
 | 
			
		||||
	actualSpeed, exists := helpers.SpeedMap[*CIFSpeed]
 | 
			
		||||
	if !exists {
 | 
			
		||||
		actualSpeed = *CIFSpeed
 | 
			
		||||
	}
 | 
			
		||||
	log.Msg.Debug("Corrected Speed: " + actualSpeed)
 | 
			
		||||
 | 
			
		||||
	speed, err := strconv.ParseInt(actualSpeed, 10, 32)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Msg.Warn("Unable to parse speed: " + *CIFSpeed + ", returning 0")
 | 
			
		||||
		return int32(0)
 | 
			
		||||
	}
 | 
			
		||||
	return int32(speed)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseStops(input *[]upstreamApi.CifScheduleLocation) []database.Stop {
 | 
			
		||||
	output := make([]database.Stop, 0, len(*input))
 | 
			
		||||
	return output
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								cif/convert_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								cif/convert_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,31 @@
 | 
			
		||||
package cif
 | 
			
		||||
 | 
			
		||||
import "testing"
 | 
			
		||||
 | 
			
		||||
func TestParseSpeed(t *testing.T) {
 | 
			
		||||
	testCases := []struct {
 | 
			
		||||
		input    *string
 | 
			
		||||
		expected int32
 | 
			
		||||
	}{
 | 
			
		||||
		{strPtr("075"), 75},
 | 
			
		||||
		{strPtr("125"), 125},
 | 
			
		||||
		{strPtr("40"), 40},
 | 
			
		||||
		{strPtr("040"), 40},
 | 
			
		||||
		{strPtr("134"), 60},
 | 
			
		||||
		{strPtr("179"), 80},
 | 
			
		||||
		{strPtr("186"), 186},
 | 
			
		||||
		{strPtr("417"), 186},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, tc := range testCases {
 | 
			
		||||
		result := parseSpeed(tc.input)
 | 
			
		||||
 | 
			
		||||
		if result != tc.expected {
 | 
			
		||||
			t.Errorf("For speed: %s, expected: %d, but got: %d", tc.input, tc.expected, result)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func strPtr(s string) *string {
 | 
			
		||||
	return &s
 | 
			
		||||
}
 | 
			
		||||
@ -70,11 +70,11 @@ func generateUpdateDays(days int) []time.Time {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Parses CIF Schedule Start/End Dates (YYYY-MM-DD) into time.Time types (00:00:00 for start, 23:59:59 for end)
 | 
			
		||||
func ParseCifDate(input, startOrEnd string) time.Time {
 | 
			
		||||
func ParseCifDate(input *string, startOrEnd string) time.Time {
 | 
			
		||||
	layout := "2006-01-02" // Layout of input
 | 
			
		||||
	t, err := time.ParseInLocation(layout, input, londonTimezone)
 | 
			
		||||
	t, err := time.ParseInLocation(layout, *input, londonTimezone)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Msg.Error("Error parsing date string", zap.String("date string", input), zap.Error(err))
 | 
			
		||||
		log.Msg.Error("Error parsing date string", zap.String("date string", *input), zap.Error(err))
 | 
			
		||||
		return time.Time{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -83,7 +83,7 @@ func ParseCifDate(input, startOrEnd string) time.Time {
 | 
			
		||||
	} else if startOrEnd == "end" {
 | 
			
		||||
		t = time.Date(t.Year(), t.Month(), t.Day(), 23, 59, 59, 0, londonTimezone)
 | 
			
		||||
	} else {
 | 
			
		||||
		log.Msg.Error("Error parsing date string", zap.String("date string", input), zap.Error(err))
 | 
			
		||||
		log.Msg.Error("Error parsing date string", zap.String("date string", *input), zap.Error(err))
 | 
			
		||||
		return time.Time{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -91,10 +91,10 @@ func ParseCifDate(input, startOrEnd string) time.Time {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Parses CIF days_run field and converts to array of day strings
 | 
			
		||||
func parseDaysRun(daysBinary string) []string {
 | 
			
		||||
func parseDaysRun(daysBinary *string) []string {
 | 
			
		||||
	shortDays := []string{"m", "t", "w", "th", "f", "s", "su"}
 | 
			
		||||
	var result []string
 | 
			
		||||
	for i, digit := range daysBinary {
 | 
			
		||||
	for i, digit := range *daysBinary {
 | 
			
		||||
		if digit == '1' {
 | 
			
		||||
			result = append(result, shortDays[i])
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -102,7 +102,7 @@ func TestParseCifDate(t *testing.T) {
 | 
			
		||||
	layout := "2006-01-02 15:04:05" // Layout for printing times in error cases.
 | 
			
		||||
 | 
			
		||||
	for _, tc := range testCases {
 | 
			
		||||
		result := ParseCifDate(tc.dateString, tc.startOrEnd)
 | 
			
		||||
		result := ParseCifDate(&tc.dateString, tc.startOrEnd)
 | 
			
		||||
		if result != tc.expect {
 | 
			
		||||
			t.Errorf("For datestring %s, startOrEnd %s, expected %s, but got %s", tc.dateString, tc.startOrEnd, tc.expect.Format(layout), result.Format(layout))
 | 
			
		||||
		}
 | 
			
		||||
@ -122,7 +122,7 @@ func TestParseDaysRun(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, tc := range testCases {
 | 
			
		||||
		result := parseDaysRun(tc.input)
 | 
			
		||||
		result := parseDaysRun(&tc.input)
 | 
			
		||||
		if !reflect.DeepEqual(result, tc.expect) {
 | 
			
		||||
			t.Errorf("For input %s, expected %v, but got %v", tc.input, tc.expect, result)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -47,7 +47,7 @@ func doDeletions(deletions []*upstreamApi.JsonScheduleV1) error {
 | 
			
		||||
	deleteQueries := make([]database.DeleteQuery, 0)
 | 
			
		||||
	for _, item := range deletions {
 | 
			
		||||
		query := database.DeleteQuery{
 | 
			
		||||
			ScheduleStartDate: ParseCifDate(item.ScheduleStartDate, "start"),
 | 
			
		||||
			ScheduleStartDate: ParseCifDate(&item.ScheduleStartDate, "start"),
 | 
			
		||||
			StpIndicator:      item.CifStpIndicator,
 | 
			
		||||
			TrainUid:          item.CifTrainUid,
 | 
			
		||||
		}
 | 
			
		||||
@ -70,10 +70,12 @@ func doCreations(creations []*upstreamApi.JsonScheduleV1) error {
 | 
			
		||||
 | 
			
		||||
	createDocuments := make([]database.Service, 0)
 | 
			
		||||
	for _, item := range creations {
 | 
			
		||||
		document := database.Service{}
 | 
			
		||||
		// Do type conversion here - REMOVE THIS LOG LINE, IT WILL CAUSE 10000s of log entries
 | 
			
		||||
		log.Msg.Debug("item", zap.Any("item", item))
 | 
			
		||||
		createDocuments = append(createDocuments, document)
 | 
			
		||||
		document, err := ConvertServiceType(item, false)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Msg.Error("Error converting JsonSchedule to Service type", zap.Error(err))
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		createDocuments = append(createDocuments, *document)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := dbAccess.CreateCifEntries(createDocuments)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user