Test Wikimedia Commons testcommonswiki https://test-commons.wikimedia.org/wiki/Main_Page MediaWiki 1.45.0-wmf.4 first-letter Media Special Talk User User talk Commons Commons talk File File talk MediaWiki MediaWiki talk Template Template talk Help Help talk Category Category talk Creator Creator talk TimedText TimedText talk Sequence Sequence talk Institution Institution talk Data Data talk TimedText TimedText talk Module Module talk Translations Translations talk Data:Chart Example Data.tab 486 2417 5003 4990 2025-06-04T15:48:04Z CCiufo-WMF 1354 5003 Tabular.JsonConfig application/json {"license":"CC0-1.0","description":{"en":"Some meaningless example data about Middle-Earth"},"schema":{"fields":[{"name":"a1","type":"string","title":{"en":"Date"}},{"name":"a2","type":"number","title":{"en":"Elves"}},{"name":"a3","type":"number","title":{"en":"Ents"}},{"name":"a4","type":"number","title":{"en":"Orcs"}},{"name":"a5","type":"number","title":{"en":"Hobbits"}},{"name":"a6","type":"number","title":{"en":"Trolls"}}]},"data":[["1993/09/09",25,37,8,8,10],["1993/09/14",36,33,8,10,11],["1993/09/20",35,35,6,11,11],["1993/09/25",30,37,8,10,13],["1993/09/26",31,36,7,11,13],["1993/09/26",28,34,7,12,15],["1993/09/30",25,39,6,12,17],["1993/10/02",26,38,8,12,14],["1993/10/08",22,37,8,12,18],["1993/10/16",22,40,7,13,16],["1993/10/19",21,39,6,14,17],["1993/10/22",18,43,7,14,18],["1993/10/22",16,44,7,12,19],["1993/10/25",16,41,1,13,18]]} iwh8bw9ma01n6ol6ipag0xz3axanubf Data:Example Line Chart.chart 486 2419 5011 4981 2025-06-04T17:30:36Z CCiufo-WMF 1354 5011 Chart.JsonConfig application/json {"license":"CC0-1.0","version":1,"type":"line","xAxis":{"title":{"en":"Date"}},"yAxis":{"title":{"en":"%support"}},"transform":{"module":"TabUtils","function":"select","args":{"cols":"a1,a2,a3"}},"source":"Chart Example Data.tab","title":{"en":"Sample Line Chart"}} oxe66c6521ygn9j227b3t3ivwva429w Module:TabUtils 828 2434 5004 2025-06-04T16:11:16Z Brooke Vibber (WMF) 1355 test 5004 Scribunto text/plain -- -- Experimental tabular data utilities for Chart transforms -- See https://www.mediawiki.org/wiki/Extension:Chart/Transforms -- local p = {} function colmap( tab ) local cols = {} for i, field in tab.schema.fields do cols[field.name] = i end return cols end -- -- Arguments: -- * select: comma-separated list of column names to keep, otherwise returns all cols -- * where: column name to match on, otherwise returns all rows -- * equals, gt, lt, gte, lte: value to compare against to keep rows -- function p.select( tab, args ) local map = colmap(tab) local where = nil if args.where then end if args.cols then local cols = mw.text.split( args.cols, ",", true ) local newfields = {} local newdata = {} for i, name in ipairs( cols ) do newfields[i] = tab.schema.fields[map[name]] end for n, row in ipairs( tab.data ) do local newrow = {} for i, name in ipairs( cols ) do newrow[i] = row[map[name]] end newdata[n] = newrow end tab.schema.fields = newfields tab.schema.data = newdata end return tab end function p.demo() local item = mw.ext.data.get("Data:Sample weekly temperature dataset.tab", "_") return mw.dumpObject(p.select, item, { ["cols"]="month,high" }) end return p ou2gwyldbynr5ycjazwjqcmkl5u0smv 5005 5004 2025-06-04T16:17:57Z Brooke Vibber (WMF) 1355 5005 Scribunto text/plain -- -- Experimental tabular data utilities for Chart transforms -- See https://www.mediawiki.org/wiki/Extension:Chart/Transforms -- local p = {} function colmap( tab ) local cols = {} for i, field in ipairs(tab.schema.fields) do cols[field.name] = i end return cols end -- -- Arguments: -- * select: comma-separated list of column names to keep, otherwise returns all cols -- * where: column name to match on, otherwise returns all rows -- * equals, gt, lt, gte, lte: value to compare against to keep rows -- function p.select( tab, args ) local map = colmap(tab) local where = nil if args.where then end if args.cols then local cols = mw.text.split( args.cols, ",", true ) local newfields = {} local newdata = {} for i, name in ipairs( cols ) do newfields[i] = tab.schema.fields[map[name]] end for n, row in ipairs( tab.data ) do local newrow = {} for i, name in ipairs( cols ) do newrow[i] = row[map[name]] end newdata[n] = newrow end tab.schema.fields = newfields tab.schema.data = newdata end return tab end function p.demo() local tab = mw.ext.data.get("Sample_weekly_temperature_dataset.tab", "_") --return mw.dumpObject(p.select(tab, { -- ["cols"]="month,high" --})) return mw.dumpObject({["hello"]="bar"}) end return p antum3pvpc3v63bcatkttw4l2vpef7m 5006 5005 2025-06-04T16:18:49Z Brooke Vibber (WMF) 1355 5006 Scribunto text/plain -- -- Experimental tabular data utilities for Chart transforms -- See https://www.mediawiki.org/wiki/Extension:Chart/Transforms -- local p = {} function colmap( tab ) local cols = {} for i, field in ipairs(tab.schema.fields) do cols[field.name] = i end return cols end -- -- Arguments: -- * select: comma-separated list of column names to keep, otherwise returns all cols -- * where: column name to match on, otherwise returns all rows -- * equals, gt, lt, gte, lte: value to compare against to keep rows -- function p.select( tab, args ) local map = colmap(tab) local where = nil if args.where then end if args.cols then local cols = mw.text.split( args.cols, ",", true ) local newfields = {} local newdata = {} for i, name in ipairs( cols ) do newfields[i] = tab.schema.fields[map[name]] end for n, row in ipairs( tab.data ) do local newrow = {} for i, name in ipairs( cols ) do newrow[i] = row[map[name]] end newdata[n] = newrow end tab.schema.fields = newfields tab.schema.data = newdata end return tab end function p.demo() --local tab = mw.ext.data.get("Sample_weekly_temperature_dataset.tab", "_") --return mw.dumpObject(p.select(tab, { -- ["cols"]="month,high" --})) --return mw.text.jsonEncode({["hello"]="bar"}) return "hello" end return p s83eiobgquh0kq5zhhqrw8agdtbdpwz 5007 5006 2025-06-04T16:21:25Z Brooke Vibber (WMF) 1355 wip 5007 Scribunto text/plain -- -- Experimental tabular data utilities for Chart transforms -- See https://www.mediawiki.org/wiki/Extension:Chart/Transforms -- local p = {} function colmap( tab ) local cols = {} for i, field in ipairs(tab.schema.fields) do cols[field.name] = i end return cols end -- -- Arguments: -- * select: comma-separated list of column names to keep, otherwise returns all cols -- * where: column name to match on, otherwise returns all rows -- * equals, gt, lt, gte, lte: value to compare against to keep rows -- function p.select( tab, args ) local map = colmap(tab) local where = nil if args.where then end if args.cols then local cols = mw.text.split( args.cols, ",", true ) local newfields = {} local newdata = {} for i, name in ipairs( cols ) do newfields[i] = tab.schema.fields[map[name]] end for n, row in ipairs( tab.data ) do local newrow = {} for i, name in ipairs( cols ) do newrow[i] = row[map[name]] end newdata[n] = newrow end tab.schema.fields = newfields tab.data = newdata end return tab end function p.demo() local tab = mw.ext.data.get("Sample_weekly_temperature_dataset.tab", "_") mw.logObject(p.select(tab, { ["cols"]="month,high" })) end return p g9vx414cm1pkrma4ikncwb91lpf6rix 5008 5007 2025-06-04T16:38:03Z Brooke Vibber (WMF) 1355 test 5008 Scribunto text/plain -- -- Experimental tabular data utilities for Chart transforms -- See https://www.mediawiki.org/wiki/Extension:Chart/Transforms -- local p = {} function colmap( tab ) local cols = {} for i, field in ipairs(tab.schema.fields) do cols[field.name] = i end return cols end -- -- Arguments: -- * select: comma-separated list of column names to keep, otherwise returns all cols -- * where: column name to match on, otherwise returns all rows -- * equals, ne, gt, lt, gte, lte: value to compare against to keep rows -- function p.select( tab, args ) local map = colmap(tab) local where = nil if args.where then local index = map[args.where] local field = tab.schema.fields[index] local function convert( val ) if field.type == "number" then return tonumber(val) elseif field.type == "localized" then error("todo: support localized fields") else return val end end local comparator if args.equals then local against = convert( args.equals ) comparator = function ( val ) return val == against end elseif args.ne then local against = convert( args.ne ) comparator = function ( val ) return val ~= against end elseif args.gt then local against = convert( args.gt ) comparator = function ( val ) return val > against end elseif args.lt then local against = convert( args.lt ) comparator = function ( val ) return val < against end elseif args.gte then local against = convert( args.gte ) comparator = function ( val ) return val >= against end elseif args.lte then local against = convert( args.lte ) comparator = function ( val ) return val <= against end else error("'where' must provide argument for 'equals', 'ne', 'gt', 'lt', 'gte', or 'lte'") end local newdata = {} for _, row in ipairs(tab.data) do if comparator( row[index] ) then table.insert(newdata, row) end end tab.data = newdata end if args.cols then local cols = mw.text.split( args.cols, ",", true ) local newfields = {} local newdata = {} for i, name in ipairs( cols ) do newfields[i] = tab.schema.fields[map[name]] end for n, row in ipairs( tab.data ) do local newrow = {} for i, name in ipairs( cols ) do newrow[i] = row[map[name]] end newdata[n] = newrow end tab.schema.fields = newfields tab.data = newdata end return tab end function p.demo() local tab = mw.ext.data.get("Sample_weekly_temperature_dataset.tab", "_") mw.logObject(p.select(tab, { ["cols"]="month,high", ["where"]="high", ["lt"]="25" })) end return p rw1qz8f6yb1hegtez52tl5esh5keyxi 5009 5008 2025-06-04T16:50:29Z Brooke Vibber (WMF) 1355 5009 Scribunto text/plain -- -- Experimental tabular data utilities for Chart transforms -- See https://www.mediawiki.org/wiki/Extension:Chart/Transforms -- local p = {} function colmap( tab ) local cols = {} for i, field in ipairs(tab.schema.fields) do cols[field.name] = i end return cols end -- -- select: subset a data set by column reference or comparison on row values -- -- Arguments: -- * cols: comma-separated list of column names to keep, otherwise returns all cols -- * where: column name to match on, otherwise returns all rows -- * equals, ne, gt, lt, gte, lte: value to compare against to keep rows -- function p.select( tab, args ) local map = colmap(tab) local where = nil if args.where then local index = map[args.where] local field = tab.schema.fields[index] local function convert( val ) if field.type == "number" then return tonumber(val) elseif field.type == "localized" then error("todo: support localized fields") else return val end end local comparator if args.equals then local against = convert( args.equals ) comparator = function ( val ) return val == against end elseif args.ne then local against = convert( args.ne ) comparator = function ( val ) return val ~= against end elseif args.gt then local against = convert( args.gt ) comparator = function ( val ) return val > against end elseif args.lt then local against = convert( args.lt ) comparator = function ( val ) return val < against end elseif args.gte then local against = convert( args.gte ) comparator = function ( val ) return val >= against end elseif args.lte then local against = convert( args.lte ) comparator = function ( val ) return val <= against end else error("'where' must provide argument for 'equals', 'ne', 'gt', 'lt', 'gte', or 'lte'") end local newdata = {} for _, row in ipairs(tab.data) do if comparator( row[index] ) then table.insert(newdata, row) end end tab.data = newdata end if args.cols then local cols = mw.text.split( args.cols, ",", true ) local newfields = {} local newdata = {} for i, name in ipairs( cols ) do newfields[i] = tab.schema.fields[map[name]] end for n, row in ipairs( tab.data ) do local newrow = {} for i, name in ipairs( cols ) do newrow[i] = row[map[name]] end newdata[n] = newrow end tab.schema.fields = newfields tab.data = newdata end return tab end function p.demo() local tab = mw.ext.data.get("Sample_weekly_temperature_dataset.tab", "_") mw.logObject(p.select(tab, { ["cols"]="month,high", ["where"]="high", ["lt"]="25" })) end return p pj5ji4war3qlxwnye20yq8atmcs6sg1 5010 5009 2025-06-04T16:53:47Z Brooke Vibber (WMF) 1355 5010 Scribunto text/plain -- -- Experimental tabular data utilities for Chart transforms -- See https://www.mediawiki.org/wiki/Extension:Chart/Transforms -- local p = {} function colmap( tab ) local cols = {} for i, field in ipairs( tab.schema.fields ) do cols[field.name] = i end return cols end -- -- select: subset a data set by column reference or comparison on row values -- -- Arguments: -- * cols: comma-separated list of column names to keep, otherwise returns all cols -- * where: column name to match on, otherwise returns all rows -- * equals, ne, gt, lt, gte, lte: value to compare against to keep rows -- function p.select( tab, args ) local map = colmap( tab ) local where = nil if args.where then local index = map[args.where] local field = tab.schema.fields[index] local function convert( val ) if field.type == "number" then return tonumber( val ) elseif field.type == "localized" then error( "todo: support localized fields" ) else return val end end local comparator if args.equals then local against = convert( args.equals ) comparator = function ( val ) return val == against end elseif args.ne then local against = convert( args.ne ) comparator = function ( val ) return val ~= against end elseif args.gt then local against = convert( args.gt ) comparator = function ( val ) return val > against end elseif args.lt then local against = convert( args.lt ) comparator = function ( val ) return val < against end elseif args.gte then local against = convert( args.gte ) comparator = function ( val ) return val >= against end elseif args.lte then local against = convert( args.lte ) comparator = function ( val ) return val <= against end else error( "'where' must provide argument for 'equals', 'ne', 'gt', 'lt', 'gte', or 'lte'" ) end local newdata = {} for _, row in ipairs( tab.data ) do if comparator( row[index] ) then table.insert( newdata, row ) end end tab.data = newdata end if args.cols then local cols = mw.text.split( args.cols, ",", true ) local newfields = {} local newdata = {} for i, name in ipairs( cols ) do table.insert( newfields, tab.schema.fields[map[name]] ) end for n, row in ipairs( tab.data ) do local newrow = {} for i, name in ipairs( cols ) do table.insert( newrow, row[map[name]] ) end newdata[n] = newrow end tab.schema.fields = newfields tab.data = newdata end return tab end function p.demo() local tab = mw.ext.data.get( "Sample_weekly_temperature_dataset.tab", "_" ) mw.logObject( p.select( tab, { ["cols"] = "month,high", ["where"] = "high", ["lt"] = "25" })) end return p qv2duvkd9287ot192sxckbryj57xc7g