123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- # -*- Mode: perl; indent-tabs-mode: nil -*-
- #
- # The contents of this file are subject to the Mozilla Public
- # License Version 1.1 (the "License"); you may not use this file
- # except in compliance with the License. You may obtain a copy of
- # the License at http://www.mozilla.org/MPL/
- #
- # Software distributed under the License is distributed on an "AS
- # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
- # implied. See the License for the specific language governing
- # rights and limitations under the License.
- #
- # The Original Code is the Bugzilla Bug Tracking System.
- #
- # Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
- use strict;
- package Bugzilla::Keyword;
- use base qw(Bugzilla::Object);
- use Bugzilla::Error;
- use Bugzilla::Util;
- ###############################
- #### Initialization ####
- ###############################
- use constant DB_COLUMNS => qw(
- keyworddefs.id
- keyworddefs.name
- keyworddefs.description
- );
- use constant DB_TABLE => 'keyworddefs';
- use constant REQUIRED_CREATE_FIELDS => qw(name description);
- use constant VALIDATORS => {
- name => \&_check_name,
- description => \&_check_description,
- };
- use constant UPDATE_COLUMNS => qw(
- name
- description
- );
- ###############################
- #### Accessors ######
- ###############################
- sub description { return $_[0]->{'description'}; }
- sub bug_count {
- my ($self) = @_;
- return $self->{'bug_count'} if defined $self->{'bug_count'};
- ($self->{'bug_count'}) =
- Bugzilla->dbh->selectrow_array(
- 'SELECT COUNT(*) FROM keywords WHERE keywordid = ?',
- undef, $self->id);
- return $self->{'bug_count'};
- }
- ###############################
- #### Mutators #####
- ###############################
- sub set_name { $_[0]->set('name', $_[1]); }
- sub set_description { $_[0]->set('description', $_[1]); }
- ###############################
- #### Subroutines ######
- ###############################
- sub keyword_count {
- my ($count) =
- Bugzilla->dbh->selectrow_array('SELECT COUNT(*) FROM keyworddefs');
- return $count;
- }
- sub get_all_with_bug_count {
- my $class = shift;
- my $dbh = Bugzilla->dbh;
- my $keywords =
- $dbh->selectall_arrayref('SELECT ' . join(', ', DB_COLUMNS) . ',
- COUNT(keywords.bug_id) AS bug_count
- FROM keyworddefs
- LEFT JOIN keywords
- ON keyworddefs.id = keywords.keywordid ' .
- $dbh->sql_group_by('keyworddefs.id',
- 'keyworddefs.name,
- keyworddefs.description') . '
- ORDER BY keyworddefs.name', {'Slice' => {}});
- if (!$keywords) {
- return [];
- }
-
- foreach my $keyword (@$keywords) {
- bless($keyword, $class);
- }
- return $keywords;
- }
- ###############################
- ### Validators ###
- ###############################
- sub _check_name {
- my ($self, $name) = @_;
- $name = trim($name);
- $name eq "" && ThrowUserError("keyword_blank_name");
- if ($name =~ /[\s,]/) {
- ThrowUserError("keyword_invalid_name");
- }
- # We only want to validate the non-existence of the name if
- # we're creating a new Keyword or actually renaming the keyword.
- if (!ref($self) || $self->name ne $name) {
- my $keyword = new Bugzilla::Keyword({ name => $name });
- ThrowUserError("keyword_already_exists", { name => $name }) if $keyword;
- }
- return $name;
- }
- sub _check_description {
- my ($self, $desc) = @_;
- $desc = trim($desc);
- $desc eq '' && ThrowUserError("keyword_blank_description");
- return $desc;
- }
- 1;
- __END__
- =head1 NAME
- Bugzilla::Keyword - A Keyword that can be added to a bug.
- =head1 SYNOPSIS
- use Bugzilla::Keyword;
- my $count = Bugzilla::Keyword::keyword_count;
- 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::Object> methods. See
- L<Bugzilla::Object> for more details.
- =head1 SUBROUTINES
- This is only a list of subroutines specific to C<Bugzilla::Keyword>.
- See L<Bugzilla::Object> for more subroutines that this object
- implements.
- =over
- =item C<keyword_count()>
- Description: A utility function to get the total number
- of keywords defined. Mostly used to see
- if there are any keywords defined at all.
- Params: none
- Returns: An integer, the count of keywords.
- =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
|