summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kanat-Alexander <mkanat@bugzilla.org>2011-06-14 05:14:01 +0200
committerMax Kanat-Alexander <mkanat@bugzilla.org>2011-06-14 05:14:01 +0200
commit79542d43011ee798f0b9b72976b6cb0ef033b84f (patch)
tree061c2aad27ba71bb2a7a881e044fd4de298e03ba
parentb394ae8af69ff1ac1f725bb517d91caa92861ae2 (diff)
downloadbugzilla-79542d43011ee798f0b9b72976b6cb0ef033b84f.tar.gz
bugzilla-79542d43011ee798f0b9b72976b6cb0ef033b84f.tar.xz
Bug 660866: Allow editing of old "boolean chart" searches using the new
"custom search" UI controls on the advanced search form. r=mkanat, a=mkanat (module owner)
-rw-r--r--Bugzilla/Search.pm39
-rw-r--r--Bugzilla/Search/Clause.pm33
-rw-r--r--Bugzilla/Search/Condition.pm8
-rwxr-xr-xquery.cgi10
4 files changed, 73 insertions, 17 deletions
diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm
index 3ec5394b9..ffbc28f9f 100644
--- a/Bugzilla/Search.pm
+++ b/Bugzilla/Search.pm
@@ -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;
diff --git a/Bugzilla/Search/Clause.pm b/Bugzilla/Search/Clause.pm
index aa87842af..a068ce5ed 100644
--- a/Bugzilla/Search/Clause.pm
+++ b/Bugzilla/Search/Clause.pm
@@ -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;
diff --git a/Bugzilla/Search/Condition.pm b/Bugzilla/Search/Condition.pm
index 8fe05f065..2268da197 100644
--- a/Bugzilla/Search/Condition.pm
+++ b/Bugzilla/Search/Condition.pm
@@ -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;
diff --git a/query.cgi b/query.cgi
index 097701b63..93de62b63 100755
--- 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);