From d50d167b256c38cc51e19741dbd61a296a4f115e Mon Sep 17 00:00:00 2001 From: "bbaetz%student.usyd.edu.au" Date: Mon, 18 Nov 2002 02:03:31 +0000 Subject: [PATCH] Bug 179960 - Qucksearch queries are slow and timeout fixed by adding subselect emulation for product/component lookups r=joel, a=justdave git-svn-id: svn://10.0.0.236/trunk@134029 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/webtools/bugzilla/Bugzilla/Search.pm | 39 +++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/mozilla/webtools/bugzilla/Bugzilla/Search.pm b/mozilla/webtools/bugzilla/Bugzilla/Search.pm index c80bb99e709..3ac654ccc7e 100644 --- a/mozilla/webtools/bugzilla/Bugzilla/Search.pm +++ b/mozilla/webtools/bugzilla/Bugzilla/Search.pm @@ -514,17 +514,22 @@ sub init { }, "^component,(?!changed)" => sub { - my $table = "components_$chartid"; - push(@supptables, "components $table"); - push(@wherepart, "bugs.component_id = $table.id"); - $f = $ff = "$table.name"; + $f = $ff = "components.name"; + $funcsbykey{",$t"}->(); + $term = build_subselect("bugs.component_id", + "components.id", + "components", + $term); }, "^product,(?!changed)" => sub { - my $table = "products_$chartid"; - push(@supptables, "products $table"); - push(@wherepart, "bugs.product_id = $table.id"); - $f = $ff = "$table.name"; + # Generate the restriction condition + $f = $ff = "products.name"; + $funcsbykey{",$t"}->(); + $term = build_subselect("bugs.product_id", + "products.id", + "products", + $term); }, "^keywords," => sub { @@ -591,9 +596,12 @@ sub init { ",casesubstring" => sub { $term = "INSTR($ff, $q)"; }, - ",(substring|substr)" => sub { + ",substring" => sub { $term = "INSTR(LOWER($ff), " . lc($q) . ")"; }, + ",substr" => sub { + $funcsbykey{",substring"}->(); + }, ",notsubstring" => sub { $term = "INSTR(LOWER($ff), " . lc($q) . ") = 0"; }, @@ -1016,6 +1024,19 @@ sub ListIDsForEmail { return $list; } +sub build_subselect { + my ($outer, $inner, $table, $cond) = @_; + my $q = "SELECT $inner FROM $table WHERE $cond"; + #return "$outer IN ($q)"; + &::SendSQL($q); + my @list; + while (&::MoreSQLData()) { + push (@list, &::FetchOneColumn()); + } + return "1=2" unless @list; # Could use boolean type on dbs which support it + return "$outer IN (" . join(',', @list) . ")"; +} + sub GetByWordList { my ($field, $strs) = (@_); my @list;