diff options
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rwxr-xr-x | bin/one-off-update-duplicates | 20 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Report.pm | 5 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/Result/Problem.pm | 15 | ||||
-rw-r--r-- | t/app/controller/report_inspect.t | 7 | ||||
-rw-r--r-- | t/app/model/problem.t | 2 |
6 files changed, 47 insertions, 3 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index cea9e8782..186a66a5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ - Stop errors from JS validator due to form in form. - Stop update form toggle causing report submission. - Update map size if an extra column has appeared. + - Improve performance of duplicate display. - Development improvements: - `switch-site` script to automate switching config.yml files. #1741 diff --git a/bin/one-off-update-duplicates b/bin/one-off-update-duplicates new file mode 100755 index 000000000..7bbf0251f --- /dev/null +++ b/bin/one-off-update-duplicates @@ -0,0 +1,20 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +BEGIN { + use File::Basename qw(dirname); + use File::Spec; + my $d = dirname(File::Spec->rel2abs($0)); + require "$d/../setenv.pl"; +} + +use FixMyStreet::DB; + +my $rs = FixMyStreet::DB->resultset("Problem")->search({ extra => => { like => "%duplicate_of%" } }); +while (my $row = $rs->next) { + my $duplicate_of = $row->get_extra_metadata('duplicate_of'); + next unless $duplicate_of; + $row->set_duplicate_of($duplicate_of); +} diff --git a/perllib/FixMyStreet/App/Controller/Report.pm b/perllib/FixMyStreet/App/Controller/Report.pm index 5c64bd9e5..acc6f9a09 100644 --- a/perllib/FixMyStreet/App/Controller/Report.pm +++ b/perllib/FixMyStreet/App/Controller/Report.pm @@ -325,7 +325,7 @@ sub inspect : Private { my %update_params = (); if ($permissions->{report_inspect}) { - foreach (qw/detailed_information traffic_information duplicate_of/) { + foreach (qw/detailed_information traffic_information/) { $problem->set_extra_metadata( $_ => $c->get_param($_) ); } @@ -360,7 +360,10 @@ sub inspect : Private { } if ( $problem->state ne 'duplicate' ) { $problem->unset_extra_metadata('duplicate_of'); + } elsif (my $duplicate_of = $c->get_param('duplicate_of')) { + $problem->set_duplicate_of($duplicate_of); } + if ( $problem->state ne $old_state ) { $c->forward( '/admin/log_edit', [ $problem->id, 'problem', 'state_change' ] ); diff --git a/perllib/FixMyStreet/DB/Result/Problem.pm b/perllib/FixMyStreet/DB/Result/Problem.pm index a12f8c20d..720e8cc93 100644 --- a/perllib/FixMyStreet/DB/Result/Problem.pm +++ b/perllib/FixMyStreet/DB/Result/Problem.pm @@ -1115,6 +1115,16 @@ has shortlisted_user => ( }, ); +sub set_duplicate_of { + my ($self, $other_id) = @_; + $self->set_extra_metadata( duplicate_of => $other_id ); + my $dupe = $self->result_source->schema->resultset("Problem")->find($other_id); + my $dupes_duplicates = $dupe->get_extra_metadata('duplicates') || []; + push @$dupes_duplicates, $self->id; + $dupe->set_extra_metadata( duplicates => $dupes_duplicates ); + $dupe->update; +} + has duplicate_of => ( is => 'ro', lazy => 1, @@ -1132,8 +1142,9 @@ has duplicates => ( lazy => 1, default => sub { my $self = shift; - my $rabx_id = RABX::serialise( $self->id ); - my @duplicates = $self->result_source->schema->resultset('Problem')->search({ extra => { like => "\%duplicate_of,$rabx_id%" } })->all; + my $duplicates = $self->get_extra_metadata("duplicates") || []; + return [] unless $duplicates && @$duplicates; + my @duplicates = $self->result_source->schema->resultset('Problem')->search({ id => $duplicates })->all; return \@duplicates; }, ); diff --git a/t/app/controller/report_inspect.t b/t/app/controller/report_inspect.t index 447e28028..e668fddbf 100644 --- a/t/app/controller/report_inspect.t +++ b/t/app/controller/report_inspect.t @@ -114,6 +114,8 @@ FixMyStreet::override_config { $report->set_extra_metadata('duplicate_of' => $report2->id); $report->state('duplicate'); $report->update; + $report2->set_extra_metadata('duplicates' => [ $report->id ]); + $report2->update; $mech->get_ok("/report/$report_id"); $mech->content_contains($report2->title); @@ -124,6 +126,8 @@ FixMyStreet::override_config { $report->unset_extra_metadata('duplicate_of'); $report->state($old_state); $report->update; + $report2->unset_extra_metadata('duplicates'); + $report2->update; }; subtest "marking a report as a duplicate with update correctly sets update status" => sub { @@ -133,10 +137,13 @@ FixMyStreet::override_config { $mech->get_ok("/report/$report_id"); $mech->submit_form_ok({ button => 'save', with_fields => { state => 'Duplicate', duplicate_of => $report2->id, public_update => "This is a duplicate.", include_update => "1" } }); $report->discard_changes; + $report2->discard_changes; is $report->state, 'duplicate', 'report marked as duplicate'; is $report->comments->search({ problem_state => 'duplicate' })->count, 1, 'update marking report as duplicate was left'; + is $report->get_extra_metadata('duplicate_of'), $report2->id; + is_deeply $report2->get_extra_metadata('duplicates'), [ $report->id ]; $report->update({ state => $old_state }); }; diff --git a/t/app/model/problem.t b/t/app/model/problem.t index 718b980b0..b0719d6a6 100644 --- a/t/app/model/problem.t +++ b/t/app/model/problem.t @@ -776,6 +776,8 @@ subtest 'check duplicate reports' => sub { $problem1->set_extra_metadata(duplicate_of => $problem2->id); $problem1->state('duplicate'); $problem1->update; + $problem2->set_extra_metadata(duplicates => [ $problem1->id ]); + $problem2->update; is $problem1->duplicate_of->title, $problem2->title, 'problem1 returns correct problem from duplicate_of'; is scalar @{ $problem2->duplicates }, 1, 'problem2 has correct number of duplicates'; |