Module:Musician tour stats

From SPCodex, The Smashing Pumpkins wiki

Documentation for this module may be created at Module:Musician tour stats/doc

local p = {}
local cargo = mw.ext.cargo

local function fetchShow(artist, firstShow)
	local order = 'ASC'
	if firstShow == false then
		order = 'DESC'
	end
	return cargo.query(
		'shows',
		'shows._pageName=page_name, shows.artist=artist, shows.featuring_artist=featuring_artist, ' ..
			'shows.date=date, shows.venue=venue, shows.location=location, ',
		{
			where = 'lineup HOLDS "' .. artist .. '"',
			orderBy = 'date ' .. order,
			limit = 1
		}
	)
end

local function createRowForShow(ulRoot, data, label)
	local showRow = ulRoot:tag('li')
	showRow:tag('b'):wikitext(label .. ': ')
	local showStr = '[[' .. data['page_name'] .. '|' .. data['artist'] .. ' ' .. data['date'] .. ']] '
	if data['featuring_artist'] ~= nil and data['featuring_artist'] ~= data['artist'] then
		mw.logObject(data)
		showStr = showStr .. '(featuring [[' .. data['featuring_artist'] .. ']]) '
	end
	if data['venue'] ~= nil then
		showStr = showStr .. 'at ' .. data['venue']
		if data['location'] ~= '' then
			showStr = showStr .. ', '
		else
			showStr = showStr .. ' '
		end
	end
	if data['location'] ~= '' then
		showStr = showStr .. data['location']
	end

	showRow:tag('span'):wikitext(showStr)
end

function p._tour_stats(artist)
	local root = mw.html.create()

	local counts = cargo.query(
		'shows',
		"COUNT(_ID)=total",
		{ where = 'lineup HOLDS "' .. artist .. '"' }
	)[1]

	if counts['total'] == '0' then
		return ''
	end

	local statsRoot = root:tag('ul')

	-- Totals
	local totalShows = tonumber(counts['total'])
	local totalsRow = statsRoot:tag('li')
	totalsRow:tag('b'):wikitext('Total shows: ')
	local totalsStr = "[https://spcodex.wiki/wiki/Special:CargoQuery?title=Special%3ACargoQuery&tables=shows%2C+live_show_photos%2C+live_show_videos&fields=shows._pageName%3Dpage_name%2C+shows.date%3Ddate%2C+shows.artist%3Dartist%2C+shows.featuring_artist%3Dfeaturing_artist%2C+shows.venue%3Dvenue%2C+shows.location%3Dlocation%2C+shows.festival%3Dfestival%2C+shows.notes%3Dnotes%2C+IF%28live_show_photos._pageName+IS+NULL+AND+shows.poster+IS+NULL%2C+%27%27%2C+%271%27%29%3Dphotos%2C+live_show_videos._ID%3Dvideo&where=shows.lineup+HOLDS+%22"
		.. mw.uri.encode(artist) .. "%22&join_on=shows._pageName%3Dlive_show_photos._pageName%2C+shows._pageName%3Dlive_show_videos._pageName&group_by=shows._pageName&having=&order_by%5B0%5D=shows.date+ASC&order_by_options%5B0%5D=ASC&limit=1000&offset=&format=template&template=Live+show+row&named+args=yes&delimiter= " .. totalShows .. " shows]"
	totalsRow:tag('span')
		:addClass('plainlinks')
		:wikitext(totalsStr)

	-- First show
	local firstShow = fetchShow(artist, true)[1]
	createRowForShow(statsRoot, firstShow, 'First performance')

	-- Last show
	local lastShow = fetchShow(artist, false)[1]
	createRowForShow(statsRoot, lastShow, 'Last performance')

	return '== Touring stats ==\n' .. tostring(root)
end

function p.tour_stats(frame)
	local artist = frame.args[1]
	return p._tour_stats(artist)
end

return p