Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 23 additions & 21 deletions lua/wikis/commons/Infobox/Extension/PlacementStats.lua
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,18 @@
local Lua = require('Module:Lua')

local Abbreviation = Lua.import('Module:Abbreviation')
local Array = Lua.import('Module:Array')
local Class = Lua.import('Module:Class')
local Medals = Lua.import('Module:Medals')
local Opponent = Lua.import('Module:Opponent/Custom')
local TeamTemplate = Lua.import('Module:TeamTemplate')
local Tier = Lua.import('Module:Tier/Custom')

local Opponent = Lua.import('Module:Opponent/Custom')
local Condition = Lua.import('Module:Condition')
local ConditionTree = Condition.Tree
local ConditionNode = Condition.Node
local Comparator = Condition.Comparator
local BooleanOperator = Condition.BooleanOperator
local ConditionUtil = Condition.Util

local DEFAULT_TIERS = {'1', '2', '3'}
local DEFAULT_EXCLUDED_TIER_TYPES = {'Qualifier'}
Expand Down Expand Up @@ -47,7 +52,7 @@ function PlacementStats.run(args)
end

---Query the count values
---@param opponentType string
---@param opponentType OpponentType
---@param opponent string
---@param tiers string[]
---@param excludedTierTypes string[]
Expand All @@ -64,50 +69,47 @@ function PlacementStats._fetchData(opponentType, opponent, tiers, excludedTierTy
end

---Builds the base conditions for the queries
---@param opponentType string
---@param opponentType OpponentType
---@param opponent string
---@param excludedTierTypes string[]
---@return string
---@return ConditionTree
function PlacementStats._buildConditions(opponentType, opponent, excludedTierTypes)
local conditions = {
'[[placement::!]]',
'[[opponenttype::' .. opponentType .. ']]'
local conditions = ConditionTree(BooleanOperator.all):add{
ConditionNode('placement', Comparator.neq, ''),
ConditionNode('opponenttype', Comparator.eq, opponentType),
}

for _, excludedTierType in pairs(excludedTierTypes) do
table.insert(conditions, '[[liquipediatiertype::!' .. excludedTierType .. ']]')
end
conditions:add(ConditionUtil.noneOf('liquipediatiertype', excludedTierTypes))

if opponentType ~= Opponent.team then
table.insert(conditions, '[[opponentname::' .. opponent .. ']]')
conditions:add(ConditionNode('opponentname', Comparator.eq, opponent))
else
local rawOpponentTemplate = TeamTemplate.getRawOrNil(opponent) or {}
local opponentTemplate = rawOpponentTemplate.historicaltemplate or rawOpponentTemplate.templatename
if not opponentTemplate then
error('Missing team template for team: ' .. opponent)
error(TeamTemplate.noTeamMessage(opponent))
end

local teamTemplates = TeamTemplate.queryHistoricalNames(opponentTemplate)
local opponentConditions = Array.map(teamTemplates, function(teamTemplate)
return '[[opponenttemplate::' .. teamTemplate .. ']]'
end)

table.insert(conditions, '(' .. table.concat(opponentConditions, ' OR ') .. ')')
conditions:add(ConditionUtil.anyOf('opponenttemplate', teamTemplates))
end

return table.concat(conditions, ' AND ')
return conditions
end

---Fetches the placement count values for a given tier
---@param tier string
---@param baseConditions string
---@param baseConditions ConditionTree
---@param placementData InfoboxPlacementStatsData
function PlacementStats._fetchForTier(tier, baseConditions, placementData)
placementData.tiers[tier] = {top3 = 0, all = 0, placement = {}}

local queryData = mw.ext.LiquipediaDB.lpdb('placement', {
limit = 5000,
conditions = baseConditions .. ' AND [[liquipediatier::' .. tier .. ']]',
conditions = tostring(ConditionTree(BooleanOperator.all):add{
baseConditions,
ConditionNode('liquipediatier', Comparator.eq, tier),
}),
query = 'placement, count::placement',
groupby = 'placement asc'
})
Expand Down
Loading