1 # This module is part of debbugs, and
2 # is released under the terms of the GPL version 2, or any later
3 # version (at your option). See the file README and COPYING for more
5 # Copyright 2018 by Don Armstrong <don@donarmstrong.com>.
7 package Debbugs::Collection::Bug;
11 Debbugs::Collection::Bug -- Bug generation factory
15 This collection extends L<Debbugs::Collection> and contains members of
16 L<Debbugs::Bug>. Useful for any field which contains one or more bug or tracking
29 use namespace::autoclean;
30 use Debbugs::Common qw(make_list hash_slice);
32 use Debbugs::Status qw(get_bug_statuses);
33 use Debbugs::Collection::Package;
34 use Debbugs::Collection::Correspondent;
38 extends 'Debbugs::Collection';
40 =head2 my $bugs = Debbugs::Collection::Bug->new(%params|$param)
46 =item package_collection
48 Optional L<Debbugs::Collection::Package> which is used to look up packages
51 =item correspondent_collection
53 Optional L<Debbugs::Collection::Correspondent> which is used to look up correspondents
58 Optional arrayref of L<Debbugs::User> which set usertags for bugs in this collection
62 =head2 $bugs->package_collection()
64 Returns the package collection that this bug collection is using
66 =head2 $bugs->correspondent_collection()
68 Returns the correspondent collection that this bug collection is using
72 Returns the arrayref of users that this bug collection is using
74 =head2 $bugs->add_user($user)
76 Add a user to the set of users that this bug collection is using
78 =head2 $bugs->load_related_packages_and_versions()
80 Preload all of the related packages and versions for the bugs in this bug
81 collection. You should call this if you plan on calculating whether the bugs in
82 this collection are present/absent.
86 has '+members' => (isa => 'ArrayRef[Bug]');
87 has 'package_collection' =>
89 isa => 'Debbugs::Collection::Package',
90 builder => '_build_package_collection',
94 sub _build_package_collection {
96 return Debbugs::Collection::Package->new($self->has_schema?(schema => $self->schema):());
99 has 'correspondent_collection' =>
101 isa => 'Debbugs::Collection::Correspondent',
102 builder => '_build_correspondent_collection',
106 sub _build_correspondent_collection {
108 return Debbugs::Collection::Correspondent->new($self->has_schema?(schema => $self->schema):());
113 isa => 'ArrayRef[Debbugs::User]',
116 handles => {'add_user' => 'push'},
122 if (exists $args->{bugs}) {
124 $self->_member_constructor(bugs => $args->{bugs}
129 sub _member_constructor {
130 # handle being called $self->_member_constructor;
135 $schema = $self->schema if $self->has_schema;
137 if (defined $schema) {
138 my $statuses = get_bug_statuses(bug => [make_list($args{bugs})],
141 # preload as many of the packages as we need
143 while (my ($bug, $status) = each %{$statuses}) {
144 if (defined $status->{package}) {
145 $packages{$_} = 1 for split /,/, $status->{package};
147 if (defined $status->{source}) {
148 $packages{$_} = 1 for split /,/, $status->{source};
151 $self->package_collection->universe->add_by_key(keys %packages);
152 while (my ($bug, $status) = each %{$statuses}) {
154 Debbugs::Bug->new(bug => $bug,
156 Debbugs::Bug::Status->new(status => $status,
158 status_source => 'db',
161 package_collection =>
162 $self->package_collection->universe,
165 correspondent_collection =>
166 $self->correspondent_collection->universe,
167 @{$args{constructor_args}//[]},
171 for my $bug (make_list($args{bugs})) {
173 Debbugs::Bug->new(bug => $bug,
174 package_collection =>
175 $self->package_collection->universe,
178 correspondent_collection =>
179 $self->correspondent_collection->universe,
180 @{$args{constructor_args}//[]},
187 around add_by_key => sub {
191 $self->_member_constructor(bugs => [@_],
193 return $self->$orig(@members);
200 sub load_related_packages_and_versions {
202 my @related_packages_and_versions =
203 $self->map(sub {$_->related_packages_and_versions});
204 $self->package_collection->
205 add_packages_and_versions(@related_packages_and_versions);
208 __PACKAGE__->meta->make_immutable;
214 # indent-tabs-mode: nil
215 # cperl-indent-level: 4