Francois Gouget : testbot/web: Use Collection::GetSortedItems() for collection blocks.

Alexandre Julliard julliard at winehq.org
Wed Apr 13 15:08:39 CDT 2022


Module: tools
Branch: master
Commit: a40ee48f7e74fa13777950ba73ec61bd27dec221
URL:    https://source.winehq.org/git/tools.git/?a=commit;h=a40ee48f7e74fa13777950ba73ec61bd27dec221

Author: Francois Gouget <fgouget at codeweavers.com>
Date:   Wed Apr 13 19:44:53 2022 +0200

testbot/web: Use Collection::GetSortedItems() for collection blocks.

This adds default Compare() methods to the Jobs and Patches classes
which allows removing all the CollectionBlock SortKeys() methods.

Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 testbot/lib/ObjectModel/CGI/CollectionBlock.pm | 15 +++++++-------
 testbot/lib/WineTestBot/Jobs.pm                |  8 ++++++++
 testbot/lib/WineTestBot/Patches.pm             |  8 ++++++++
 testbot/lib/WineTestBot/VMs.pm                 | 23 ---------------------
 testbot/web/JobDetails.pl                      | 28 +++++++++-----------------
 testbot/web/Submit.pl                          | 13 ++++++------
 testbot/web/admin/VMsList.pl                   |  7 -------
 testbot/web/index.pl                           | 15 --------------
 8 files changed, 39 insertions(+), 78 deletions(-)

diff --git a/testbot/lib/ObjectModel/CGI/CollectionBlock.pm b/testbot/lib/ObjectModel/CGI/CollectionBlock.pm
index 23825d7..f124e64 100644
--- a/testbot/lib/ObjectModel/CGI/CollectionBlock.pm
+++ b/testbot/lib/ObjectModel/CGI/CollectionBlock.pm
@@ -176,11 +176,11 @@ sub DisplayProperty($$)
   return $PropertyDescriptor->GetClass ne "Detailref";
 }
 
-sub SortKeys($$)
+sub GetSortedItems($$)
 {
-  my ($self, $Keys) = @_;
+  my ($self, $Items) = @_;
 
-  return $Keys;
+  return $self->{Collection}->GetSortedItems($Items);
 }
 
 sub GetDisplayValue($$$)
@@ -428,16 +428,15 @@ EOF
   print "<tbody>\n";
   my $DetailsPage = $self->GetDetailsPage();
   my $Row = 0;
-  my $Keys = $self->SortKeys($self->{Collection}->GetKeys());
-  foreach my $Key (@$Keys)
+  my $Items = $self->{Collection}->GetSortedItems();
+  foreach my $Item (@$Items)
   {
     my $Class = ($Row % 2) == 0 ? "even" : "odd";
-    my $Item = $self->{Collection}->GetItem($Key);
     $self->GenerateDataRow($Item, $PropertyDescriptors, $DetailsPage,
                            $Class, $ItemActions);
     $Row++;
   }
-  if (@$Keys == 0)
+  if (@$Items == 0)
   {
     print "<tr class='even'><td colspan='0'>No entries</td></tr>\n";
   }
@@ -445,7 +444,7 @@ EOF
   print "</tbody>\n";
   print "</table>\n";
 
-  if (@$ItemActions != 0 && @$Keys != 0)
+  if (@$ItemActions != 0 && @$Items != 0)
   {
     print <<EOF;
 <div class='CollectionBlockActions'>
diff --git a/testbot/lib/WineTestBot/Jobs.pm b/testbot/lib/WineTestBot/Jobs.pm
index a5ae135..c082a36 100644
--- a/testbot/lib/WineTestBot/Jobs.pm
+++ b/testbot/lib/WineTestBot/Jobs.pm
@@ -111,6 +111,14 @@ sub InitializeNew($$)
   $self->SUPER::InitializeNew($Collection);
 }
 
+sub Compare($$)
+{
+  my ($self, $B) = @_;
+
+  # Hack: Use direct attribute access for performance
+  return $B->{ColValues}{Id} <=> $self->{ColValues}{Id}; # newest first by default
+}
+
 =pod
 =over 12
 
diff --git a/testbot/lib/WineTestBot/Patches.pm b/testbot/lib/WineTestBot/Patches.pm
index 6891fa5..d2ac52e 100644
--- a/testbot/lib/WineTestBot/Patches.pm
+++ b/testbot/lib/WineTestBot/Patches.pm
@@ -58,6 +58,14 @@ sub InitializeNew($$)
   $self->SUPER::InitializeNew($Collection);
 }
 
+sub Compare($$)
+{
+  my ($self, $B) = @_;
+
+  # Hack: Use direct attribute access for performance
+  return $B->{ColValues}{Id} <=> $self->{ColValues}{Id}; # newest first by default
+}
+
 =pod
 =over 12
 
diff --git a/testbot/lib/WineTestBot/VMs.pm b/testbot/lib/WineTestBot/VMs.pm
index 2e475b7..f0c16d1 100644
--- a/testbot/lib/WineTestBot/VMs.pm
+++ b/testbot/lib/WineTestBot/VMs.pm
@@ -809,29 +809,6 @@ sub CreateVMs(;$)
                                \@PropertyDescriptors, $ScopeObject);
 }
 
-sub SortKeysBySortOrder($$)
-{
-  my ($self, $Keys) = @_;
-
-  # Sort retired and deleted VMs last
-  my %RoleOrders = ("retired" => 1, "deleted" => 2);
-
-  my %SortOrder;
-  foreach my $Key (@$Keys)
-  {
-    my $Item = $self->GetItem($Key);
-    $SortOrder{$Key} = [$RoleOrders{$Item->Role} || 0, $Item->SortOrder, $Item->Name];
-  }
-
-  my @SortedKeys = sort {
-    my ($soa, $sob) = ($SortOrder{$a}, $SortOrder{$b});
-    return @$soa[0] <=> @$sob[0] ||
-           @$soa[1] <=> @$sob[1] ||
-           @$soa[2] cmp @$sob[2];
-  } @$Keys;
-  return \@SortedKeys;
-}
-
 sub FilterEnabledRole($)
 {
   my ($self) = @_;
diff --git a/testbot/web/JobDetails.pl b/testbot/web/JobDetails.pl
index 5a24204..da4ad7e 100644
--- a/testbot/web/JobDetails.pl
+++ b/testbot/web/JobDetails.pl
@@ -56,14 +56,6 @@ sub DisplayProperty($$)
          $PropertyName eq "Ended" || $PropertyName eq "TestFailures";
 }
 
-sub SortKeys($$)
-{
-  my ($self, $Keys) = @_;
-
-  my @SortedKeys = sort { $a <=> $b } @$Keys;
-  return \@SortedKeys;
-}
-
 
 #
 # Item cell generation
@@ -361,10 +353,10 @@ sub InitMoreInfo($)
   my ($self) = @_;
 
   my $More = $self->{More} = {};
-  my $Keys = $self->{CollectionBlock}->SortKeys($self->{Collection}->GetKeys());
-  foreach my $Key (@$Keys)
+  my $SortedStepTasks = $self->{Collection}->GetSortedItems();
+  foreach my $StepTask (@$SortedStepTasks)
   {
-    my $StepTask = $self->{Collection}->GetItem($Key);
+    my $Key = $StepTask->GetKey();
     $More->{$Key}->{Screenshot} = $self->GetParam("s$Key");
 
     my $Value = $self->GetParam("f$Key");
@@ -569,17 +561,17 @@ function HideLog(event, url)
 EOF
 
   print "<div class='Content'>\n";
-  my $Keys = $self->{CollectionBlock}->SortKeys($self->{Collection}->GetKeys());
-  my $KeyIndex = 0;
-  foreach my $Key (@$Keys)
+  my $Index = 0;
+  my $SortedStepTasks = $self->{Collection}->GetSortedItems();
+  foreach my $StepTask (@$SortedStepTasks)
   {
-    my $StepTask = $self->{Collection}->GetItem($Key);
+    my $Key = $StepTask->GetKey();
     my $TaskDir = $StepTask->GetTaskDir();
     my $VM = $StepTask->VM;
 
-    my $Prev = $KeyIndex > 0 ? "k". $Keys->[$KeyIndex-1] : "PageTitle";
-    my $Next = $KeyIndex + 1 < @$Keys ? "k". $Keys->[$KeyIndex+1] : "PageEnd";
-    $KeyIndex++;
+    my $Prev = $Index > 0 ? "k". $SortedStepTasks->[$Index-1]->GetKey() : "PageTitle";
+    my $Next = $Index + 1 < @$SortedStepTasks ? "k". $SortedStepTasks->[$Index+1]->GetKey() : "PageEnd";
+    $Index++;
     print "<h2><a name='k", $self->escapeHTML($Key), "'></a>",
           $self->escapeHTML($StepTask->GetTitle()),
           " <span class='right'><a class='title' href='#$Prev'>↑</a><a class='title' href='#$Next'>↓</a></span></h2>\n";
diff --git a/testbot/web/Submit.pl b/testbot/web/Submit.pl
index 1ad94e4..8a1cc3c 100644
--- a/testbot/web/Submit.pl
+++ b/testbot/web/Submit.pl
@@ -474,10 +474,9 @@ sub _initialize($$$)
   $VMs->AddFilter("Type", ["win32", "win64", "wine"]);
   $VMs->FilterEnabledRole();
 
-  my $SortedKeys = $VMs->SortKeysBySortOrder($VMs->GetKeys());
-  foreach my $VMKey (@$SortedKeys)
+  my $SortedVMs = $VMs->GetSortedItems();
+  foreach my $VM (@$SortedVMs)
   {
-    my $VM = $VMs->GetItem($VMKey);
     my ($ErrMessage, $Caps) = GetMissionCaps($VM->Missions, $VM->MissionCaps);
     LogMsg "$ErrMessage\n" if (defined $ErrMessage);
 
@@ -492,7 +491,7 @@ sub _initialize($$$)
       }
     }
 
-    my $FieldBase = $self->escapeHTML($VMKey);
+    my $FieldBase = $self->escapeHTML($VM->GetKey());
     foreach my $Build (sort @Builds)
     {
       my $VMRow = {
@@ -752,10 +751,10 @@ sub GenerateFields($)
       print "<div class='ItemProperty'><label>Branch</label>",
             "<div class='ItemValue'>",
             "<select name='Branch' size='1'>";
-      my @SortedKeys = sort { $a cmp $b } @{$Branches->GetKeys()};
-      foreach my $Key (@SortedKeys)
+      my $SortedBranches = $Branches->GetSortedItems();
+      foreach my $Branch (@$SortedBranches)
       {
-        my $Branch = $Branches->GetItem($Key);
+        my $Key = $Branch->GetKey();
         print "<option value='", $self->escapeHTML($Key), "'";
         if (defined $self->{Branch} and $Key eq $self->{Branch})
         {
diff --git a/testbot/web/admin/VMsList.pl b/testbot/web/admin/VMsList.pl
index cfd5b91..f8162c6 100644
--- a/testbot/web/admin/VMsList.pl
+++ b/testbot/web/admin/VMsList.pl
@@ -43,13 +43,6 @@ sub DisplayProperty($$)
          $PropertyName eq "Description";
 }
 
-sub SortKeys($$)
-{
-  my ($self, $Keys) = @_;
-
-  return $self->{Collection}->SortKeysBySortOrder($Keys);
-}
-
 sub OnItemAction($$$)
 {
   my ($self, $VM, $Action) = @_;
diff --git a/testbot/web/index.pl b/testbot/web/index.pl
index 85f8df3..478cb61 100644
--- a/testbot/web/index.pl
+++ b/testbot/web/index.pl
@@ -35,14 +35,6 @@ use WineTestBot::Utils;
 my $DAYS_DEFAULT = 4;
 
 
-sub SortKeys($$)
-{
-  my ($self, $Keys) = @_;
-
-  my @SortedKeys = sort { $b <=> $a } @$Keys;
-  return \@SortedKeys;
-}
-
 sub DisplayProperty($$)
 {
   my ($self, $PropertyDescriptor) = @_;
@@ -188,13 +180,6 @@ use ObjectModel::CGI::CollectionBlock;
 our @ISA = qw(ObjectModel::CGI::CollectionBlock);
 
 
-sub SortKeys($$)
-{
-  my ($self, $Keys) = @_;
-
-  return $self->{Collection}->SortKeysBySortOrder($Keys);
-}
-
 sub DisplayProperty($$)
 {
   my ($self, $PropertyDescriptor) = @_;




More information about the wine-cvs mailing list