Module:Availability

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

local function pairsByKeys (t, f)	local a = {} for n in pairs(t) do table.insert(a, n) end table.sort(a, f)	local i = 0     -- iterator variable local iter = function   -- iterator function i = i + 1 if a[i] == nil then return nil else return a[i], t[a[i]] end end return iter end

local function dateFormat(str, precision) if precision == '2' then return string.sub(str, 0, -3) .. 'XX' elseif precision == '3' then return string.sub(str, 0, -6) .. 'XX-XX' else return str end end

local function typeFormat(str) local ret = ''

for t in string.gmatch(str, "[^,]+") do		if t == 'ep' then t = 'EP' else t = t:gsub("^%l", string.upper) end

ret = ret .. t .. ' &bull; ' end if string.sub(ret, -8) == ' &bull; ' then ret = string.sub(ret, 0, -9) end

return ret end

function p._main(song) local albums = cargo.query(		'track_listings, albums, releases',		"track_listings._pageName=title, releases.release_date=date, release_date__precision=precision, albums.type=type, track_listings.listing_id=listing_id, headline",		{			where = "releases.release_date != '' AND song_page_title = \"" .. song .. '"',			join = 'track_listings._pageName=albums._pageName,albums.name=releases._pageName',			groupBy = 'track_listings.work',			orderBy = 'releases.release_date ASC'		}	) local songs = cargo.query(		'track_listings, songs, releases',		"track_listings._pageName=title, releases.release_date=date, release_date__precision=precision, songs.type=type, track_listings.listing_id=listing_id, headline",		{			where = "releases.release_date != '' AND song_page_title = \"" .. song .. '"',			join = 'track_listings._pageName=songs._pageName,songs.name=releases.work',			groupBy = 'track_listings.work',			orderBy = 'releases.release_date ASC'		}	)

local releasesByDate = {} local has_headline = false

for r = 1, #songs do releasesByDate[songs[r]['date'] .. r] = songs[r] if songs[r]['headline'] ~= '' then has_headline = true end end for r = 1, #albums do releasesByDate[albums[r]['date'] .. r] = albums[r] if albums[r]['headline'] ~= '' then has_headline = true end end

local has_result = false local root = mw.html.create local tableRoot = root:tag('table') tableRoot:addClass('wikitable sortable') local headerRow = tableRoot:tag('tr') headerRow:tag('th') :addClass('headerSort') :wikitext('Title') if has_headline then headerRow:tag('th') :wikitext('Notes') end -- headerRow:tag('th') -- 	:addClass('headerSort') -- 	:wikitext('Release date') headerRow:tag('th') :addClass('headerSort') :wikitext('Type')

for _date, release in pairsByKeys(releasesByDate) do		has_result = true local row = tableRoot:tag('tr') row:tag('td'):wikitext( .. release['title'] .. )

if has_headline then row:tag('td'):wikitext(release['headline']) end

-- row:tag('td'):wikitext(dateFormat(release['date'], release['precision'])) row:tag('td'):wikitext(typeFormat(release['type'])) end

if has_result then return '== Availability ==\n' .. tostring(root) end

return '' end

function p.main(frame) local song = frame.args[1] return p._main(song) end

function p._tour_history(song) local root = mw.html.create

local counts = cargo.query(		'live_songs, shows',		"COUNT(DISTINCT live_songs._pageName)=Count, shows.artist=Artist",		{			where = 'live_songs.name = "' .. song .. '"',			join = 'live_songs._pageName = shows._pageName',			groupBy = 'shows.artist',			orderBy = 'Count DESC'		}	)

if next(counts) == nil then return '' end

local statsRoot = root:tag('table') statsRoot:addClass('wikitable') local totalsRow = statsRoot:tag('tr') totalsRow:tag('th'):wikitext('Total plays')

local total_plays = 0 local total_plays_artists = {} if #counts == 1 then total_plays = counts[1]['Count'] else total_plays_str = '('		for r = 1, #counts do			total_plays = total_plays + counts[r]['Count']			table.insert(total_plays_artists, '' .. counts[r]['Artist'] .. ': ' .. counts[r]['Count'])		end	end

local totalsTd = totalsRow:tag('td') totalsTd:tag('b'):wikitext(total_plays) if next(totalsTd) ~= nil then totalsTd:wikitext(' (' .. table.concat(total_plays_artists, ', ') .. ')')	end

local firstShow = cargo.query(		'live_songs, shows',		'shows._pageName, shows.artist, shows.featuring_artist, shows.date, shows.venue, shows.location, live_songs.tease, live_songs.abandoned',		{			where = 'name = "' .. song .. '" AND soundcheck = 0',			join = 'live_songs._pageName = shows._pageName',			groupBy = '_pageName',			orderBy = 'date ASC',			limit = 1		}	)[1] local lastShow = cargo.query(		'live_songs, shows',		'shows._pageName, shows.artist, shows.featuring_artist, shows.date, shows.venue, shows.location, live_songs.tease, live_songs.abandoned',		{			where = 'name = "' .. song .. '" AND soundcheck = 0',			join = 'live_songs._pageName = shows._pageName',			groupBy = '_pageName',			orderBy = 'date DESC',			limit = 1		}	)[1]

local firstShowRow = statsRoot:tag('tr') firstShowRow:tag('th'):wikitext('First performance') mw.logObject(firstShow) local firstShowStr =  .. firstShow['shows._pageName'] ..  if firstShow['featuring_artist'] then firstShowStr = firstShowStr .. '(featuring ' .. firstShow['featuring_artist'] .. ') ' end if firstShow['tease'] == '1' then firstShowStr = firstShowStr .. '(tease) ' end if firstShow['abandoned'] == '1' then firstShowStr = firstShowStr .. '(abandoned) ' end firstShowRow:tag('td'):wikitext(firstShowStr)

--- [First full performance (if it was teased or abandoned, e.g. [[Sunshine of Your Love") ---

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

return p