Generate ratings from test results

This commit is contained in:
Alexander Nicolaysen Sørnes
2007-12-25 19:26:35 +01:00
committed by Chris Morgan
parent 274f256a63
commit 6a82a4fe3a
4 changed files with 161 additions and 5 deletions

View File

@@ -33,6 +33,8 @@ removeScreenshotsWithMissingFiles();
/* status since they aren't really maintaining the application/version */ /* status since they aren't really maintaining the application/version */
maintainerCheck(); maintainerCheck();
/* Updates the rating info for all versions based on test results */
updateRatings();
/* /*
* Warn users that have been inactive for some number of months * Warn users that have been inactive for some number of months
@@ -356,4 +358,18 @@ function maintainerCheck()
maintainer::notifyMaintainersOfQueuedData(); maintainer::notifyMaintainersOfQueuedData();
} }
function updateRatings()
{
$hResult = query_parameters("SELECT * FROM appVersion");
if(!$hResult)
return;
while($oRow = mysql_fetch_object($hResult))
{
$oVersion = new version(0, $oRow);
$oVersion->updateRatingInfo();
}
}
?> ?>

View File

@@ -30,6 +30,9 @@ define("BUGZILLA_ROOT","http://bugs.winehq.org/"); // path to bugzilla
//if(!defined("PRINT_EMAIL")) //if(!defined("PRINT_EMAIL"))
// define("PRINT_EMAIL", true); // print email, see mail_appdb() in include/mail.php // define("PRINT_EMAIL", true); // print email, see mail_appdb() in include/mail.php
// How old (days) a test report has to before it is judged to be aged
define("TESTDATA_AGED_THRESHOLD", 175);
/* /*
* apps database info * apps database info
*/ */

View File

@@ -683,6 +683,118 @@ class testData{
echo '</div>',"\n"; // end of the 'info_container' div echo '</div>',"\n"; // end of the 'info_container' div
} }
/* Convert a given rating string to a numeric scale */
public function ratingToNumber($sRating)
{
switch($sRating)
{
case GARBAGE_RATING:
return 0;
case BRONZE_RATING:
return 1;
case SILVER_RATING:
return 2;
case GOLD_RATING:
return 3;
case PLATINUM_RATING:
return 4;
}
}
/* Convert a numeric rating scale to a rating name */
public function numberToRating($iNumber)
{
switch($iNumber)
{
case 0:
return GARBAGE_RATING;
case 1:
return BRONZE_RATING;
case 2:
return SILVER_RATING;
case 3:
return GOLD_RATING;
case 4:
return PLATINUM_RATING;
}
}
/* Gets rating info for the selected version: an array with the elements
0 - Rating
1 - Wine version */
public function getRatingInfoForVersionId($iVersionId)
{
$sQuery = "SELECT testedRating,testedDate,testedRelease,versions.id as versionId
FROM testResults, ?.versions WHERE
versions.value = testResults.testedRelease
AND
versions.product_id = '?'
AND versionId = '?'
AND
state = '?'
AND
TO_DAYS(testedDate) > (TO_DAYS(NOW()) - ?)
ORDER BY versions.id DESC,testedDate DESC";
$hResult = query_parameters($sQuery, BUGZILLA_DB, BUGZILLA_PRODUCT_ID, $iVersionId, 'accepted', TESTDATA_AGED_THRESHOLD);
$aEntries = array();
if($hResult)
{
$iPrevVersion = 0;
$iIndex = -1;
for($i = 0; $oRow = mysql_fetch_object($hResult); $i++)
{
if($iPrevRelease != $oRow->versionId)
{
$iIndex++;
$iPrevRelease = $oRow->versionId;
}
if(!$aEntries[$iIndex])
{
$aEntries[$iIndex] = array();
$aEntries[$iIndex][0] = 0;
$aEntries[$iIndex][1] = 0;
$aEntries[$iIndex][2] = $oRow->testedRelease;
}
$aEntries[$iIndex][0] += testData::RatingToNumber($oRow->testedRating);
$aEntries[$iIndex][1]++;
}
}
$sRelease = '';
if(sizeof($aEntries))
{
$fRating = 0.0;
for($i = 0; $i < sizeof($aEntries); $i++)
{
/* Discard the rating if it's the only one for that Wine version
and its score is lower than previous averages */
if(($aEntries[$i][1] < 2) && sizeof($aEntries) > ($i+1) && ($aEntries[$i][0] < ($aEntries[$i+1][0] / $aEntries[$i+1][1])))
continue;
$fRating = $aEntries[$i][0] / $aEntries[$i][1];
$sRelease = $aEntries[$i][2];
break;
}
$sRating = testData::NumberToRating(round($fRating, 0));
}
if(!$sRelease)
{
$iNewestId = testData::getNewestTestIdFromVersionId($iVersionId);
$oTestData = new testData($iNewestId);
return array($oTestData->sTestedRating, $oTestData->sTestedRelease);
}
return array($sRating,$sRelease);
}
/* retrieve the latest test result for a given version id */ /* retrieve the latest test result for a given version id */
function getNewestTestIdFromVersionId($iVersionId, $sState = 'accepted') function getNewestTestIdFromVersionId($iVersionId, $sState = 'accepted')
{ {

View File

@@ -820,6 +820,29 @@ class version {
return new application($this->iAppId); return new application($this->iAppId);
} }
public function getRatingInfo()
{
return testData::getRatingInfoForVersionId($this->iVersionId);
}
public function updateRatingInfo()
{
$aRatingInfo = $this->getRatingInfo();
$hResult = query_parameters("UPDATE appVersion SET
maintainer_rating = '?',
maintainer_release = '?'
WHERE versionId = '?'",
$aRatingInfo[0],
$aRatingInfo[1],
$this->iVersionId);
if(!$hResult)
return false;
return true;
}
public function display($aVars = array()) public function display($aVars = array())
{ {
/* is this user supposed to view this version? */ /* is this user supposed to view this version? */
@@ -863,10 +886,12 @@ class version {
vote_count_version_total($this->iVersionId).$shVoteLink), vote_count_version_total($this->iVersionId).$shVoteLink),
"color0"); "color0");
if($this->sTestedRating != "/" && $this->sTestedRating) $sRating = $this->sTestedRating;
$sMaintainerColor = $this->sTestedRating; $sRelease = $this->sTestedRelease;
if($sRating != "/" && $sRating)
$sRatingColor = $sRating;
else else
$sMaintainerColor = "color0"; $sRatingColor = 'color0';
// URLs // URLs
if($sUrls = url::display($this->iVersionId)) if($sUrls = url::display($this->iVersionId))
@@ -875,8 +900,8 @@ class version {
} }
// rating Area // rating Area
echo "<tr class=\"$sMaintainerColor\" valign=\"top\"><td><b>Maintainer&#8217;s Rating</b></td><td>".$this->sTestedRating."</td></tr>\n"; echo "<tr class=\"$sRatingColor\" valign=\"top\"><td><b>Rating</b></td><td>".$sRating."</td></tr>\n";
echo "<tr class=\"$sMaintainerColor\" valign=\"top\"><td><b>Maintainer&#8217;s Version</b></td><td>".$this->sTestedRelease."</td></tr>\n"; echo "<tr class=\"$sRatingColor\" valign=\"top\"><td><b>Wine Version</b></td><td>".$sRelease."</td></tr>\n";
// Download URLs // Download URLs
if($sDownloadurls = downloadurl::display($this->iVersionId)) if($sDownloadurls = downloadurl::display($this->iVersionId))