blob: 7e615e0b007caa026bfeaad25b8ccd25096c06ec [file] [log] [blame]
<?php
/*******************************************************************************
* Copyright (c) 2016 Eclipse Foundation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wayne Beaton (Eclipse Foundation)- initial API and implementation
*******************************************************************************/
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php");
$App = new App();
$Nav = new Nav();
$Menu = new Menu();
include($App->getProjectCommon());
require_once $_SERVER['DOCUMENT_ROOT'] . '/projects/classes/Project.class.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/projects/classes/common.php';
require_once dirname ( __FILE__ ) . '/../classes/database.inc';
mustBeFoundationEmployee();
#
# Begin: page-specific settings. Change these.
$pageTitle = "Eclipse Project KPIs";
$pageKeywords = "";
$pageAuthor = "Wayne Beaton";
$js = "
// Load the Visualization API and the chart package.
google.load('visualization', '1.0', {'packages':['corechart']});
";
$App->addExtraHtmlHeader("<script type=\"text/javascript\" src=\"https://www.google.com/jsapi\"></script>");
$App->addExtraHtmlHeader("<script type=\"text/javascript\">$js</script>");
$ago = 36;
ob_start();
function renderCqProcessingTime($type = 'projectcode', $age = 5, $columns = array('checkin', 'approval')) {
global $App;
$sql = "
select
tlp as project,
type, count(*) as count,
avg(datediff(approved, pmc)) as avg_approval,
stddev(datediff(approved, pmc)) as stdev_approval,
max(datediff(approved, pmc)) as max_approval,
min(datediff(approved, pmc)) as min_approval,
avg(datediff(checkin, pmc)) as avg_checkin,
stddev(datediff(checkin, pmc)) as stdev_checkin,
max(datediff(checkin, pmc)) as max_checkin,
min(datediff(checkin, pmc)) as min_checkin
from
(select
p.name as tlp,
c.name as project,
b.bug_id,
if(b.short_desc regexp '\((PB( Orbit)?)\s*\d*\)', 'piggyback', kd.name) as type,
date(b.creation_ts) as created,
if (max(date(pmc.bug_when)) is null, date(b.creation_ts), max(date(pmc.bug_when))) as start,
max(date(pmc.bug_when)) as pmc,
max(date(checkin.bug_when)) as checkin,
max(date(approved.bug_when)) as approved
from bugs as b
join products as p on b.product_id = p.id
join components as c on b.component_id = c.id
join keywords as k on b.bug_id=k.bug_id
join keyworddefs as kd on k.keywordid=kd.id and kd.name in ('thirdparty', 'projectcode')
left join bugs_activity as pmc on b.bug_id=pmc.bug_id and pmc.added in ('PMC_Approved+')
left join bugs_activity as checkin on b.bug_id=checkin.bug_id and checkin.added in ('checkin', 'checkintocvs')
left join bugs_activity as approved on b.bug_id=approved.bug_id and approved.added in ('approved', 'approved_all_projects')
where p.name not in ('foundation-internal', 'IP', 'dsdp')
and date(b.creation_ts) > DATE_SUB(now(), INTERVAL %age MONTH)
group by p.id, b.bug_id) as stats
where type='%type'
group by tlp, type";
$rows = array();
query('ipzilla', $sql, array('%age' => $age, '%type' => $type), function ($row) use ($rows) {
$value = array($row['project']);
foreach($columns as $column) $value[] = $row["avg_" . $column];
$rows[] = $value;
});
$headers = array(array('string', 'TLP'));
foreach($columns as $column ) $headers[] = array('number', ucfirst($column));
drawBarChart("CQStats$type", "Average days (CQs created in the last $age months)",
$headers,
$rows, 'Average time (days)', 'Top Level Project');
}
function renderCqCounts($type = 'projectcode', $age = 5) {
global $App;
$sql = "
select
p.name as project,
count(distinct b.bug_id) as count
from bugs as b
join products as p on b.product_id=p.id
join keywords as k on b.bug_id=k.bug_id
join keyworddefs as kd on k.keywordid=kd.id and kd.name in ('thirdparty', 'projectcode')
where kd.name = '%type'
and date(b.creation_ts) > DATE_SUB(now(), INTERVAL %age MONTH)
group by p.name
order by p.name";
$rows = array();
query('ipzilla', $sql, array('%age' => $age, '%type' => $type), function ($row) use ($rows) {
$rows[] = array($row['project'], $row['count']);
});
drawBarChart("CQCounts$type", "Total Count (CQs Created in the last $age months)",
array(array('string', 'TLP'), array('number', 'CQ Count')),
$rows, 'Number of CQ', 'Top Level Project');
}
function drawBarChart($id, $title, $columns, $values, $hlabel='', $vlabel= '', $width=800, $height=600) {
global $App;
$columnsJS = '';
foreach($columns as $column) {
$type = $column[0];
$label = $column[1];
$columnsJS .= "data.addColumn('$type','$label');";
}
$valuesJSON = json_encode($values, JSON_NUMERIC_CHECK);
$js = "
google.setOnLoadCallback(draw${id}Chart);
function draw${id}Chart() {
// Create the data table.
var data = new google.visualization.DataTable();
$columnsJS;
data.addRows($valuesJSON);
// Set chart options
var options = {
title:'$title',
vAxis: {title: '$vlabel'},
hAxis: {title: '$hlabel'},
curveType: 'function',
width:$width,
height:$height,
trendlines: { 0: {} }
};
// Instantiate and draw our chart, passing in some options.
var chart = new google.visualization.BarChart(document.getElementById('${id}_div'));
chart.draw(data, options);
document.getElementById('${id}_div_png').outerHTML = '<a href=\"' + chart.getImageURI() + '\">Printable version</a>';
}";
$App->addExtraHtmlHeader("<script type=\"text/javascript\">$js</script>");
echo "<div id=\"${id}_div\"></div>";
echo "<div id=\"${id}_div_png\"></div>";
}
?>
<div id="maincontent">
<div id="midcolumn">
<h1><?= $pageTitle ?></h1>
<h3>Project Code Processing Averages</h3>
<p>Say something here.</p>
<?php renderCqProcessingTime('projectcode', $ago); ?>
<h3>Third-party Processing Averages</h3>
<p>Say something here.</p>
<?php renderCqProcessingTime('thirdparty', $ago); ?>
<h3>Piggyback Processing Averages</h3>
<p>Say something here.</p>
<?php renderCqProcessingTime('piggyback', $ago, array('approval')); ?>
<h3>Project Code CQ Count</h3>
<p>Say something here.</p>
<?php renderCqCounts('projectcode', $ago); ?>
<h3>Third Party CQ Count</h3>
<p>Say something here.</p>
<?php renderCqCounts('thirdparty', $ago); ?>
</div>
</div>
<?php
$html = ob_get_contents();
ob_end_clean();
$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>