From d9e4af3356b2862f135546265fc08013f270cc7a Mon Sep 17 00:00:00 2001 From: Peter Eliasson Date: Mon, 9 Feb 2015 20:38:16 +0100 Subject: [PATCH] Implemented purging of old parses. --- src/highscore.lua | 101 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 75 insertions(+), 26 deletions(-) diff --git a/src/highscore.lua b/src/highscore.lua index 638128e..6932442 100644 --- a/src/highscore.lua +++ b/src/highscore.lua @@ -13,6 +13,7 @@ local addonName, addonTable = ... -- Global functions for faster access local tinsert = tinsert; local tContains = tContains; +local tremove = tremove; local sort = sort; local random = random; local format = format; @@ -99,6 +100,50 @@ local TRACKED_ZONE_IDS = { 988 -- Blackrock Foundry } +-- Function that returns a list of keys in `parses` for the top +-- `numParses` for each player and role combination in `parses`. +local function getBestParsesForPlayers(parses, groupParses, numParses) + local bestParses = { + ["DAMAGER"] = {}, + ["TANK"] = {}, + ["HEALER"] = {} + } + + for key, parse in ipairs(parses) do + local playerId = parse.playerId; + local role = parse.role; + local duration = groupParses[parse["groupParseId"]].duration; + local amount = parse.damage and (parse.damage / duration) or (parse.healing / duration); + + if not bestParses[role][playerId] then + bestParses[role][playerId] = {}; + end + + if #bestParses[role][playerId] < numParses then + tinsert(bestParses[role][playerId], {key = key, amount = amount}); + elseif numParses > 0 then + -- Sort so that the lowest amount is first element + sort(bestParses[role][playerId], function(a, b) + return a.amount < b.amount; + end); + -- Replace first element if current is higher + if bestParses[role][playerId][1].amount < amount then + bestParses[role][playerId][1] = {key = key, amount = amount}; + end + end + end + + local bestParsesKeys = {}; + for _, roleData in pairs(bestParses) do + for _, playerData in pairs(roleData) do + for _, parse in pairs(playerData) do + tinsert(bestParsesKeys, parse.key); + end + end + end + + return bestParsesKeys; +end -- Function for convering a database representation of -- a parse to a parse that can be returned to users. @@ -141,7 +186,7 @@ local function generateRandomKey() return format("%x-%x-%x", r1, r2, r3); end -local function addGroupParse(db, startTime, duration) +local function addGroupParse(db, startTime, duration, guildName, zoneId, difficultyId, encounterId) -- Find a new unique key for the raid parse local key = generateRandomKey(); while db.groupParses[key] do @@ -149,8 +194,12 @@ local function addGroupParse(db, startTime, duration) end db.groupParses[key] = { - startTime = startTime, - duration = duration + startTime = startTime, + duration = duration, + guildName = guildName, + zoneId = zoneId, + difficultyId = difficultyId, + encounterId = encounterId }; return key @@ -235,7 +284,8 @@ function highscore:AddEncounterParsesForPlayers(guildName, encounter, players) addEncounter(self.db, encounterId, encounterName); -- Add a group parse entry, holding data shared between all players - local groupParseId = addGroupParse(self.db, startTime, duration); + local groupParseId = addGroupParse(self.db, startTime, duration, + guildName, zoneId, difficultyId, encounterId); local parsesTable = getParsesTable(self.db, guildName, zoneId, difficultyId, encounterId); @@ -377,49 +427,48 @@ end -- Removes parses that is older than "olderThanDate". If minParsesPerPlayer -- is > 0, that many parses will be kept for the player/encounter combination. function highscore:PurgeParses(olderThanDate, minParsesPerPlayer) + local db = addon.db.realm.modules["highscore"]; local oldGroupParseIds = {}; - for id, groupParse in pairs(self.db.groupParses) do + for id, groupParse in pairs(db.groupParses) do if groupParse.startTime < olderThanDate then tinsert(oldGroupParseIds, id); end end for _, id in ipairs(oldGroupParseIds) do - local groupParse = self.db.groupParses[id]; + local groupParse = db.groupParses[id]; local guildName = groupParse.guildName; local zoneId = groupParse.zoneId; local difficultyId = groupParse.difficultyId; local encounterId = groupParse.encounterId; - self.db.groupParses[id] = nil; - local parses = getParsesTable(self.db, guildName, zoneId, difficultyId, encounterId); + local parses = getParsesTable(db, guildName, zoneId, difficultyId, encounterId); + local allRemoved = true; if minParsesPerPlayer == 0 then - for key, parse in pairs(parses) do + for i = #parses, 1, -1 do + local parse = parses[i] if parse.groupParseId == id then - parses[key] = nil; + tremove(parses, i); end end else - - end - - if next(parses) == nil then - self:Debug("All parses removed for", guildName, zoneId, difficultyId, encounterId); - self.db.guilds[guildName].zones[zoneId].difficulties[difficultyId].encounters[encounterId] = nil; - end - - if next(self.db.guilds[guildName].zones[zoneId].difficulties[difficultyId].encounters) == nil then - self.db.guilds[guildName].zones[zoneId].difficulties[difficultyId] = nil; - end - - if next(self.db.guilds[guildName].zones[zoneId].difficulties) == nil then - self.db.guilds[guildName].zones[zoneId] = nil; + local bestParsesKeys = getBestParsesForPlayers(parses, db.groupParses, minParsesPerPlayer); + for i = #parses, 1, -1 do + local parse = parses[i] + if parse.groupParseId == id then + if tContains(bestParsesKeys, i) then + allRemoved = false; + else + tremove(parses, i); + end + end + end end - if next(self.db.guilds[guildName].zones) then - self.db.guilds[guildName] = nil; + if allRemoved then + db.groupParses[id] = nil; end end end -- 1.7.9.5