timetable-extension #1
@ -2,12 +2,14 @@ package dbAccess
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"git.fjla.uk/owlboard/go-types/pkg/database"
 | 
			
		||||
	"git.fjla.uk/owlboard/timetable-mgr/log"
 | 
			
		||||
	"go.mongodb.org/mongo-driver/bson"
 | 
			
		||||
	"go.mongodb.org/mongo-driver/mongo"
 | 
			
		||||
	"go.mongodb.org/mongo-driver/mongo/options"
 | 
			
		||||
	"go.uber.org/zap"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Puts an array of Corpus Documents into the database
 | 
			
		||||
@ -85,27 +87,76 @@ func CreateCorpusIndexes() error {
 | 
			
		||||
func GetTiplocFromCrs(crs string) (tiploc string, err error) {
 | 
			
		||||
	// Return TIPLOC from CRS code
 | 
			
		||||
 | 
			
		||||
	crs = strings.ToUpper(crs)
 | 
			
		||||
	// PIPELINE:
 | 
			
		||||
	/*
 | 
			
		||||
	   bson.A{
 | 
			
		||||
	       bson.D{{"$match", bson.D{{"3ALPHA", "BTH"}}}},
 | 
			
		||||
	       bson.D{
 | 
			
		||||
	           {"$project",
 | 
			
		||||
	               bson.D{
 | 
			
		||||
	                   {"TIPLOC", 1},
 | 
			
		||||
	                   {"STANOX", 1},
 | 
			
		||||
	                   {"_id", 0},
 | 
			
		||||
	               },
 | 
			
		||||
	           },
 | 
			
		||||
	       },
 | 
			
		||||
	   }
 | 
			
		||||
	*/
 | 
			
		||||
	err = fmt.Errorf("not yet written")
 | 
			
		||||
	return "", err
 | 
			
		||||
	pipeline := bson.A{
 | 
			
		||||
		bson.D{{"$match", bson.D{{"3ALPHA", crs}}}},
 | 
			
		||||
		bson.D{
 | 
			
		||||
			{"$project",
 | 
			
		||||
				bson.D{
 | 
			
		||||
					{"TIPLOC", 1},
 | 
			
		||||
					{"_id", 0},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	coll := MongoClient.Database(DatabaseName).Collection(StationsCollection)
 | 
			
		||||
	cursor, err := coll.Aggregate(context.Background(), pipeline)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	defer cursor.Close(context.Background())
 | 
			
		||||
 | 
			
		||||
	var result struct {
 | 
			
		||||
		TIPLOC string `bson:"TIPLOC"`
 | 
			
		||||
	}
 | 
			
		||||
	if cursor.Next(context.Background()) {
 | 
			
		||||
		if err := cursor.Decode(&result); err != nil {
 | 
			
		||||
			return "", err
 | 
			
		||||
		}
 | 
			
		||||
		return result.TIPLOC, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log.Warn("No TIPLOC Found", zap.String("CRS", crs))
 | 
			
		||||
	return "", nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetStanoxFromCrs(crs string) (stanox string, err error) {
 | 
			
		||||
	// Return STANOX from CRS code
 | 
			
		||||
	err = fmt.Errorf("not yet written")
 | 
			
		||||
	return "", err
 | 
			
		||||
	crs = strings.ToUpper(crs)
 | 
			
		||||
	// PIPELINE:
 | 
			
		||||
	pipeline := bson.A{
 | 
			
		||||
		bson.D{{"$match", bson.D{{"3ALPHA", crs}}}},
 | 
			
		||||
		bson.D{
 | 
			
		||||
			{"$project",
 | 
			
		||||
				bson.D{
 | 
			
		||||
					{"STANOX", 1},
 | 
			
		||||
					{"_id", 0},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	coll := MongoClient.Database(DatabaseName).Collection(StationsCollection)
 | 
			
		||||
	cursor, err := coll.Aggregate(context.Background(), pipeline)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	defer cursor.Close(context.Background())
 | 
			
		||||
 | 
			
		||||
	var result struct {
 | 
			
		||||
		STANOX string `bson:"STANOX"`
 | 
			
		||||
	}
 | 
			
		||||
	if cursor.Next(context.Background()) {
 | 
			
		||||
		if err := cursor.Decode(&result); err != nil {
 | 
			
		||||
			return "", err
 | 
			
		||||
		}
 | 
			
		||||
		return result.STANOX, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log.Warn("No STANOX Found", zap.String("CRS", crs))
 | 
			
		||||
	return "", nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ func SetStationsMetadata(time time.Time) bool {
 | 
			
		||||
	database := MongoClient.Database(DatabaseName)
 | 
			
		||||
	collection := database.Collection(MetaCollection)
 | 
			
		||||
	options := options.Update().SetUpsert(true)
 | 
			
		||||
	filter := bson.M{"type": Doctype}
 | 
			
		||||
	filter := bson.M{"type": StationsMetaDoctype}
 | 
			
		||||
	update := bson.M{
 | 
			
		||||
		"$set": bson.M{
 | 
			
		||||
			"type":       StationsMetaDoctype,
 | 
			
		||||
@ -73,7 +73,6 @@ func PutManyNewStations(stationsData *[]database.Station) error {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	SetUpdateTime(StationsCollection)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -86,6 +85,26 @@ func convertNewStationsToInterfaceSlice(stationsData *[]database.Station) *[]int
 | 
			
		||||
	return &interfaceSlice
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CreateStationIndeces() bool {
 | 
			
		||||
	return false
 | 
			
		||||
func CreateStationIndeces() error {
 | 
			
		||||
	coll := MongoClient.Database(DatabaseName).Collection(StationsCollection)
 | 
			
		||||
 | 
			
		||||
	locationIndex := mongo.IndexModel{
 | 
			
		||||
		Keys:    bson.D{{"location", "2dsphere"}},
 | 
			
		||||
		Options: nil,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	crsIndex := mongo.IndexModel{
 | 
			
		||||
		Keys: bson.D{{"3ALPHA", 1}},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tiplocIndex := mongo.IndexModel{
 | 
			
		||||
		Keys: bson.D{{"TIPLOC", 1}},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err := coll.Indexes().CreateMany(context.Background(), []mongo.IndexModel{locationIndex, crsIndex, tiplocIndex})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,6 @@
 | 
			
		||||
package stations
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"git.fjla.uk/owlboard/timetable-mgr/dbAccess"
 | 
			
		||||
@ -33,23 +32,41 @@ func Check() {
 | 
			
		||||
func run() bool {
 | 
			
		||||
	// Download
 | 
			
		||||
	data, data2, err := download()
 | 
			
		||||
	log.Info("Downloaded station data from two sources")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println(err)
 | 
			
		||||
		log.Error("error downloading station data", zap.Error(err))
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Parse
 | 
			
		||||
	stations, err := parseData(data, data2)
 | 
			
		||||
	log.Info("Parsed station data")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println(err)
 | 
			
		||||
		log.Error("error parsing station data", zap.Error(err))
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Drop
 | 
			
		||||
	dbAccess.DropCollection("stations")
 | 
			
		||||
	err = dbAccess.DropCollection("stations")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error("Error dropping stations collection", zap.Error(err))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Push
 | 
			
		||||
	dbAccess.PutManyNewStations(&stations)
 | 
			
		||||
	err = dbAccess.PutManyNewStations(&stations)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error("Error putting new station data", zap.Error(err))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = dbAccess.CreateStationIndeces()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error("Error creating station indeces", zap.Error(err))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ok := dbAccess.SetStationsMetadata(time.Now())
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.Warn("Error setting new metadata for Stations")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -29,7 +29,6 @@ func parseData(data ...[]byte) ([]database.Station, error) {
 | 
			
		||||
		}
 | 
			
		||||
		output = append(output, outputStation)
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Println(output)
 | 
			
		||||
	return output, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user