Skip to content

Commit 89c195b

Browse files
introduced an index and made sure that the dishes are unique
1 parent a0e877b commit 89c195b

File tree

4 files changed

+38
-42
lines changed

4 files changed

+38
-42
lines changed

server/backend/cron/dish_name_download.go

+15-13
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cron
22

33
import (
44
"encoding/json"
5+
"errors"
56
"fmt"
67
"net/http"
78
"strings"
@@ -95,25 +96,26 @@ func downloadDailyDishes(c *CronService) {
9596
CafeteriaID: v.Cafeteria,
9697
}
9798

98-
var count int64
99-
var dishId int64
100-
if err := c.db.Model(&model.Dish{}).
101-
Where("name = ? AND cafeteriaID = ?", dish.Name, dish.CafeteriaID).
102-
Select("dish").
103-
First(&dishId).
104-
Count(&count).Error; err != nil {
105-
log.WithError(err).Error("Error while checking whether this is already in database")
106-
}
107-
if count == 0 {
99+
var dbDish model.Dish
100+
if err := c.db.First(&dbDish, "name = ? AND cafeteriaID = ?", dish.Name, dish.CafeteriaID).Error; err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
108101
if err := c.db.Create(&dish).Error; err != nil {
109-
log.WithError(err).Error("Error while creating new CanteenDish entry with name {}. CanteenDish won't be saved", dish.Name)
102+
log.WithError(err).WithField("name", dish.Name).Error("Error while creating new CanteenDish entry. CanteenDish won't be saved")
110103
}
111104
addDishTagsToMapping(dish.Dish, dish.Name, c.db)
112-
dishId = dish.Dish
105+
dbDish = dish
106+
} else if err != nil {
107+
log.WithError(err).Error("Error while checking whether the dish is already in database")
113108
}
109+
110+
if dbDish.Type != dish.Type {
111+
if err := c.db.Where("dish = ?", dbDish.Dish).Updates(&dish).Error; err != nil {
112+
log.WithError(err).WithField("from", dish.Type).WithField("to", dish.Type).Error("Error while updating dish to new type")
113+
}
114+
}
115+
114116
if weekliesWereAdded == 0 {
115117
errCreate := c.db.Create(&model.DishesOfTheWeek{
116-
DishID: dishId,
118+
DishID: dbDish.Dish,
117119
Year: int32(year),
118120
Week: int32(week),
119121
Day: int32(weekDayIndex),
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package migration
2+
3+
import (
4+
"github.com/go-gormigrate/gormigrate/v2"
5+
"gorm.io/gorm"
6+
)
7+
8+
// migrate20240311000000
9+
// made sure that dishes have the correct indexes
10+
func migrate20240311000000() *gormigrate.Migration {
11+
return &gormigrate.Migration{
12+
ID: "20240311000000",
13+
Migrate: func(tx *gorm.DB) error {
14+
return tx.Raw("create unique index dish_name_cafeteriaID_uindex on dish (name, cafeteriaID)").Error
15+
},
16+
Rollback: func(tx *gorm.DB) error {
17+
return tx.Raw("drop index dish_name_cafeteriaID_uindex on dish").Error
18+
},
19+
}
20+
}

server/backend/migration/migration.go

+1-27
Original file line numberDiff line numberDiff line change
@@ -12,34 +12,7 @@ import (
1212

1313
func autoMigrate(db *gorm.DB) error {
1414
err := db.AutoMigrate(
15-
&model.Cafeteria{},
16-
&model.CafeteriaRating{},
17-
&model.CafeteriaRatingTag{},
18-
&model.CafeteriaRatingTagOption{},
19-
&model.CanteenHeadCount{},
20-
&model.Crontab{},
21-
&model.Device{},
2215
&model.Dish{},
23-
&model.DishNameTag{},
24-
&model.DishNameTagOption{},
25-
&model.DishNameTagOptionExcluded{},
26-
&model.DishNameTagOptionIncluded{},
27-
&model.DishRating{},
28-
&model.DishRatingTag{},
29-
&model.DishRatingTagOption{},
30-
&model.DishToDishNameTag{},
31-
&model.DishesOfTheWeek{},
32-
&model.Feedback{},
33-
&model.File{},
34-
&model.Kino{},
35-
&model.NewExamResultsSubscriber{},
36-
&model.News{},
37-
&model.NewsAlert{},
38-
&model.NewsSource{},
39-
&model.Notification{},
40-
&model.NotificationConfirmation{},
41-
&model.NotificationType{},
42-
&model.UpdateNote{},
4316
)
4417
return err
4518
}
@@ -71,6 +44,7 @@ func manualMigrate(db *gorm.DB) error {
7144
migrate20240102000000(),
7245
migrate20240103000000(),
7346
migrate20240207000000(),
47+
migrate20240311000000(),
7448
}
7549
return gormigrate.New(db, gormigrateOptions, migrations).Migrate()
7650
}

server/model/dish.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ var (
1414
// Dish represents one dish fin a specific cafeteria
1515
type Dish struct {
1616
Dish int64 `gorm:"primary_key;AUTO_INCREMENT;column:dish;type:int;not null;" json:"dish"`
17-
Name string `gorm:"column:name;type:text;not null;" json:"name" `
17+
Name string `gorm:"column:name;type:text;not null;uniqueIndex:dish_name_cafeteriaID_uindex" json:"name" `
1818
Type string `gorm:"column:type;type:text;not null;" json:"type" `
19-
CafeteriaID int64 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"cafeteriaID"`
19+
CafeteriaID int64 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;uniqueIndex:dish_name_cafeteriaID_uindex" json:"cafeteriaID"`
2020
}
2121

2222
// TableName sets the insert table name for this struct type

0 commit comments

Comments
 (0)