| <?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); | |
| ?> |