diff options
author | Matthew Somerville <matthew-github@dracos.co.uk> | 2017-08-15 17:35:53 +0100 |
---|---|---|
committer | Matthew Somerville <matthew-github@dracos.co.uk> | 2017-08-17 10:58:30 +0100 |
commit | 1bdef6cf43c1c6bd8f58a2533468db09b098213c (patch) | |
tree | 4f76b1cb8e2bd14018c97db4b951997b4abfc318 /perllib/FixMyStreet/DB/Result/Problem.pm | |
parent | 60b941bc7868c4b0a829f7d497262015d6ab69c4 (diff) |
Store duplicate reverse lookups upon dupe setting.
This avoids the need to search the whole table to find a report's
duplicates. And is easier than constructing an index or upgrading
PostgreSQL.
Diffstat (limited to 'perllib/FixMyStreet/DB/Result/Problem.pm')
-rw-r--r-- | perllib/FixMyStreet/DB/Result/Problem.pm | 15 |
1 files changed, 13 insertions, 2 deletions
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; }, ); |