-
Notifications
You must be signed in to change notification settings - Fork 0
/
movie_list_element.go
130 lines (100 loc) · 3.14 KB
/
movie_list_element.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package gol
import (
"fmt"
"reflect"
"sort"
"github.com/jinzhu/gorm"
)
type MovieListElement struct {
ID int
Base ListElementFields `gorm:"polymorphic:Owner;"`
ReviewCount int
Duration int
}
func (item MovieListElement) rateElement() float32 {
viewersFactor := float32(0.25)
return (item.Base.SourceRating * 10.0) + (float32(item.ReviewCount/100000) * viewersFactor)
}
func (item MovieListElement) getRating() float32 {
return item.Base.HeuristicRating
}
func (item MovieListElement) getListName() string {
return "movies"
}
func (item MovieListElement) getStoredName() string {
return gorm.ToDBName(reflect.TypeOf(item).Name()) + "s"
}
func (item MovieListElement) getDerivedID() int {
return item.ID
}
func (item MovieListElement) getListElementFields() ListElementFields {
return item.Base
}
func (item MovieListElement) printInfo() {
fmt.Printf("[ID-%03d] (%.2f) \"%s\" - %s\n", item.ID, item.Base.HeuristicRating, item.Base.Name, item.Base.URL)
}
func (item MovieListElement) printDetailedInfo() {
fmt.Printf("[ID-%03d] \"%s\" (%s)\n", item.ID, item.Base.Name, item.Base.URL)
fmt.Printf("\tHeuristic Rating: %.2f\n", item.Base.HeuristicRating)
fmt.Printf("\tDuration: ? | Base Rating: %.2f \n", item.Base.SourceRating)
PrintSetWidth(item.Base.Description, "\t ", "\n", 80)
fmt.Println("")
}
func (item MovieListElement) wasFinished() bool {
return item.Base.WasViewed
}
func (item MovieListElement) wasRemoved() bool {
return item.Base.WasRemoved
}
func (item MovieListElement) updateRating() ListElement {
newItem := determineAppropriateSource(item.Base.URL)(item.Base.URL)
item.Base.SourceRating = newItem.getListElementFields().SourceRating
item.Base.HeuristicRating = newItem.rateElement()
item.Base.IsRated = true
return item.saveElement()
}
func (item MovieListElement) saveElement() ListElement {
db := getDatabase()
//NOTE: this is prone to breaking
if db.NewRecord(item) {
db.Create(&item)
} else {
db.Save(&item)
}
return item
}
func (item MovieListElement) saveOrderedList(list OrderedList) {
db := getDatabase()
for _, element := range list {
listEntry := element.(MovieListElement)
db.Create(&listEntry)
}
}
func (item MovieListElement) load(derivedID int) ListElement {
db := getDatabase()
if derivedID == 0 {
return nil
}
db.First(&item, derivedID)
var BaseElement ListElementFields
tableName := item.getStoredName()
db.Where("owner_id = ? AND owner_type = ?", derivedID, tableName).Find(&BaseElement)
item.Base = BaseElement
return item
}
func (item MovieListElement) loadOrderedList() OrderedList {
db := getDatabase()
var MainList []MovieListElement
db.Find(&MainList)
InterfaceList := make([]ListElement, len(MainList))
for i, item := range MainList {
var BaseElement ListElementFields
tableName := item.getStoredName()
db.Where("owner_id = ? AND owner_type = ?", item.getDerivedID(), tableName).First(&BaseElement)
item.Base = BaseElement
InterfaceList[i] = item
}
RetVal := OrderedList(InterfaceList)
sort.Sort(sort.Reverse(RetVal))
return RetVal
}