]> 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:45:10 +0000 (21:45 -0800)
committerMax Kanat-Alexander <mkanat@bugzilla.org>
Tue, 15 Feb 2011 05:45:10 +0000 (21:45 -0800)
r=glob, a=mkanat

Bugzilla/Search.pm
template/en/default/global/user-error.html.tmpl

index 4340025a877e5aa46c40c6c1372b1440565dd95f..c373f974dc20e3d50926950428af6e16219876a4 100644 (file)
@@ -1892,33 +1892,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 55846673028a500125b7ba6a9079ec60dc4bc575..28bb67d60de81bd877eda165c14cb1149b27c04c 100644 (file)
     field
   [% ELSIF class == "Bugzilla::Group" %]
     group
+  [% ELSIF class == "Bugzilla::Keyword" %]
+    keyword
   [% ELSIF class == "Bugzilla::Product" %]
     product
   [% ELSIF class == "Bugzilla::Search::Saved" %]