add housekeeping code to delete duplicated tags and videos
This commit is contained in:
18
apiGo/housekeeping/HouseKeeping.go
Normal file
18
apiGo/housekeeping/HouseKeeping.go
Normal file
@ -0,0 +1,18 @@
|
||||
package housekeeping
|
||||
|
||||
import "fmt"
|
||||
|
||||
func RunHouseKeepingTasks() {
|
||||
fmt.Println("Runnint houskeeping tasks!")
|
||||
|
||||
fmt.Println("Deduplicating Tags")
|
||||
deduplicateTags()
|
||||
|
||||
fmt.Println("Deduplicating Tags assigned to videos")
|
||||
deduplicateVideoTags()
|
||||
|
||||
fmt.Println("Fix missing video metadata like ratio")
|
||||
fixMissingMetadata()
|
||||
|
||||
fmt.Println("Finished housekeeping")
|
||||
}
|
5
apiGo/housekeeping/MissingVideoMetaData.go
Normal file
5
apiGo/housekeeping/MissingVideoMetaData.go
Normal file
@ -0,0 +1,5 @@
|
||||
package housekeeping
|
||||
|
||||
func fixMissingMetadata() {
|
||||
// todo
|
||||
}
|
86
apiGo/housekeeping/TagDeduplication.go
Normal file
86
apiGo/housekeeping/TagDeduplication.go
Normal file
@ -0,0 +1,86 @@
|
||||
package housekeeping
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"openmediacenter/apiGo/database"
|
||||
)
|
||||
|
||||
func deduplicateTags() {
|
||||
// find all duplicate tags
|
||||
|
||||
// gives first occurence of duplicate
|
||||
query := `
|
||||
SELECT
|
||||
tag_name
|
||||
FROM
|
||||
tags
|
||||
GROUP BY tag_name
|
||||
HAVING COUNT(tag_name) > 1`
|
||||
rows := database.Query(query)
|
||||
duplicates := []string{}
|
||||
if rows != nil {
|
||||
for rows.Next() {
|
||||
var id string
|
||||
err := rows.Scan(&id)
|
||||
if err != nil {
|
||||
panic(err.Error()) // proper Error handling instead of panic in your app
|
||||
}
|
||||
duplicates = append(duplicates, id)
|
||||
}
|
||||
} else {
|
||||
// nothing to do
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Print("deleting duplicate tag ids: ")
|
||||
fmt.Println(duplicates)
|
||||
|
||||
for _, el := range duplicates {
|
||||
query := fmt.Sprintf("SELECT tag_id FROM tags WHERE tag_name='%s'", el)
|
||||
rows := database.Query(query)
|
||||
ids := []uint32{}
|
||||
for rows.Next() {
|
||||
var id uint32
|
||||
err := rows.Scan(&id)
|
||||
if err != nil {
|
||||
panic(err.Error()) // proper Error handling instead of panic in your app
|
||||
}
|
||||
ids = append(ids, id)
|
||||
}
|
||||
|
||||
// id to copy other data to
|
||||
mainid := ids[0]
|
||||
|
||||
// ids to copy from
|
||||
copyids := ids[1:]
|
||||
|
||||
fmt.Printf("Migrating %s\n", el)
|
||||
migrateTags(mainid, copyids)
|
||||
}
|
||||
}
|
||||
|
||||
func migrateTags(destid uint32, sourcids []uint32) {
|
||||
querytempl := `
|
||||
UPDATE video_tags
|
||||
SET
|
||||
tag_id = %d
|
||||
WHERE
|
||||
tag_id = %d`
|
||||
|
||||
for _, id := range sourcids {
|
||||
err := database.Edit(fmt.Sprintf(querytempl, destid, id))
|
||||
if err != nil {
|
||||
fmt.Printf("failed to set id from %d to %d\n", id, destid)
|
||||
return
|
||||
}
|
||||
fmt.Printf("Merged %d into %d\n", id, destid)
|
||||
|
||||
// now lets delete this tag
|
||||
query := fmt.Sprintf(`DELETE FROM tags WHERE tag_id=%d`, id)
|
||||
err = database.Edit(query)
|
||||
if err != nil {
|
||||
fmt.Printf("failed to delete Tag %d", id)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
37
apiGo/housekeeping/VideoTagDeduplication.go
Normal file
37
apiGo/housekeeping/VideoTagDeduplication.go
Normal file
@ -0,0 +1,37 @@
|
||||
package housekeeping
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"openmediacenter/apiGo/database"
|
||||
)
|
||||
|
||||
func deduplicateVideoTags() {
|
||||
// gives first occurence of duplicate
|
||||
query := `
|
||||
SELECT
|
||||
tag_id, video_id, count(tag_id)
|
||||
FROM
|
||||
video_tags
|
||||
GROUP BY tag_id, video_id
|
||||
HAVING COUNT(tag_id) > 1`
|
||||
rows := database.Query(query)
|
||||
if rows != nil {
|
||||
for rows.Next() {
|
||||
var tagid uint32
|
||||
var vidid uint32
|
||||
var nr uint32
|
||||
err := rows.Scan(&tagid, &vidid, &nr)
|
||||
if err != nil {
|
||||
panic(err.Error()) // proper Error handling instead of panic in your app
|
||||
}
|
||||
|
||||
// now lets delete this tag
|
||||
query := fmt.Sprintf(`DELETE FROM video_tags WHERE tag_id=%d AND video_id=%d LIMIT %d`, tagid, vidid, nr-1)
|
||||
err = database.Edit(query)
|
||||
if err != nil {
|
||||
fmt.Printf("failed to delete Tag %d + vid %d", tagid, vidid)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user