aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/DB
diff options
context:
space:
mode:
Diffstat (limited to 'perllib/FixMyStreet/DB')
-rw-r--r--perllib/FixMyStreet/DB/Result/Problem.pm21
-rw-r--r--perllib/FixMyStreet/DB/Result/User.pm12
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/UserPlannedReport.pm12
3 files changed, 36 insertions, 9 deletions
diff --git a/perllib/FixMyStreet/DB/Result/Problem.pm b/perllib/FixMyStreet/DB/Result/Problem.pm
index 720e8cc93..19e76f6ed 100644
--- a/perllib/FixMyStreet/DB/Result/Problem.pm
+++ b/perllib/FixMyStreet/DB/Result/Problem.pm
@@ -502,13 +502,20 @@ Returns a hashref of bodies to which a report was sent.
=cut
-sub bodies($) {
- my $self = shift;
- return {} unless $self->bodies_str;
- my $bodies = $self->bodies_str_ids;
- my @bodies = $self->result_source->schema->resultset('Body')->search({ id => $bodies })->all;
- return { map { $_->id => $_ } @bodies };
-}
+has bodies => (
+ is => 'ro',
+ lazy => 1,
+ default => sub {
+ my $self = shift;
+ return {} unless $self->bodies_str;
+ my $bodies = $self->bodies_str_ids;
+ my @bodies = $self->result_source->schema->resultset('Body')->search(
+ { id => $bodies },
+ { prefetch => 'body_areas' },
+ )->all;
+ return { map { $_->id => $_ } @bodies };
+ },
+);
sub body_names($) {
my $self = shift;
diff --git a/perllib/FixMyStreet/DB/Result/User.pm b/perllib/FixMyStreet/DB/Result/User.pm
index 8385d2eea..e44b2530f 100644
--- a/perllib/FixMyStreet/DB/Result/User.pm
+++ b/perllib/FixMyStreet/DB/Result/User.pm
@@ -412,9 +412,19 @@ sub active_planned_reports {
$self->planned_reports->search({ removed => undef });
}
+has active_user_planned_reports => (
+ is => 'ro',
+ lazy => 1,
+ default => sub {
+ my $self = shift;
+ [ $self->user_planned_reports->search({ removed => undef })->all ];
+ },
+);
+
sub is_planned_report {
my ($self, $problem) = @_;
- return $self->active_planned_reports->find({ id => $problem->id });
+ my $id = $problem->id;
+ return scalar grep { $_->report_id == $id } @{$self->active_user_planned_reports};
}
sub update_reputation {
diff --git a/perllib/FixMyStreet/DB/ResultSet/UserPlannedReport.pm b/perllib/FixMyStreet/DB/ResultSet/UserPlannedReport.pm
index 7e16e2dd3..460a4912e 100644
--- a/perllib/FixMyStreet/DB/ResultSet/UserPlannedReport.pm
+++ b/perllib/FixMyStreet/DB/ResultSet/UserPlannedReport.pm
@@ -6,7 +6,17 @@ use warnings;
sub active {
my $rs = shift;
- $rs->search({ removed => undef });
+
+ # If we have been prefetched we can't use `active` as that'll blow away the
+ # cache and query the DB due to the `removed IS NULL` clause. So let's do
+ # the filtering here instead, if the query has been prefetched.
+ if ( $rs->get_cache ) {
+ my @users = grep { !defined($_->removed) } $rs->all;
+ $rs->set_cache(\@users);
+ $rs;
+ } else {
+ $rs->search({ removed => undef });
+ }
}
sub for_report {