]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 660866: Allow editing of old "boolean chart" searches using the new
authorMax Kanat-Alexander <mkanat@bugzilla.org>
Tue, 14 Jun 2011 03:14:01 +0000 (20:14 -0700)
committerMax Kanat-Alexander <mkanat@bugzilla.org>
Tue, 14 Jun 2011 03:14:01 +0000 (20:14 -0700)
"custom search" UI controls on the advanced search form.
r=mkanat, a=mkanat (module owner)

Bugzilla/Search.pm
Bugzilla/Search/Clause.pm
Bugzilla/Search/Condition.pm
query.cgi

index 3ec5394b9fee72414c3d1080cf3898331ad3ac14..ffbc28f9f6591abd10561f8718978b5a87598440 100644 (file)
@@ -719,6 +719,25 @@ sub search_description {
     return $self->{'search_description'};
 }
 
+sub boolean_charts_to_custom_search {
+    my ($self, $cgi_buffer) = @_;
+    my @as_params = $self->_boolean_charts->as_params;
+
+    # We need to start our new ids after the last custom search "f" id.
+    # We can just pick the last id in the array because they are sorted
+    # numerically.
+    my $last_id = ($self->_field_ids)[-1];
+    my $count = defined($last_id) ? $last_id + 1 : 0;
+    foreach my $param_set (@as_params) {
+        foreach my $name (keys %$param_set) {
+            my $value = $param_set->{$name};
+            next if !defined $value;
+            $cgi_buffer->param($name . $count, $value);
+        }
+        $count++;
+    }
+}
+
 ######################
 # Internal Accessors #
 ######################
@@ -1542,15 +1561,10 @@ sub _boolean_charts {
 sub _custom_search {
     my ($self) = @_;
     my $params = $self->_params;
-    my @param_list = keys %$params;
-    
-    my @field_params = grep { /^f\d+$/ } @param_list;
-    my @field_ids = map { /(\d+)/; $1 } @field_params;
-    @field_ids = sort { $a <=> $b } @field_ids;
-    
+
     my $current_clause = new Bugzilla::Search::Clause($params->{j_top});
     my @clause_stack;
-    foreach my $id (@field_ids) {
+    foreach my $id ($self->_field_ids) {
         my $field = $params->{"f$id"};
         if ($field eq 'OP') {
             my $joiner = $params->{"j$id"};
@@ -1581,6 +1595,17 @@ sub _custom_search {
     return $clause_stack[0] || $current_clause;
 }
 
+sub _field_ids {
+    my ($self) = @_;
+    my $params = $self->_params;
+    my @param_list = keys %$params;
+    
+    my @field_params = grep { /^f\d+$/ } @param_list;
+    my @field_ids = map { /(\d+)/; $1 } @field_params;
+    @field_ids = sort { $a <=> $b } @field_ids;
+    return @field_ids;
+}
+
 sub _handle_chart {
     my ($self, $chart_id, $condition) = @_;
     my $dbh = Bugzilla->dbh;
index aa87842afd1a66435cfc67c37b0c3733f3fb37fa..a068ce5ed4a5f636de5690e70d19646c3edb5bcd 100644 (file)
@@ -44,19 +44,14 @@ sub children {
 
 sub joiner { return $_[0]->{joiner} }
 
-sub has_children {
-    my ($self) = @_;
-    return scalar(@{ $self->children }) > 0 ? 1 : 0;
-}
-
-sub has_valid_conditions {
+sub has_translated_conditions {
     my ($self) = @_;
     my $children = $self->children;
     return 1 if grep { $_->isa('Bugzilla::Search::Condition')
                        && $_->translated } @$children;
     foreach my $child (@$children) {
         next if $child->isa('Bugzilla::Search::Condition');
-        return 1 if $child->has_valid_conditions;
+        return 1 if $child->has_translated_conditions;
     }
     return 0;
 }
@@ -100,7 +95,7 @@ sub as_string {
     my ($self) = @_;
     my @strings;
     foreach my $child (@{ $self->children }) {
-        next if $child->isa(__PACKAGE__) && !$child->has_valid_conditions;
+        next if $child->isa(__PACKAGE__) && !$child->has_translated_conditions;
         next if $child->isa('Bugzilla::Search::Condition')
                 && !$child->translated;
 
@@ -119,5 +114,25 @@ sub as_string {
     return $sql;
 }
 
+# Search.pm converts URL parameters to Clause objects. This helps do the
+# reverse.
+sub as_params {
+    my ($self) = @_;
+    my @params;
+    foreach my $child (@{ $self->children }) {
+        if ($child->isa(__PACKAGE__)) {
+            my %open_paren = (f => 'OP', n => scalar $child->negate,
+                              j => $child->joiner);
+            push(@params, \%open_paren);
+            push(@params, $child->as_params);
+            my %close_paren =  (f => 'CP');
+            push(@params, \%close_paren);
+        }
+        else {
+            push(@params, $child->as_params);
+        }
+    }
+    return @params;
+}
 
-1;
\ No newline at end of file
+1;
index 8fe05f0650d8d99316ce2e38ad5061cb9bc419a4..2268da19743d122aa6a95aac16902e3db1a780e6 100644 (file)
@@ -55,6 +55,12 @@ sub as_string {
     return $term;
 }
 
+sub as_params {
+    my ($self) = @_;
+    return { f => $self->field, o => $self->operator, v => $self->value,
+             n => scalar $self->negate };
+}
+
 sub negate {
     my ($self, $value) = @_;
     if (@_ == 2) {
@@ -73,4 +79,4 @@ sub condition {
                               value => $value });
 }
 
-1;
\ No newline at end of file
+1;
index 097701b6341331cfe2dbf2c8f534c6e89c59fa89..93de62b63d27fcf39ccaa41c403c02873630287a 100755 (executable)
--- a/query.cgi
+++ b/query.cgi
@@ -80,6 +80,16 @@ sub PrefillForm {
     $buf = new Bugzilla::CGI($buf);
     my $foundone = 0;
 
+    # If there are old-style boolean charts in the URL (from an old saved
+    # search or from an old link on the web somewhere) then convert them
+    # to the new "custom search" format so that the form is populated
+    # properly.
+    my $any_boolean_charts = grep { /^field-?\d+/ } $buf->param();
+    if ($any_boolean_charts) {
+        my $search = new Bugzilla::Search(params => scalar $buf->Vars);
+        $search->boolean_charts_to_custom_search($buf);
+    }
+
     # Query parameters that don't represent form fields on this page.
     my @skip = qw(format query_format list_id columnlist);