X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FCollection%2FBug.pm;h=3f40b0c04f098b9501010ef3689b4c6cc15850d3;hb=5a7782659ac62794af83a978f281e66db52d80ea;hp=c773b59d043d0474191ddebdbe4d99913035b698;hpb=6c394ce0b251043584781b99e303e49014d9ae09;p=debbugs.git diff --git a/Debbugs/Collection/Bug.pm b/Debbugs/Collection/Bug.pm index c773b59..3f40b0c 100644 --- a/Debbugs/Collection/Bug.pm +++ b/Debbugs/Collection/Bug.pm @@ -12,11 +12,16 @@ Debbugs::Collection::Bug -- Bug generation factory =head1 SYNOPSIS +This collection extends L and contains members of +L. Useful for any field which contains one or more bug or tracking +lists of packages =head1 DESCRIPTION +=head1 METHODS + =cut use Mouse; @@ -32,6 +37,52 @@ use Debbugs::Bug; extends 'Debbugs::Collection'; +=head2 my $bugs = Debbugs::Collection::Bug->new(%params|$param) + +Parameters in addition to those defined by L + +=over + +=item package_collection + +Optional L which is used to look up packages + + +=item correspondent_collection + +Optional L which is used to look up correspondents + + +=item users + +Optional arrayref of L which set usertags for bugs in this collection + +=back + +=head2 $bugs->package_collection() + +Returns the package collection that this bug collection is using + +=head2 $bugs->correspondent_collection() + +Returns the correspondent collection that this bug collection is using + +=head2 $bugs->users() + +Returns the arrayref of users that this bug collection is using + +=head2 $bugs->add_user($user) + +Add a user to the set of users that this bug collection is using + +=head2 $bugs->load_related_packages_and_versions() + +Preload all of the related packages and versions for the bugs in this bug +collection. You should call this if you plan on calculating whether the bugs in +this collection are present/absent. + +=cut + has '+members' => (isa => 'ArrayRef[Bug]'); has 'package_collection' => (is => 'ro', @@ -57,6 +108,14 @@ sub _build_correspondent_collection { return Debbugs::Collection::Correspondent->new($self->has_schema?(schema => $self->schema):()); } +has 'users' => + (is => 'ro', + isa => 'ArrayRef[Debbugs::User]', + traits => ['Array'], + default => sub {[]}, + handles => {'add_user' => 'push'}, + ); + sub BUILD { my $self = shift; my $args = shift; @@ -79,10 +138,25 @@ sub _member_constructor { my $statuses = get_bug_statuses(bug => [make_list($args{bugs})], schema => $schema, ); + # preload as many of the packages as we need + my %packages; + while (my ($bug, $status) = each %{$statuses}) { + if (defined $status->{package}) { + $packages{$_} = 1 for split /,/, $status->{package}; + } + if (defined $status->{source}) { + $packages{$_} = 1 for split /,/, $status->{source}; + } + } + $self->package_collection->universe->add_by_key(keys %packages); while (my ($bug, $status) = each %{$statuses}) { push @return, Debbugs::Bug->new(bug => $bug, - status => $status, + status => + Debbugs::Bug::Status->new(status => $status, + bug => $bug, + status_source => 'db', + ), schema => $schema, package_collection => $self->package_collection->universe, @@ -126,7 +200,7 @@ sub member_key { sub load_related_packages_and_versions { my $self = shift; my @related_packages_and_versions = - $self->map(sub {$_->related_packages_and_versions}); + $self->apply(sub {$_->related_packages_and_versions}); $self->package_collection-> add_packages_and_versions(@related_packages_and_versions); }