bugzilla-4intranet/Bugzilla/Keyword.pm

111 lines
2.7 KiB
Perl

# Keyword value type, rewritten to be just like normal multi-select value
# License: Dual-license GPL 3.0+ or MPL 1.1+
# Contributor(s): Vitaliy Filippov <vitalif@mail.ru>
package Bugzilla::Keyword;
use strict;
use base qw(Bugzilla::Field::Choice);
use Bugzilla::Error;
use Bugzilla::Util;
use constant DB_TABLE => 'keywords';
use constant FIELD_NAME => 'keywords';
use constant DB_COLUMNS => (Bugzilla::Field::Choice->DB_COLUMNS, 'description');
use constant UPDATE_COLUMNS => (Bugzilla::Field::Choice->UPDATE_COLUMNS, 'description');
use constant REQUIRED_CREATE_FIELDS => qw(value description);
use constant VALIDATORS => {
%{ Bugzilla::Field::Choice->VALIDATORS },
description => \&_check_description,
};
sub description { $_[0]->{description} }
sub set_description { $_[0]->set('description', $_[1]); }
sub _check_description
{
my ($self, $desc) = @_;
$desc = trim($desc);
$desc eq '' && ThrowUserError("keyword_blank_description");
return $desc;
}
sub get_all_with_bug_count
{
my $class = shift;
my $dbh = Bugzilla->dbh;
my $keywords = $dbh->selectall_arrayref(
'SELECT k.*, COUNT(1) AS bug_count' .
' FROM keywords k LEFT JOIN bug_keywords b ON k.id = b.value_id ' .
' GROUP BY k.id ORDER BY k.sortkey, k.value', {Slice => {}}
);
return [] unless $keywords;
foreach my $keyword (@$keywords)
{
bless $keyword, $class;
}
return $keywords;
}
sub get_by_match
{
my $self = shift;
my ($keywords, @match_items);
my $dbh = Bugzilla->dbh;
foreach (@_)
{
push @match_items, "value LIKE ".$dbh->quote($_.'%');
}
if (@match_items)
{
return $self->_do_list_select(join(' OR ', @match_items));
}
return [];
}
1;
__END__
=head1 NAME
Bugzilla::Keyword - A Keyword that can be added to a bug.
=head1 SYNOPSIS
use Bugzilla::Keyword;
my $description = $keyword->description;
my $keywords = Bugzilla::Keyword->get_all_with_bug_count();
=head1 DESCRIPTION
Bugzilla::Keyword represents a keyword that can be added to a bug.
This implements all standard C<Bugzilla::Field::Choice> methods.
=head1 SUBROUTINES
This is only a list of subroutines specific to C<Bugzilla::Keyword>.
See L<Bugzilla::Field::Choice> for more subroutines that this object
implements.
=over
=item C<get_all_with_bug_count()>
Description: Returns all defined keywords. This is an efficient way
to get the associated bug counts, as only one SQL query
is executed with this method, instead of one per keyword
when calling get_all and then bug_count.
Params: none
Returns: A reference to an array of Keyword objects, or an empty
arrayref if there are no keywords.
=back
=cut