-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUpdateGamesMeta.py
153 lines (119 loc) · 5.23 KB
/
UpdateGamesMeta.py
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#######################################################################
# UpdateGamesMeta
# Updates the Games_meta collection
#######################################################################
import sys
import functools
from Mongo import Mongo
from Shared import settings, hasTestArgs
import math
import Helpers
import collections
from Helpers import objectKeyFromDotString
class UpdateGamesMeta:
def __init__(self, mongo):
self.logger = Helpers.Logger(__class__.__name__, Helpers.mongoLogColor)
self.mongo = mongo
def start(self):
self.updateTagsRecord()
self.updatePopularityIntervals()
self.updateReleaseYears()
def sortFunc(self, tagPairA, tagPairB):
if tagPairA[1] == tagPairB[1]:
return -1 if tagPairA[0] < tagPairB[0] else 1
return 1 if tagPairA[1] < tagPairB[1] else -1
def updateTagsRecord(self):
self.logger.log("Updating Tags record...")
results = self.mongo.collection_games.find({}, projection={settings.gamesMeta.db_keys.tags: True})
tagPairs = {}
for result in results:
for tag in result[settings.gamesMeta.db_keys.tags]:
if tag in tagPairs:
tagPairs[tag] = tagPairs[tag] + 1
else:
tagPairs[tag] = 1
tagPairsArray = []
for key in tagPairs:
tagPairsArray.append((str(key), int(tagPairs[key])))
tagPairsArray.sort(key=functools.cmp_to_key(self.sortFunc))
self.logger.log("Found " + str(len(tagPairsArray)) + " unique tags")
entries = []
for item in tagPairsArray:
entries.append({
"name": item[0],
"count": item[1]
})
self.logger.log("Updating database...")
self.mongo.collection_games_meta.update_one({'_id': settings.gamesMeta.db_keys.tags}, {'$set': {settings.gamesMeta.db_keys.tags: entries}}, upsert=True)
self.logger.log("Done")
def updatePopularityIntervals(self):
self.logger.log("Updating Popularity intervals...")
POPULARITY_FIELD = 'lookupBlob.userRating.ratingCount'
results = self.mongo.collection_games.find({}, projection={POPULARITY_FIELD: True})
MIN_POPULARITY = 5
countAll = 0
countMinOrMore = 0
allCounts = []
tallies = {}
for result in results:
pop = result['lookupBlob']['userRating']['ratingCount']
if pop >= MIN_POPULARITY:
countMinOrMore += 1
countAll += 1
allCounts.append(pop)
if not pop in tallies:
tallies[pop] = 0
tallies[pop] += 1
tallies = collections.OrderedDict(sorted(tallies.items()))
buckets = [(MIN_POPULARITY,0)]
countLeft = countMinOrMore
for key in tallies:
divisor = 100 - len(buckets)
maxBucketCount = countLeft / divisor if divisor > 0 else countAll
if key < MIN_POPULARITY:
continue
val = tallies[key]
if buckets[-1][1] >= maxBucketCount:
buckets.append( (key, 0) )
countLeft -= val
buckets[-1] = (buckets[-1][0], buckets[-1][1] + val)
bucketIndex = 1
for bucket in buckets:
self.logger.log(str(bucketIndex) + ":" + str(bucket))
bucketIndex += 1
intervals = []
for bucket in buckets:
intervals.append(bucket[0])
self.logger.log("Processed " + str(len(intervals)) + " intervals")
self.logger.log("Updating database...")
self.mongo.collection_games_meta.update_one({'_id': settings.gamesMeta.db_keys.popularity_intervals}, {'$set': {settings.gamesMeta.db_keys.popularity_intervals: intervals}}, upsert=True)
self.logger.log("Done")
def updateReleaseYears(self):
self.logger.log("Updating release years...")
FIELD = 'lookupBlob.releaseDate'
results = self.mongo.collection_games.find({}, projection={FIELD: True})
SANITY_MIN = 2000
SANITY_MAX = 2050
minYear = 3000
maxYear = 0
for result in results:
releaseDate = objectKeyFromDotString(result, FIELD)
if len(releaseDate) > 4:
year = int(releaseDate[0:4])
if year > SANITY_MIN and year < SANITY_MAX:
if year < minYear:
minYear = year
elif year > maxYear:
maxYear = year
if not (minYear > SANITY_MIN and minYear < SANITY_MAX and maxYear > minYear and maxYear < SANITY_MAX):
self.logger.log("Years didn't parse sanity check. min:" + str(minYear) + ", max:" + str(maxYear))
sys.exit(1)
self.logger.log("Range: " + str(minYear) + " to " + str(maxYear));
self.logger.log("Updating database...")
entries = [minYear, maxYear]
self.mongo.collection_games_meta.update_one({'_id': settings.gamesMeta.db_keys.releaseYears}, {'$set': {settings.gamesMeta.db_keys.releaseYears: entries}}, upsert=True)
self.logger.log("Done")
if __name__ == '__main__':
mongo = Mongo()
mongo.connect(hasTestArgs(sys.argv))
UpdateGamesMeta(mongo).start()