(except some changes not merged; will do them later) Conflicts: docs/en/rst/administration.rst docs/en/rst/installation.rst docs/en/rst/using.rst git-svn-id: svn://10.0.0.236/trunk@265740 18797224-902f-48f8-a5cc-f745e15eee43
112 lines
3.0 KiB
Perl
112 lines
3.0 KiB
Perl
# 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 parent 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(
|
|
attach_data.thedata
|
|
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 ) {
|
|
# XXX - Hack till bug 916882 is fixed.
|
|
my $operator = scalar(@args) == 3 ? $args[1] : $args[0]->{operator};
|
|
ThrowUserError('search_grouped_field_invalid', { field => $field })
|
|
unless (($field eq 'product' || $field eq 'component') && $operator =~ /^changed/);
|
|
}
|
|
|
|
$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;
|
|
|
|
=head1 B<Methods in need of POD>
|
|
|
|
=over
|
|
|
|
=item add
|
|
|
|
=item update_search_args
|
|
|
|
=back
|