[Rt-commit] rt branch, 3.8-trunk, updated. rt-3.8.5-133-g6ec681b

Ruslan Zakirov ruz at bestpractical.com
Thu Sep 24 19:25:54 EDT 2009


The branch, 3.8-trunk has been updated
       via  6ec681b2b01c7fdf6fcdb20ee4f7fc42b316c26a (commit)
       via  bd16c1aef778f00a9d8e87ff57f6d5b6c5dc8b75 (commit)
      from  7f153dfed7209698159b03783bd56b3e675ac7e6 (commit)

Summary of changes:
 lib/RT/SQL.pm                 |   63 +++++++++++++++++++++
 sbin/rt-test-dependencies.in  |    1 +
 share/html/Search/Results.tsv |  122 ++++++++++++++++++++++++-----------------
 3 files changed, 136 insertions(+), 50 deletions(-)

- Log -----------------------------------------------------------------
commit bd16c1aef778f00a9d8e87ff57f6d5b6c5dc8b75
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Fri Sep 25 03:20:45 2009 +0400

    implement PossibleCustomFields using Parse::BooleanLogic

diff --git a/lib/RT/SQL.pm b/lib/RT/SQL.pm
index 74b95e6..96c65f8 100644
--- a/lib/RT/SQL.pm
+++ b/lib/RT/SQL.pm
@@ -51,6 +51,8 @@ package RT::SQL;
 use strict;
 use warnings;
 
+use Parse::BooleanLogic;
+
 # States
 use constant VALUE       => 1;
 use constant AGGREG      => 2;
@@ -210,6 +212,67 @@ sub _BitmaskToString {
     return join ' or ', @res;
 }
 
+sub PossibleCustomFields {
+    my %args = (Query => undef, CurrentUser => undef, @_);
+
+    my $tree = Parse::BooleanLogic->filter(
+        RT::SQL::ParseToArray( $args{'Query'} ),
+        sub { $_[0]->{'key'} =~ /^Queue(?:\z|\.)/ },
+    );
+    my $cfs = RT::CustomFields->new( $args{'CurrentUser'} );
+    my $ocf_alias = $cfs->_OCFAlias;
+    $cfs->LimitToLookupType( 'RT::Queue-RT::Ticket' );
+    if ( $tree ) {
+        my $clause = 'QUEUES';
+        my $queue_alias = $cfs->Join(
+            TYPE   => 'LEFT',
+            ALIAS1 => $ocf_alias,
+            FIELD1 => 'ObjectId',
+            TABLE2 => 'Queues',
+            FIELD2 => 'id',
+        );
+        $cfs->_OpenParen($clause);
+        $cfs->Limit(
+            SUBCLAUSE       => $clause,
+            ENTRYAGGREGATOR => 'AND',
+            ALIAS           => $ocf_alias,
+            FIELD           => 'ObjectId',
+            VALUE           => 0,
+        );
+        $cfs->_OpenParen($clause);
+
+        my $ea = 'OR';
+        Parse::BooleanLogic->walk(
+            $tree,
+            {
+                open_paren  => sub { $cfs->_OpenParen($clause) },
+                close_paren => sub { $cfs->_CloseParen($clause) },
+                operator    => sub { $ea = $_[0] },
+                operand     => sub {
+                    my ($key, $op, $value) = @{$_[0]}{'key', 'op', 'value'};
+                    my (undef, @sub) = split /\./, $key;
+                    push @sub, $value =~ /\D/? 'Name' : 'id'
+                        unless @sub;
+                    
+                    die "Couldn't handle ". join('.', 'Queue', @sub) if @sub > 1;
+                    $cfs->Limit(
+                        SUBCLAUSE       => $clause,
+                        ENTRYAGGREGATOR => $ea,
+                        ALIAS           => $queue_alias,
+                        FIELD           => $sub[0],
+                        OPERATOR        => $op,
+                        VALUE           => $value,
+                    );
+                },
+            }
+        );
+
+        $cfs->_CloseParen($clause);
+        $cfs->_CloseParen($clause);
+    }
+    return $cfs;
+}
+
 eval "require RT::SQL_Vendor";
 if ($@ && $@ !~ qr{^Can't locate RT/SQL_Vendor.pm}) {
     die $@;
diff --git a/sbin/rt-test-dependencies.in b/sbin/rt-test-dependencies.in
index 0cbb149..8978e8f 100755
--- a/sbin/rt-test-dependencies.in
+++ b/sbin/rt-test-dependencies.in
@@ -238,6 +238,7 @@ Encode 2.13
 CSS::Squish 0.06
 File::Glob
 Devel::StackTrace 1.19
+Parse::BooleanLogic 0.09
 .
 
 $deps{'MASON'} = [ text_to_hash( << '.') ];

commit 6ec681b2b01c7fdf6fcdb20ee4f7fc42b316c26a
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Fri Sep 25 03:24:36 2009 +0400

    improve performance of Results.tsv

diff --git a/share/html/Search/Results.tsv b/share/html/Search/Results.tsv
index f117976..5dd0949 100644
--- a/share/html/Search/Results.tsv
+++ b/share/html/Search/Results.tsv
@@ -46,93 +46,115 @@
 %# 
 %# END BPS TAGGED BLOCK }}}
 <%ARGS>
+$Query => ''
 $OrderBy => 'id'
 $Order => 'ASC'
 </%ARGS>
 <%INIT>
 
 my $Tickets = RT::Tickets->new( $session{'CurrentUser'} );
-$Tickets->FromSQL( $ARGS{'Query'} );
+$Tickets->FromSQL( $Query );
 if ( $OrderBy =~ /\|/ ) {
-
-  # Multiple Sorts
-  my @OrderBy = split /\|/, $OrderBy;
-  my @Order   = split /\|/, $Order;
-  $Tickets->OrderByCols(
-    map { { FIELD => $OrderBy[$_], ORDER => $Order[$_] } }
-      ( 0 .. $#OrderBy ) );
+    # Multiple Sorts
+    my @OrderBy = split /\|/, $OrderBy;
+    my @Order   = split /\|/, $Order;
+    $Tickets->OrderByCols(
+        map { { FIELD => $OrderBy[$_], ORDER => $Order[$_] } }
+        ( 0 .. $#OrderBy )
+    );
 }
 else {
-  $Tickets->OrderBy( FIELD => $OrderBy, ORDER => $Order );
+    $Tickets->OrderBy( FIELD => $OrderBy, ORDER => $Order );
 }
 
-my @rows;
-my %known_cfs;
-
-my @attrs = qw( id QueueObj->Name Subject Status TimeEstimated TimeWorked TimeLeft Priority FinalPriority OwnerObj->Name 
-                Requestors->MemberEmailAddressesAsString Cc->MemberEmailAddressesAsString AdminCc->MemberEmailAddressesAsString
-                DueObj->ISO ToldObj->ISO CreatedObj->ISO ResolvedObj->ISO LastUpdatedObj->ISO);
+my %cf_id_to_name;
+my %cf_name_to_pos;
+{
+    my $cfs = RT::SQL::PossibleCustomFields(
+        Query => $Query, CurrentUser => $session{'CurrentUser'},
+    );
+    while ( my $cf = $cfs->Next ) {
+        my $name = $cf->Name;
+        $cf_id_to_name{ $cf->id } = $name;
+        next if $cf_name_to_pos{ $name };
 
-$r->content_type('application/vnd.ms-excel');
-while ( my $Ticket = $Tickets->Next()) {
-    my $row;
-    foreach my $attr (@attrs) {
-        if ($attr =~ /(.*)->ISO$/ and $Ticket->$1->Unix <= 0) {
-            $row->{$attr} = "";
-        } else {
-            my $method = '$Ticket->'.$attr.'()';
-            $method =~ s/->ISO\(\)$/->ISO( Timezone => 'user' )/;
-            $row->{$attr} = eval $method;
-            if ($@) {die "Failed to find $attr - ". $@}; 
-        }
+        $cf_name_to_pos{ $name } = 
+            (sort { $b <=> $a } values %cf_name_to_pos)[0] + 1;
     }
-
-    my $cfs = $Ticket->CustomFields;
-    while (my $cf = $cfs->Next) {
-        $known_cfs{$cf->Id} = $cf->Name;
-        my @content;
-        my $values = $Ticket->CustomFieldValues($cf->Id);
-        while (my $value = $values->Next) {
-            push @content, $value->Content;
-        }
-        $row->{'CustomField-'.$cf->Id} = join(', ', at content);
-    }
-    push @rows, $row;
 }
 
-{ 
+my @attrs = qw(
+    id QueueObj->Name Subject Status
+    TimeEstimated TimeWorked TimeLeft
+    Priority FinalPriority
+    OwnerObj->Name 
+    Requestors->MemberEmailAddressesAsString
+    Cc->MemberEmailAddressesAsString
+    AdminCc->MemberEmailAddressesAsString
+    DueObj->ISO ToldObj->ISO CreatedObj->ISO
+    ResolvedObj->ISO LastUpdatedObj->ISO
+);
+
+$r->content_type('application/vnd.ms-excel');
+{
     my @header;
     foreach my $attr (@attrs) {
         my $label = $attr;
         $label =~ s'Obj-.(?:AsString|Name|ISO)''g;
         $label =~ s'-\>MemberEmailAddressesAsString''g;
-	push @header, $label;
+        push @header, $label;
     }
-    foreach my $id (sort keys %known_cfs) {
-        push @header, "CF-".$known_cfs{$id}; 
+
+    $_ += @header - 1 foreach values %cf_name_to_pos;
+
+    foreach my $name ( sort { $cf_name_to_pos{$a} <=> $cf_name_to_pos{$a} } keys %cf_name_to_pos ) {
+        push @header, "CF-". $name;
     }
     $m->out(join("\t", @header));
     $m->out("\n");
+    $m->flush_buffer;
 }
 
-foreach my $row (@rows) {
+my $i = 0;
+while ( my $Ticket = $Tickets->Next()) {
     my @row;
-    foreach my $attr(@attrs) {
-        push @row, $row->{"$attr"};
+    foreach my $attr (@attrs) {
+        my $value;
+        if ($attr =~ /(.*)->ISO$/ and $Ticket->$1->Unix <= 0) {
+            $value = '';
+        } else {
+            my $method = '$Ticket->'.$attr.'()';
+            $method =~ s/->ISO\(\)$/->ISO( Timezone => 'user' )/;
+            $value = eval $method;
+            if ($@) {die "Failed to find $attr - ". $@}; 
+        }
+        push @row, $value;
     }
-    foreach my $id (sort keys %known_cfs) {
-        my $val = $row->{'CustomField-'.$id};
-        $val =~ s/(\n|\r)//g;
-        push @row, $val;
+
+    my $values = $Ticket->CustomFieldValues;
+    while (my $value = $values->Next) {
+        my $pos = $cf_name_to_pos{ $cf_id_to_name{ $value->CustomField } };
+        next unless $pos;
+
+        $row[$pos] = '' unless defined $row[$pos];
+        $row[$pos] .= ', ' if $row[$pos];
+        $row[$pos] .= $value->Content;
     }
 
     # remove tabs from all field values, they screw up the tsv
     for (@row) {
+        $_ = '' unless defined;
+        $_ =~ s/(?:\n|\r)//g;
         $_ =~ s{\t}{    }g;
     }
 
     $m->out(join("\t", at row));
     $m->out("\n");
+
+    unless (++$i%10) {
+        $i = 0;
+        $m->flush_buffer;
+    }
 }
 
 $m->abort();

-----------------------------------------------------------------------


More information about the Rt-commit mailing list