Initial patch.
[vuplus_webkit] / Websites / bugs.webkit.org / Bugzilla / Keyword.pm
diff --git a/Websites/bugs.webkit.org/Bugzilla/Keyword.pm b/Websites/bugs.webkit.org/Bugzilla/Keyword.pm
new file mode 100644 (file)
index 0000000..2152b33
--- /dev/null
@@ -0,0 +1,189 @@
+# -*- 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