[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