*/
// must be run within Dokuwiki
if(!defined('DOKU_INC')) die();
class syntax_plugin_datagraph extends DokuWiki_Syntax_Plugin {
protected $db = null;
function syntax_plugin_datagraph() {
$sqlite = plugin_load('helper', 'sqlite');
if(!$sqlite){
msg('This plugin requires the sqlite plugin. Please install it', -1);
return;
}
// initialize the database connection
if(! $sqlite->init('data', dirname(__FILE__) . '/db/')){
msg('Could not load the database');
return;
}
$this->db = $sqlite;
}
function getType() {
return 'substition';
}
function getSort() {
return 160;
}
function getPType() {
return 'block';
}
function connectTo($mode) {
$this->Lexer->addSpecialPattern('----+ *datagraph *-+\n.*?\n---+', $mode, 'plugin_datagraph');
}
function handle($match, $state, $pos, Doku_Handler $handler) {
$kv = array("group by" => "", "aggregate" => "", "digits" => "1", "choosableGroups" => "", "choosableAggregates" => "", "filterClass" => NULL, "choosableYear" => "");
$match = explode("\n", $match);
foreach($match as $line){
$d = explode(":", $line, 2);
if(count($d) == 2){
$kv[trim($d[0])] = trim($d[1]);
}
}
return $kv;
}
function render($format, Doku_Renderer $R, $kv) {
if($format != 'xhtml') return false;
ob_start();
$format = intval($kv["digits"]);
$groups = explode(",",$kv["choosableGroups"]);
$aggregates = explode(",",$kv["choosableAggregates"]);
$years = explode(",",$kv["choosableYear"]);
$filter = $kv["filterClass"];
$filter_short = "";
$filter2value = $years[0]; // query only the first year
$filter2key = "year";
if ($_GET["year"] != NULL){
$filter2value = $_GET["year"];
}
if($filter != NULL){
# TODO prevent SQL injections
$filter_short= 'p.class = "' .$filter . '"';
}
// defaults:
$groupBy = $kv["group by"] ;
$agg = $kv["aggregate"];
if (count($groups) > 0){
// allow to select the grouping.
$v = $_GET["group"];
if ($v != NULL){
// check if the selection is allowed.
foreach($groups as $g){
if(trim($g) == $v){
$groupBy = $v;
break;
}
}
}
}
if (count($aggregates) > 0){
// allow to select the grouping.
$v = $_GET["aggregate"];
if ($v != NULL){
// check if the selection is allowed.
foreach($aggregates as $g){
if(trim($g) == $v){
$agg = $v;
break;
}
}
}
}
if (count($groups) > 0){
// create link map:
print("\nGroup by: ");
$first = True;
foreach($groups as $g){
$g = trim($g);
if (! $first){
print(", ");
}
if($groupBy == $g){
$mark = "**";
}else{
$mark = "";
}
print($mark . "[[?group=". $g . "&aggregate=". $agg ."|". $g . "]]". $mark);
$first = False;
}
print("\n");
}
if (count($groups) > 0){
// create link map:
print("\nAggregate: ");
$first = True;
foreach($aggregates as $g){
$g = trim($g);
if (! $first){
print(", ");
}
if($agg == $g){
$mark = "**";
}else{
$mark = "";
}
print($mark."[[?group=". $groupBy . "&aggregate=". $g ."|". $g . "]]".$mark);
$first = False;
}
print("\n");
}
$detailedGrouping = $_GET["groupDetails"];
if ($detailedGrouping == NULL){
$detailedGrouping = FALSE;
}
$arr = $this->db->res2arr($this->db->query('select d2.value as k, sum(d.value) as s, count(d.value) as m, d.value as metrics, group_concat(page) as pages from pages as p join data as d on d.pid = p.pid join data as d2 on d2.pid = p.pid join data as d3 on d3.pid = p.pid ' . $filter_joins . ' where ' . $filter_short . ' and d.key="' . $agg . '" and d2.key="' . $groupBy. '" and d3.key = "' . $filter2key . '" and d3.value = "' . $filter2value . '" group by d2.value'));
$metrics = explode(" ", $arr[0]["metrics"]);
if( count($metrics == 2)){
$metrics = " " . $metrics[1];
}else{
$metrics = "";
}
$count = count($arr);
for( $i=0; $i < $count; $i++){
if(strlen($arr[$i]["k"]) < 2){
$arr[$i]["k"] = "Unknown";
}
// remove rows with a subprefix
if( ! $detailedGrouping){
$curname = explode(" ", trim($arr[$i]["k"]));
if(count($curname) > 1 || ctype_lower($curname[0][0])){
unset($arr[$i]);
}
}
}
print("{ data: { columns: [");
foreach( $arr as $line ){
print("['" . $line["k"] . "', ". $line["s"] ."], ");
}
print("], type : 'pie', }}\n");
// header
print("=== " . ucfirst($agg) . " by " . $groupBy . " ====\n");
print("^ " . ucfirst($groupBy) . "^ (SUM) ^ mean ^ # systems ^ System list ^\n");
// body
$sum = 0;
$systemCount = 0;
foreach( $arr as $line ){
$sum = $sum + $line["s"];
$systemCount = $systemCount + $line["m"];
print("|" . $line["k"] . "| ". number_format($line["s"], $format) . $metrics ." | " . number_format($line["s"]/$line["m"], $format) . $metrics . " | " . $line["m"] . "| ");
$systems = "";
foreach (explode(",", $line["pages"]) as $page){
$systems .= "[[". $page . "]], "; // . "|" . explode("/", $page, 2)[1]
}
print( trim($systems, " ,") . "|\n");
}
print("| (SUM) **all systems** | " . $sum . $metrics . " | " . number_format(($sum / $systemCount), 1) . $metrics . "| " . $systemCount . "| \n");
//print("{ data: { columns: [ ['data1', 30], ['data2', 120], ], type : 'pie', }}");
$R->doc .= p_render( "xhtml", p_get_instructions( ob_get_contents() ), $info);
ob_end_clean();
return true;
}
}