diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 94b8636a8..3e8436006 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -3,6 +3,7 @@ - fixed #11292: Search function limited to onje search? - fixed #11286: Workflow Instance deleted when reaching an Activity that fails to load - fixed #11296: listLDAPLinks op permissions problems + - fixed #11294: Matrix - Best/Worse Rated Calculations 7.8.7 - fixed #11278: Wrong test for Template::Toolkit in testEnvironment.pl diff --git a/docs/upgrades/upgrade_7.8.7-7.8.8.pl b/docs/upgrades/upgrade_7.8.7-7.8.8.pl index 6185d5d0e..c22044091 100644 --- a/docs/upgrades/upgrade_7.8.7-7.8.8.pl +++ b/docs/upgrades/upgrade_7.8.7-7.8.8.pl @@ -32,6 +32,7 @@ my $session = start(); # this line required # upgrade functions go here deleteFieldFromEMSSubmission($session); +tenVoteMinimumForMatrixRatings($session); finish($session); # this line required @@ -60,6 +61,15 @@ ENDSQL print "DONE!\n" unless $quiet; } +#---------------------------------------------------------------------------- +# Describe what our function does +sub tenVoteMinimumForMatrixRatings { + my $session = shift; + print "\tRestrict Matrix Listing Statistics to those with more than 10 ratings..." unless $quiet; + $session->db->write('update MatrixListing_ratingSummary set meanValue=0, medianValue=0 where countValue < 10'); + print "\tDONE!\n" unless $quiet; +} + # -------------- DO NOT EDIT BELOW THIS LINE -------------------------------- #---------------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset/MatrixListing.pm b/lib/WebGUI/Asset/MatrixListing.pm index 1ffd68b65..52e5da83c 100644 --- a/lib/WebGUI/Asset/MatrixListing.pm +++ b/lib/WebGUI/Asset/MatrixListing.pm @@ -608,9 +608,11 @@ sub setRatings { my $mean = $sum / ($count || 1); my $median = $db->quickScalar("select rating $sql order by rating limit $half,1",[$self->getId,$category]); - $db->write("replace into MatrixListing_ratingSummary - (listingId, category, meanValue, medianValue, countValue, assetId) - values (?,?,?,?,?,?)",[$self->getId,$category,$mean,$median,$count,$matrixId]); + if ($count >= 10) { + $db->write("replace into MatrixListing_ratingSummary + (listingId, category, meanValue, medianValue, countValue, assetId) + values (?,?,?,?,?,?)",[$self->getId,$category,$mean,$median,$count,$matrixId]); + } } return undef; } diff --git a/lib/WebGUI/Asset/Wobject/Matrix.pm b/lib/WebGUI/Asset/Wobject/Matrix.pm index 7cce8f63d..f7079eb1f 100644 --- a/lib/WebGUI/Asset/Wobject/Matrix.pm +++ b/lib/WebGUI/Asset/Wobject/Matrix.pm @@ -631,16 +631,11 @@ sub view { $style->setLink($url->extras('yui/build/datatable/assets/skins/sam/datatable.css'), {type =>'text/css', rel=>'stylesheet'}); - $style->setScript($url->extras('yui/build/utilities/utilities.js'), - {type => 'text/javascript'}); - $style->setScript($url->extras('yui/build/json/json-min.js'), - {type => 'text/javascript'}); - $style->setScript($url->extras('yui/build/datasource/datasource-min.js'), - {type => 'text/javascript'}); - $style->setScript($url->extras('yui/build/datatable/datatable-min.js'), - {type => 'text/javascript'}); - $style->setScript($url->extras('yui/build/button/button-min.js'), - {type => 'text/javascript'}); + $style->setScript($url->extras('yui/build/utilities/utilities.js'), {type => 'text/javascript'}); + $style->setScript($url->extras('yui/build/json/json-min.js'), {type => 'text/javascript'}); + $style->setScript($url->extras('yui/build/datasource/datasource-min.js'), {type => 'text/javascript'}); + $style->setScript($url->extras('yui/build/datatable/datatable-min.js'), {type => 'text/javascript'}); + $style->setScript($url->extras('yui/build/button/button-min.js'), {type => 'text/javascript'}); my ($varStatistics,$varStatisticsEncoded); my $var = $self->get; @@ -763,7 +758,7 @@ sub view { push (@{ $varStatistics->{last_updated_loop} }, { url => $lastUpdatedListing->getUrl, name => $lastUpdatedListing->get('title'), - lastUpdated => $self->session->datetime->epochToHuman($lastUpdatedListing->get('lastUpdated'),"%z") + lastUpdated => $session->datetime->epochToHuman($lastUpdatedListing->get('lastUpdated'),"%z") }); } $varStatistics->{lastUpdated_sortButton} = "
", - bestViews_url=>'/'.$matrixListing->get('url'), - bestViews_count=>1, - bestViews_name=>$matrixListing->get('title'), - bestViews_sortButton=>"
", - bestCompares_url=>'/'.$matrixListing->get('url'), - bestCompares_count=>1, - bestCompares_name=>$matrixListing->get('title'), - bestCompares_sortButton=>"
", - bestClicks_url=>'/'.$matrixListing->get('url'), - bestClicks_count=>1, - bestClicks_name=>$matrixListing->get('title'), - bestClicks_sortButton=>"
", - last_updated_loop=>[{ - url => $matrixListing->getUrl, - name => $matrixListing->get('title'), - lastUpdated => $session->datetime->epochToHuman($matrixListing->get('lastUpdated'),"%z") - }], - lastUpdated_sortButton=>"
", - best_rating_loop=>[{ - url=>'/'.$matrixListing->get('url'), - category=>'category1', - name=>'untitled', - mean=>'1.50', - median=>2, - count=>2, - }, - { - url=>'/'.$matrixListing->get('url'), - category=>'category2', - name=>'untitled', - mean=>'7.50', - median=>10, - count=>2, - }], - worst_rating_loop=>[{ - url=>'/'.$matrixListing->get('url'), - category=>'category1', - name=>'untitled', - mean=>'1.50', - median=>2, - count=>2, - }, - { - url=>'/'.$matrixListing->get('url'), - category=>'category2', - name=>'untitled', - mean=>'7.50', - median=>10, - count=>2, - }], - listingCount=>1, + $varStatistics, + { + alphanumeric_sortButton=>"
", + bestViews_url=>'/'.$matrixListing->get('url'), + bestViews_count=>1, + bestViews_name=>$matrixListing->get('title'), + bestViews_sortButton=>"
", + bestCompares_url=>'/'.$matrixListing->get('url'), + bestCompares_count=>1, + bestCompares_name=>$matrixListing->get('title'), + bestCompares_sortButton=>"
", + bestClicks_url=>'/'.$matrixListing->get('url'), + bestClicks_count=>1, + bestClicks_name=>$matrixListing->get('title'), + bestClicks_sortButton=>"
", + last_updated_loop=>[{ + url => $matrixListing->getUrl, + name => $matrixListing->get('title'), + lastUpdated => $session->datetime->epochToHuman($matrixListing->get('lastUpdated'),"%z") + }], + lastUpdated_sortButton=>"
", + best_rating_loop=>[{ + url => '/', + category=> 'category1', + name => undef, + mean => 0, + median => 0, + count => 0, }, - 'Statistics were cached by view method.' - ); + { + url => '/', + category=> 'category2', + name => undef, + mean => 0, + median => 0, + count => 0, + }], + worst_rating_loop=>[{ + url => '/', + category=> 'category1', + name => undef, + mean => 0, + median => 0, + count => 0, + }, + { + url => '/', + category=> 'category2', + name => undef, + mean => 0, + median => 0, + count => 0, + }], + listingCount=>1, + }, + 'Statistics were cached by view method.' +); + +##Now, add a bunch of ratings. Each one has two +$matrixListing->setRatings({category1=>'1',category2=>'9'}); +$matrixListing->setRatings({category1=>'3',category2=>'5'}); +$matrixListing->setRatings({category1=>'1',category2=>'9'}); +$matrixListing->setRatings({category1=>'3',category2=>'5'}); +$matrixListing->setRatings({category1=>'1',category2=>'9'}); +$matrixListing->setRatings({category1=>'3',category2=>'5'}); +$matrixListing->setRatings({category1=>'1',category2=>'9'}); + +WebGUI::Cache->new($session,"matrixStatistics_".$matrix->getId)->delete; +$matrix->view; +my $varStatisticsEncoded = WebGUI::Cache->new($session,"matrixStatistics_".$matrix->getId)->get; +my $varStatistics = JSON->new->decode($varStatisticsEncoded); + +cmp_deeply( + { + best_rating_loop => $varStatistics->{best_rating_loop}, + worst_rating_loop => $varStatistics->{worst_rating_loop}, + }, + { + best_rating_loop => [{ + url => '/', + category=> 'category1', + name => undef, + mean => 0, + median => 0, + count => 0, + }, + { + url => '/', + category=> 'category2', + name => undef, + mean => 0, + median => 0, + count => 0, + }], + worst_rating_loop => [{ + url => '/', + category=> 'category1', + name => undef, + mean => 0, + median => 0, + count => 0, + }, + { + url => '/', + category=> 'category2', + name => undef, + mean => 0, + median => 0, + count => 0, + }], + }, + 'With only 9 ratings, still no statistics' +); + +WebGUI::Cache->new($session,"matrixStatistics_".$matrix->getId)->delete; +$matrixListing->setRatings({category1=>'3'}); +$matrix->view; +my $varStatisticsEncoded = WebGUI::Cache->new($session,"matrixStatistics_".$matrix->getId)->get; +my $varStatistics = JSON->new->decode($varStatisticsEncoded); + +cmp_deeply( + { + best_rating_loop => $varStatistics->{best_rating_loop}, + worst_rating_loop => $varStatistics->{worst_rating_loop}, + }, + { + best_rating_loop => [{ + url => '/'.$matrixListing->get('url'), + category=> 'category1', + name => 'untitled', + mean => 2, + median => 3, + count => 10, + }, + { + url => '/', + category=> 'category2', + name => undef, + mean => 0, + median => 0, + count => 0, + }], + worst_rating_loop => [{ + url => '/'.$matrixListing->get('url'), + category=> 'category1', + name => 'untitled', + mean => 2, + median => 3, + count => 10, + }, + { + url => '/', + category=> 'category2', + name => undef, + mean => 0, + median => 0, + count => 0, + }], + }, + 'statistics calculated for the category with 10 ratings' +); + +WebGUI::Cache->new($session,"matrixStatistics_".$matrix->getId)->delete; +$matrixListing->setRatings({category2=>'5'}); +$matrix->view; +my $varStatisticsEncoded = WebGUI::Cache->new($session,"matrixStatistics_".$matrix->getId)->get; +my $varStatistics = JSON->new->decode($varStatisticsEncoded); + +cmp_deeply( + { + best_rating_loop => $varStatistics->{best_rating_loop}, + worst_rating_loop => $varStatistics->{worst_rating_loop}, + }, + { + best_rating_loop => [{ + url => '/'.$matrixListing->get('url'), + category=> 'category1', + name => 'untitled', + mean => 2, + median => 3, + count => 10, + }, + { + url => '/'.$matrixListing->get('url'), + category=> 'category2', + name => 'untitled', + mean => 7, + median => 9, + count => 10, + }], + worst_rating_loop => [{ + url => '/'.$matrixListing->get('url'), + category=> 'category1', + name => 'untitled', + mean => 2, + median => 3, + count => 10, + }, + { + url => '/'.$matrixListing->get('url'), + category=> 'category2', + name => 'untitled', + mean => 7, + median => 9, + count => 10, + }], + }, + 'statistics calculated for the category with 10 ratings' +);