]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 490322: Make "allwords" work with the keywords field, again.
authorMax Kanat-Alexander <mkanat@bugzilla.org>
Tue, 15 Feb 2011 05:44:32 +0000 (21:44 -0800)
committerMax Kanat-Alexander <mkanat@bugzilla.org>
Tue, 15 Feb 2011 05:44:32 +0000 (21:44 -0800)
r=glob, a=mkanat

Bugzilla/Search.pm
template/en/default/global/user-error.html.tmpl
xt/lib/Bugzilla/Test/Search/Constants.pm

index a06dcb4419e222ebf69518e20a5d45ede0713ecb..025c11e8c90c077380a4ae574a084b08f6fedc55 100644 (file)
@@ -2089,33 +2089,26 @@ sub _keywords_exact {
     my ($chartid, $v, $ff, $f, $t, $term, $supptables) =
         @func_args{qw(chartid v ff f t term supptables)};
 
-    my @list;
+    my @keyword_ids;
+    foreach my $word (split(/[\s,]+/, $$v)) {
+        next if $word eq '';
+        my $keyword = Bugzilla::Keyword->check($word);
+        push(@keyword_ids, $keyword->id);
+    }
+
     my $table = "keywords_$$chartid";
-    foreach my $value (split(/[\s,]+/, $$v)) {
-        if ($value eq '') {
-            next;
-        }
-        my $keyword = new Bugzilla::Keyword({name => $value});
-        if ($keyword) {
-            push(@list, "$table.keywordid = " . $keyword->id);
-        }
-        else {
-            ThrowUserError("unknown_keyword",
-                           { keyword => $$v });
-        }
+    my $id_field = "$table.keywordid";
+    if ($$t eq 'anywords' or $$t eq 'anyexact') {
+        my $dbh = Bugzilla->dbh;
+        $$term = $dbh->sql_in($id_field, \@keyword_ids);
     }
-    my $haveawordterm;
-    if (@list) {
-        $haveawordterm = "(" . join(' OR ', @list) . ")";
-        if ($$t eq "anywords") {
-            $$term = $haveawordterm;
-        } elsif ($$t eq "allwords") {
-            $self->_allwords;
-            if ($$term && $haveawordterm) {
-                $$term = "(($$term) AND $haveawordterm)";
-            }
-        }
+    if ($$t eq 'allwords') {
+       my @terms = 
+         map { "bugs.bug_id IN (SELECT bug_id FROM keywords WHERE keywordid = $_)" } @keyword_ids;
+       $$term = join(' AND ', @terms);
+       return;
     }
+
     if ($$term) {
         push(@$supptables, "LEFT JOIN keywords AS $table " .
                            "ON $table.bug_id = bugs.bug_id");
index bd9fb0a5b1ffd5040e8b50221d9809a3abb2554f..f2cf053a52277092228dd5ff9d948ed04fe64187 100644 (file)
     field
   [% ELSIF class == "Bugzilla::Group" %]
     group
+  [% ELSIF class == "Bugzilla::Keyword" %]
+    keyword
   [% ELSIF class == "Bugzilla::Product" %]
     product
   [% ELSIF class == "Bugzilla::Search::Recent" %]
index 7fe7d0efa4e1f98654bcb7dcf1a2851f4ec9beb8..01a27a9312e4d50be7e71ce26ee6f5dd85d55315 100644 (file)
@@ -291,7 +291,6 @@ use constant ALLWORDS_BROKEN => (
     ATTACHMENT_BOOLEANS_SEARCH_BROKEN,
     bug_group => { contains => [1] },
     cc        => { contains => [1] },
-    keywords  => { contains => [1] },
     longdesc  => { contains => [1] },
     work_time => { contains => [1] },
     percentage_complete => { contains => [2,3,4,5] },
@@ -428,7 +427,10 @@ use constant KNOWN_BROKEN => {
         bug_group => { contains => [3,4,5] },
     },
 
-    'allwordssubstr-<1>' => { ALLWORDS_BROKEN },
+    'allwordssubstr-<1>' => { 
+        ALLWORDS_BROKEN, 
+        keywords => { contains => [1] } 
+    },
     'allwordssubstr-<1>,<2>' => {
         ATTACHMENT_BOOLEANS_SEARCH_BROKEN,
         percentage_complete => { contains => [1,2,3,4,5] },