From: Max Kanat-Alexander Date: Mon, 29 Mar 2010 21:17:54 +0000 (-0700) Subject: Bug 554986: Add a "notmatches" search type, which allows the minus sign X-Git-Tag: bugzilla-3.6~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a7c6ef1a5a43f97f0a1f3731e74a5bfb42e7b83d;p=thirdparty%2Fbugzilla.git Bug 554986: Add a "notmatches" search type, which allows the minus sign operator to start working for bare words in Quicksearch again r=LpSolit, a=LpSolit --- diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm index 91cd7f73bb..630cdd7d5a 100644 --- a/Bugzilla/Search.pm +++ b/Bugzilla/Search.pm @@ -612,7 +612,7 @@ sub init { "^long_?desc,changedby" => \&_long_desc_changedby, "^long_?desc,changedbefore" => \&_long_desc_changedbefore_after, "^long_?desc,changedafter" => \&_long_desc_changedbefore_after, - "^content,matches" => \&_content_matches, + "^content,(?:not)?matches" => \&_content_matches, "^content," => sub { ThrowUserError("search_content_without_matches"); }, "^(?:deadline|creation_ts|delta_ts),(?:lessthan|greaterthan|equals|notequals),(?:-|\\+)?(?:\\d+)(?:[dDwWmMyY])\$" => \&_timestamp_compare, "^commenter,(?:equals|anyexact),(%\\w+%)" => \&_commenter_exact, @@ -656,6 +656,7 @@ sub init { ",notregexp" => \&_notregexp, ",lessthan" => \&_lessthan, ",matches" => sub { ThrowUserError("search_content_without_matches"); }, + ",notmatches" => sub { ThrowUserError("search_content_without_matches"); }, ",greaterthan" => \&_greaterthan, ",anyexact" => \&_anyexact, ",anywordssubstr" => \&_anywordsubstr, @@ -1415,8 +1416,8 @@ sub _long_desc_changedbefore_after { sub _content_matches { my $self = shift; my %func_args = @_; - my ($chartid, $supptables, $term, $groupby, $fields, $v) = - @func_args{qw(chartid supptables term groupby fields v)}; + my ($chartid, $supptables, $term, $groupby, $fields, $t, $v) = + @func_args{qw(chartid supptables term groupby fields t v)}; my $dbh = Bugzilla->dbh; # "content" is an alias for columns containing text for which we @@ -1443,19 +1444,21 @@ sub _content_matches { # The term to use in the WHERE clause. $$term = "$term1 > 0 OR $term2 > 0"; + if ($$t =~ /not/i) { + $$term = "NOT($$term)"; + } # In order to sort by relevance (in case the user requests it), # we SELECT the relevance value so we can add it to the ORDER BY # clause. Every time a new fulltext chart isadded, this adds more - # terms to the relevance sql. (That doesn't make sense in - # "NOT" charts, but Bugzilla never uses those with fulltext - # by default.) + # terms to the relevance sql. # # We build the relevance SQL by modifying the COLUMNS list directly, # which is kind of a hack but works. my $current = COLUMNS->{'relevance'}->{name}; $current = $current ? "$current + " : ''; - my $select_term = "($current$rterm1 + $rterm2)"; + # For NOT searches, we just add 0 to the relevance. + my $select_term = $$t =~ /not/ ? 0 : "($current$rterm1 + $rterm2)"; COLUMNS->{'relevance'}->{name} = $select_term; } diff --git a/Bugzilla/Search/Quicksearch.pm b/Bugzilla/Search/Quicksearch.pm index 3732be76d2..65dc085a79 100644 --- a/Bugzilla/Search/Quicksearch.pm +++ b/Bugzilla/Search/Quicksearch.pm @@ -569,19 +569,10 @@ sub matchPrefixes { sub negateComparisonType { my $comparisonType = shift; - if ($comparisonType eq 'substring') { - return 'notsubstring'; - } - elsif ($comparisonType eq 'anywords') { + if ($comparisonType eq 'anywords') { return 'nowords'; } - elsif ($comparisonType eq 'regexp') { - return 'notregexp'; - } - else { - # Don't know how to negate that - ThrowCodeError('unknown_comparison_type'); - } + return "not$comparisonType"; } # Add a boolean chart diff --git a/template/en/default/global/code-error.html.tmpl b/template/en/default/global/code-error.html.tmpl index b8a87fb58b..753695b2d5 100644 --- a/template/en/default/global/code-error.html.tmpl +++ b/template/en/default/global/code-error.html.tmpl @@ -431,9 +431,6 @@ An error occurred while preparing for a RADIUS authentication request: [% errstr FILTER html %]. - [% ELSIF error == "unknown_comparison_type" %] - Specified comparison type is not supported. - [% ELSIF error == "request_queue_group_invalid" %] The group field [% group FILTER html %] is invalid. diff --git a/template/en/default/global/field-descs.none.tmpl b/template/en/default/global/field-descs.none.tmpl index 4ada8c0665..0c17e57033 100644 --- a/template/en/default/global/field-descs.none.tmpl +++ b/template/en/default/global/field-descs.none.tmpl @@ -49,6 +49,7 @@ "changedto" => "changed to", "changedby" => "changed by", "matches" => "matches", + "notmatches" => "does not match", } %] [% field_types = { ${constants.FIELD_TYPE_UNKNOWN} => "Unknown Type", diff --git a/template/en/default/list/list.html.tmpl b/template/en/default/list/list.html.tmpl index 8a82081033..696e868a49 100644 --- a/template/en/default/list/list.html.tmpl +++ b/template/en/default/list/list.html.tmpl @@ -83,7 +83,7 @@ 'notequals', 'regexp', 'notregexp', 'lessthan', 'lessthaneq', 'greaterthan', 'greaterthaneq', 'changedbefore', 'changedafter', 'changedfrom', 'changedto', 'changedby', 'notsubstring', 'nowords', - 'nowordssubstr', + 'nowordssubstr', 'notmatches', ] %]