Progress
From KIproBatt Wiki
Simon Stier (talk | contribs) (import from DevWiki) |
Simon Stier (talk | contribs) (fix dimension, query for final process outputs) |
||
Line 4: | Line 4: | ||
function p.GetProcessesGraph() | function p.GetProcessesGraph() | ||
− | local process_types = {"LabProcess:OSL9a645a64b15442398ad3c057e1b64d87", "LabProcess:OSL4c1f7444e389471a8250f53407191735"} | + | local process_types = {"LabProcess:OSL9a645a64b15442398ad3c057e1b64d87", "LabProcess:OSL4c1f7444e389471a8250f53407191735", "LabProcess:OSLd0c734a239844a0d8820856add12aeca"} |
local result = p.GetProcesses(process_types) | local result = p.GetProcesses(process_types) | ||
--mw.logObject(result) | --mw.logObject(result) | ||
Line 19: | Line 19: | ||
local edges = "" | local edges = "" | ||
for obj_id, obj in pairs(process['objects']) do | for obj_id, obj in pairs(process['objects']) do | ||
− | nodes = nodes .. '"' .. obj_id .. '" [label="' .. obj['local_id'] .. '"];' | + | nodes = nodes .. '"' .. obj_id .. '" [label="' .. obj['local_id'] .. '" href="https://kiprobatt.de/wiki/' .. obj_id .. '"];' |
+ | local successors = nil | ||
if (obj['successor_object'] ~= nil) then | if (obj['successor_object'] ~= nil) then | ||
− | for succ_id, succ in pairs( | + | successors = p.NormalizePropertyValue(obj['successor_object']); |
+ | end | ||
+ | if (obj['successor_process_output'] ~= nil) then | ||
+ | _successors = p.NormalizePropertyValue(obj['successor_process_output']); | ||
+ | if (p.tablelength(_successors) == 1) then successors = _successors end | ||
+ | end | ||
+ | if (successors ~= nil) then | ||
+ | for succ_id, succ in pairs(successors) do | ||
edges = edges .. '"' .. obj_id .. '" -> "' .. succ .. '";' | edges = edges .. '"' .. obj_id .. '" -> "' .. succ .. '";' | ||
end | end | ||
Line 75: | Line 83: | ||
end | end | ||
end | end | ||
− | + | --mw.logObject(results) | |
return results | return results | ||
end | end | ||
Line 84: | Line 92: | ||
-- note also: unlinking via parameter link is not supported at this point | -- note also: unlinking via parameter link is not supported at this point | ||
--local process_type = "LabProcess:OSL9a645a64b15442398ad3c057e1b64d87" | --local process_type = "LabProcess:OSL9a645a64b15442398ad3c057e1b64d87" | ||
− | local query = "[[Category:LabProcessOutput]] [[-HasObject.IsInstanceOf::" .. process_type .. "]] |?#-=id |?HasId#-=local_id |?-HasPredecessor#-=successor_param |?-HasPredecessor.IsProcessParameterOf#-=successor_subprocess |?-HasPredecessor.IsObjectParameterOf#-=successor_object |?-HasPredecessor.IsProcessParameterOf.IsSubprocessOf#-=successor_process |format=plain | + | local query = "[[Category:LabProcessOutput]] [[-HasObject.IsInstanceOf::" .. process_type .. "]] " .. [[ |
+ | |?#-=id | ||
+ | |?HasId#-=local_id | ||
+ | |?-HasPredecessor#-=successor_param | ||
+ | |?-HasPredecessor.IsProcessParameterOf#-=successor_subprocess | ||
+ | |?-HasPredecessor.IsObjectParameterOf#-=successor_object | ||
+ | |?-HasPredecessor.IsProcessParameterOf.IsSubprocessOf#-=successor_process | ||
+ | |?-HasPredecessor.IsProcessParameterOf.IsSubprocessOf.-IsOutputOf#-=successor_process_output | ||
+ | |format=plain | ||
+ | |limit=10000 | ||
+ | ]] | ||
local result = mw.smw.ask( query ) | local result = mw.smw.ask( query ) | ||
+ | mw.logObject(result) | ||
return result | return result | ||
+ | end | ||
+ | |||
+ | -- expands single values for properties to tables with len 1 | ||
+ | function p.NormalizePropertyValue(v) | ||
+ | if (type(v) ~= "table") then | ||
+ | v = {v} | ||
+ | end | ||
+ | return v | ||
+ | end | ||
+ | |||
+ | function p.tablelength(T) | ||
+ | local count = 0 | ||
+ | for _ in pairs(T) do count = count + 1 end | ||
+ | return count | ||
end | end | ||
return p | return p |
Revision as of 08:39, 9 July 2022
Documentation for this module may be created at Module:LabProcess/Progress/doc
-- creates an overview over a process chain
-- Module:SMW
local p = {}
function p.GetProcessesGraph()
local process_types = {"LabProcess:OSL9a645a64b15442398ad3c057e1b64d87", "LabProcess:OSL4c1f7444e389471a8250f53407191735", "LabProcess:OSLd0c734a239844a0d8820856add12aeca"}
local result = p.GetProcesses(process_types)
--mw.logObject(result)
local d = mw.html.create( 'div' )
d:attr( 'class', 'graphviz' )
local g = [[
digraph G {
rankdir=LR
]]
for id,process in pairs(result) do
--mw.logObject(process)
local nodes = ""
local edges = ""
for obj_id, obj in pairs(process['objects']) do
nodes = nodes .. '"' .. obj_id .. '" [label="' .. obj['local_id'] .. '" href="https://kiprobatt.de/wiki/' .. obj_id .. '"];'
local successors = nil
if (obj['successor_object'] ~= nil) then
successors = p.NormalizePropertyValue(obj['successor_object']);
end
if (obj['successor_process_output'] ~= nil) then
_successors = p.NormalizePropertyValue(obj['successor_process_output']);
if (p.tablelength(_successors) == 1) then successors = _successors end
end
if (successors ~= nil) then
for succ_id, succ in pairs(successors) do
edges = edges .. '"' .. obj_id .. '" -> "' .. succ .. '";'
end
end
end
g = g .. [[
subgraph cluster_]] .. id:gsub(":","_") .. [[ {
node [style=filled];
label = "]] .. process['label'] .. [[";
color=blue;
]] .. nodes .. [[
}
]] .. edges .. [[
]]
end
g = g .. [[
}]]
d:wikitext(g)
mw.logObject(d)
return tostring( d )
end
function p.GetProcesses(process_types)
local results = {}
for key,process_type in pairs(process_types) do
results[process_type] = {}
results[process_type]['objects'] = {}
result = p.GetOutputs(process_type)
if (result ~= nil) then
for index, obj in pairs(result) do
--mw.logObject(obj['id'])
results[process_type]['objects'][obj['id']] = obj
end
end
end
local process_type_query = "[[" .. table.concat(process_types, "]] OR [[") .. "]]"
process_type_query = process_type_query .. " |?Display title of#-=label |?#-=process_type |?HasId#-=id |format=plain"
--mw.logObject(process_type_query)
local process_type_infos = mw.smw.ask( process_type_query )
for key,process_type_info in pairs(process_type_infos) do
--mw.logObject(process_type_info)
process_type = process_type_info['process_type']
if (process_type ~= nil) then
for k,v in pairs(process_type_info) do
if (k ~= "process_type") then results[process_type][k] = v end
end
end
end
--mw.logObject(results)
return results
end
function p.GetOutputs(process_type)
--mw.logObject(obj)
-- please note the unlinking of properties 'page authors', and mainlabel '?' by using the #- operator
-- note also: unlinking via parameter link is not supported at this point
--local process_type = "LabProcess:OSL9a645a64b15442398ad3c057e1b64d87"
local query = "[[Category:LabProcessOutput]] [[-HasObject.IsInstanceOf::" .. process_type .. "]] " .. [[
|?#-=id
|?HasId#-=local_id
|?-HasPredecessor#-=successor_param
|?-HasPredecessor.IsProcessParameterOf#-=successor_subprocess
|?-HasPredecessor.IsObjectParameterOf#-=successor_object
|?-HasPredecessor.IsProcessParameterOf.IsSubprocessOf#-=successor_process
|?-HasPredecessor.IsProcessParameterOf.IsSubprocessOf.-IsOutputOf#-=successor_process_output
|format=plain
|limit=10000
]]
local result = mw.smw.ask( query )
mw.logObject(result)
return result
end
-- expands single values for properties to tables with len 1
function p.NormalizePropertyValue(v)
if (type(v) ~= "table") then
v = {v}
end
return v
end
function p.tablelength(T)
local count = 0
for _ in pairs(T) do count = count + 1 end
return count
end
return p