Module:CargoQuery
This module is taken from Leaguepedia's CargoQuery module.
This module lets you get around the |no html bug that Cargo has by avoiding |format=template. This module implicitly assumed you ARE using named args in your template (corresponding to |named_args=yes; you do not need to specify this.)
Unlike |format=template, this wrapper will NOT rename parameters with underscores in them to use spaces instead.
Parameters
- You may specify all parameters the same as if they were parameters in
#cargo_query.
One-To-Many
This template allows for one-to-many support, allowing you to specify a field to treat equivalently to a List of ... field. Syntax is as follows:
|one_to_many=, a list of fields you want concatenated together.|one_to_many_group=, the thing you want our one-to-many values grouped by. UNLIKE the|group by=parameter, this should be the FINAL name of a field, so something on the RIGHT SIDE of the equals sign in your|fields=parameter.|one_to_many_sep=, defaults to comma. Currently you must pick the same separator for all of your one-to-many fields.
Example
{{#invoke:CargoQuery|main
|table=Teams,ListplayerCurrent=LPC
|join on=Teams._pageName=LPC._pageName
|where=Teams.Region="North America" AND LPC._pageName IS NOT NULL
|fields=Teams._pageName=Page
|one_to_many=LPC.ID=IDs
|one_to_many_group=Page
|one_to_many_sep=,
|template=<template>
|intro={{(!}} class="wikitable"
|outro={{!)}}
|limit=10
}}
Here, the one_to_many is a list of players on the team in question. For each ONE team, there are MANY players, so the field IDs that's sent to the template is a comma-separated list of players, grouped by team page.
Compound Queries
You can also run compound queries using compound. It has the same syntax as #cargo_compound_query but with a few exceptions:
defaultfor each individual query is disabled; default must be specified outside as an additional argument, which is then applied if no queries return results.- Each query must be numbered as in
|1=(query1)|2=(query2)|3=..., etc. - Because of how compound query uses
;as a separator, strings with this character cannot be used. This can be worked around by specifyingmetaseparatorto be another symbol, and splitting each query's arguments using that delimiter instead.
Example
{{#invoke:CargoQuery|compound
|1=table=Food=F
;fields=F._pageName=Page
;where=F.CookEffect HOLDS 'heat and fire-based' AND F._pageNamespace = '0'
|2=table=Liquids=L
;fields=L._pageName=Page
;where=L.CookEffect HOLDS 'simple heat and fire-based' AND L._pageNamespace = '0'
|default=No Results!
|template=favilink page
|delimiter = <br>
|metaseparator = ;
}}
local p = {}
function p.main(frame)
local args = frame
if frame == mw.getCurrentFrame() then
args = require('Module:ProcessArgs').merge(true)
else
frame = mw.getCurrentFrame()
end
local query = {}
for k, v in pairs(args) do
if string.sub(k, 0, 2) == 'q?' then
query[string.sub(k, 3)] = v
end
end
local result = mw.ext.cargo.query(query.tables, query.fields, query)
if not next(result) then
return frame:preprocess(args.default or '')
end
local tbl = {}
for _, row in ipairs(result) do
tbl[#tbl+1] = frame:expandTemplate{ title = args.template, args = row }
end
local intro = frame:preprocess(args.intro or '')
local outro = frame:preprocess(args.outro or '')
return intro .. table.concat(tbl,args.delimiter or '') .. outro
end
return p