Module:PersonResearchOutcomesList: Difference between revisions
From MaRDI portal
No edit summary |
No edit summary |
||
Line 84: | Line 84: | ||
-- Convert the JSON results into a Lua table | -- Convert the JSON results into a Lua table | ||
local fieldOrder = {"workUrl", "workLabel", "work", "publication_date", "qid"} | local fieldOrder = {"workUrl", "workLabel", "work", "publication_date", "qid", "item_type"} | ||
local dataTable = helper.convertJsonToTableOrdered(jsonResults, fieldOrder) | local dataTable = helper.convertJsonToTableOrdered(jsonResults, fieldOrder) | ||
-- Create and return HTML table from the data | -- Create and return HTML table from the data | ||
local headers = {"Publication", "Date of Publication"} | local headers = {"Publication", "Date of Publication", "Type"} | ||
local htmlTable = helper.createHtmlTableWithMergedCols(dataTable, headers, {{1, 2}, {4}}) | local htmlTable = helper.createHtmlTableWithMergedCols(dataTable, headers, {{1, 2}, {4}, {6}}) | ||
-- Generate histogram data | -- Generate histogram data |
Revision as of 11:39, 13 March 2024
Documentation for this module may be created at Module:PersonResearchOutcomesList/doc
-- Required module containing helper methods
local helper = require('Module:HelperMethods')
-- Required modules for SPARQL queries and HTML table generation
local sparql = require('SPARQL')
local mwHtml = require('mw.html')
-- Main table to hold all functions
local p = {}
-- Function to build a HTML table from SPARQL query results
function p.buildTableFromSparql(frame)
-- Retrieve target1 from frame arguments or return error message if not set
local target1 = frame.args[1]
if not target1 or target1 == '' then
return "No records found"
end
local height = frame.args[2] or '400px' -- Default height if not specified
local width = frame.args[3] or '800px' -- Default width if not specified
-- Get the current URL
local baseUrl = mw.site.server
-- Constructing the SPARQL query with dynamic entity target1
local sparqlQuery = [[
PREFIX target1: <https://portal.mardi4nfdi.de/entity/]] .. target1 .. [[>
PREFIX wdt: <https://portal.mardi4nfdi.de/prop/direct/>
PREFIX wd: <https://portal.mardi4nfdi.de/entity/>
SELECT
?publication_date ?work ?workLabel
(CONCAT("]] .. baseUrl .. [[/wiki/Publication:", REPLACE(STR(?work), "^.*/Q", "")) AS ?workUrl)
(REPLACE(STR(?work), "^.*/", "") AS ?qid)
?item_type
WHERE {
?work wdt:P16 target1: .
VALUES ?allowedValues { wd:Q5976449 wd:Q5976450 }
?work wdt:P1460 ?allowedValues.
OPTIONAL {
?work wdt:P28 ?publication_datetime .
BIND(xsd:date(?publication_datetime) AS ?publication_date)
}
OPTIONAL {
?work wdt:P1460 ?item_type .
}
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}
ORDER BY DESC(?publication_date)
]]
-- Executing the SPARQL query and retrieving results in JSON format
-- mw.log( sparqlQuery )
local jsonResults = sparql.runQuery(sparqlQuery)
-- mw.logObject(jsonResults)
-- Handle error in SPARQL query execution
if jsonResults and jsonResults.error then
mw.log("Error in SPARQL query: " .. tostring(jsonResults.error))
return nil
end
if not jsonResults then
return "Could not fetch data."
end
if helper.countElementsInBindings(jsonResults.results.bindings) == 0 then
return "No records found."
end
-- Extracting headers from the SPARQL query results
-- local headers = {}
-- if jsonResults and jsonResults.head and jsonResults.head.vars then
-- headers = jsonResults.head.vars
-- end
-- Convert the JSON results into a Lua table
local fieldOrder = {"workUrl", "workLabel", "work", "publication_date", "qid", "item_type"}
local dataTable = helper.convertJsonToTableOrdered(jsonResults, fieldOrder)
-- Create and return HTML table from the data
local headers = {"Publication", "Date of Publication", "Type"}
local htmlTable = helper.createHtmlTableWithMergedCols(dataTable, headers, {{1, 2}, {4}, {6}})
-- Generate histogram data
local histogramChart = helper.generateHistogramChartFromTable(dataTable, 4)
local histogramChartJson = mw.text.jsonEncode(histogramChart)
-- mw.log(histogramDataJson)
-- Create a parent container for both the table and the chart
local parentContainer = mw.html.create('div')
:addClass('parent-container')
:css('width', width) -- Set the width as needed
-- Create chart container
local chartContainer = mw.html.create('div')
:addClass('wikiChartContainer')
:css('height', height)
:css('width', width)
:attr('data-chartdata', histogramChartJson)
local heading = mw.html.create('h2')
:wikitext('Publications over time')
-- Add the table and chart to the parent container
parentContainer
:node(htmlTable)
:node(heading)
:node(chartContainer)
return tostring(parentContainer)
end
-- Return the created html table
return p