1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
package Bugzilla::Search::ClauseGroup;
use 5.10.1;
use strict;
use warnings;
use base qw(Bugzilla::Search::Clause);
use Bugzilla::Error;
use Bugzilla::Search::Condition qw(condition);
use Bugzilla::Util qw(trick_taint);
use List::MoreUtils qw(uniq);
use constant UNSUPPORTED_FIELDS => qw(
classification
commenter
component
longdescs.count
product
owner_idle_time
);
sub new {
my ($class) = @_;
my $self = bless({ joiner => 'AND' }, $class);
# Add a join back to the bugs table which will be used to group conditions
# for this clause
my $condition = Bugzilla::Search::Condition->new({});
$condition->translated({
joins => [{
table => 'bugs',
as => 'bugs_g0',
from => 'bug_id',
to => 'bug_id',
extra => [],
}],
term => '1 = 1',
});
$self->SUPER::add($condition);
$self->{group_condition} = $condition;
return $self;
}
sub add {
my ($self, @args) = @_;
my $field = scalar(@args) == 3 ? $args[0] : $args[0]->{field};
# We don't support nesting of conditions under this clause
if (scalar(@args) == 1 && !$args[0]->isa('Bugzilla::Search::Condition')) {
ThrowUserError('search_grouped_invalid_nesting');
}
# Ensure all conditions use the same field
if (!$self->{_field}) {
$self->{_field} = $field;
} elsif ($field ne $self->{_field}) {
ThrowUserError('search_grouped_field_mismatch');
}
# Unsupported fields
if (grep { $_ eq $field } UNSUPPORTED_FIELDS ) {
ThrowUserError('search_grouped_field_invalid', { field => $field });
}
$self->SUPER::add(@args);
}
sub update_search_args {
my ($self, $search_args) = @_;
# No need to change things if there's only one child condition
return unless scalar(@{ $self->children }) > 1;
# we want all the terms to use the same join table
if (!exists $self->{_first_chart_id}) {
$self->{_first_chart_id} = $search_args->{chart_id};
} else {
$search_args->{chart_id} = $self->{_first_chart_id};
}
my $suffix = '_g' . $self->{_first_chart_id};
$self->{group_condition}->{translated}->{joins}->[0]->{as} = "bugs$suffix";
$search_args->{full_field} =~ s/^bugs\./bugs$suffix\./;
$search_args->{table_suffix} = $suffix;
$search_args->{bugs_table} = "bugs$suffix";
}
1;
|