summaryrefslogtreecommitdiffstats
path: root/Bugzilla
diff options
context:
space:
mode:
Diffstat (limited to 'Bugzilla')
-rw-r--r--Bugzilla/Search.pm99
1 files changed, 23 insertions, 76 deletions
diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm
index 40c4ae32a..b21a3b385 100644
--- a/Bugzilla/Search.pm
+++ b/Bugzilla/Search.pm
@@ -317,8 +317,8 @@ use constant OPERATOR_FIELD_OVERRIDE => {
use constant SPECIAL_PARSING => {
# Pronoun Fields (Ones that can accept %user%, etc.)
assigned_to => \&_contact_pronoun,
- cc => \&_cc_pronoun,
- commenter => \&_commenter_pronoun,
+ cc => \&_contact_pronoun,
+ commenter => \&_contact_pronoun,
qa_contact => \&_contact_pronoun,
reporter => \&_contact_pronoun,
@@ -2022,11 +2022,11 @@ sub _contact_pronoun {
sub _contact_exact_group {
my ($self, $args) = @_;
- my ($value, $operator, $field, $chart_id, $joins) =
- @$args{qw(value operator field chart_id joins)};
+ my ($value, $operator, $field, $chart_id, $joins, $sequence) =
+ @$args{qw(value operator field chart_id joins sequence)};
my $dbh = Bugzilla->dbh;
my $user = $self->_user;
-
+
$value =~ /\%group\.([^%]+)%/;
my $group = Bugzilla::Group->check({ name => $1, _error => 'invalid_group_name' });
$group->check_members_are_visible();
@@ -2034,11 +2034,28 @@ sub _contact_exact_group {
|| ThrowUserError('invalid_group_name', {name => $group->name});
my $group_ids = Bugzilla::Group->flatten_group_membership($group->id);
+
+ if ($field eq 'cc' && $chart_id eq '') {
+ # This is for the email1, email2, email3 fields from query.cgi.
+ $chart_id = "CC$$sequence";
+ $args->{sequence}++;
+ }
+
+ my $from = $field;
+ # These fields need an additional table.
+ if ($field =~ /^(commenter|cc)$/) {
+ my $join_table = $field;
+ $join_table = 'longdescs' if $field eq 'commenter';
+ my $join_table_alias = "${field}_$chart_id";
+ push(@$joins, { table => $join_table, as => $join_table_alias });
+ $from = "$join_table_alias.who";
+ }
+
my $table = "user_group_map_$chart_id";
my $join = {
table => 'user_group_map',
as => $table,
- from => $field,
+ from => $from,
to => 'user_id',
extra => [$dbh->sql_in("$table.group_id", $group_ids),
"$table.isbless = 0"],
@@ -2052,76 +2069,6 @@ sub _contact_exact_group {
}
}
-sub _cc_pronoun {
- my ($self, $args) = @_;
- my ($full_field, $value) = @$args{qw(full_field value)};
- my $user = $self->_user;
-
- if ($value =~ /\%group/) {
- return $self->_cc_exact_group($args);
- }
- elsif ($value =~ /^(%\w+%)$/) {
- $args->{value} = pronoun($1, $user);
- $args->{quoted} = $args->{value};
- $args->{value_is_id} = 1;
- }
-}
-
-sub _cc_exact_group {
- my ($self, $args) = @_;
- my ($chart_id, $sequence, $joins, $operator, $value) =
- @$args{qw(chart_id sequence joins operator value)};
- my $user = $self->_user;
- my $dbh = Bugzilla->dbh;
-
- $value =~ m/%group\.([^%]+)%/;
- my $group = Bugzilla::Group->check({ name => $1, _error => 'invalid_group_name' });
- $group->check_members_are_visible();
- $user->in_group($group)
- || ThrowUserError('invalid_group_name', {name => $group->name});
-
- my $all_groups = Bugzilla::Group->flatten_group_membership($group->id);
-
- # This is for the email1, email2, email3 fields from query.cgi.
- if ($chart_id eq "") {
- $chart_id = "CC$$sequence";
- $args->{sequence}++;
- }
-
- my $cc_table = "cc_$chart_id";
- push(@$joins, { table => 'cc', as => $cc_table });
- my $group_table = "user_group_map_$chart_id";
- my $group_join = {
- table => 'user_group_map',
- as => $group_table,
- from => "$cc_table.who",
- to => 'user_id',
- extra => [$dbh->sql_in("$group_table.group_id", $all_groups),
- "$group_table.isbless = 0"],
- };
- push(@$joins, $group_join);
-
- if ($operator =~ /^not/) {
- $args->{term} = "$group_table.group_id IS NULL";
- }
- else {
- $args->{term} = "$group_table.group_id IS NOT NULL";
- }
-}
-
-# XXX This should probably be merged with cc_pronoun.
-sub _commenter_pronoun {
- my ($self, $args) = @_;
- my $value = $args->{value};
- my $user = $self->_user;
-
- if ($value =~ /^(%\w+%)$/) {
- $args->{value} = pronoun($1, $user);
- $args->{quoted} = $args->{value};
- $args->{value_is_id} = 1;
- }
-}
-
#####################################################################
# Search Functions
#####################################################################