aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/DB/Result/Problem.pm
diff options
context:
space:
mode:
authorMatthew Somerville <matthew-github@dracos.co.uk>2017-08-15 17:35:53 +0100
committerMatthew Somerville <matthew-github@dracos.co.uk>2017-08-17 10:58:30 +0100
commit1bdef6cf43c1c6bd8f58a2533468db09b098213c (patch)
tree4f76b1cb8e2bd14018c97db4b951997b4abfc318 /perllib/FixMyStreet/DB/Result/Problem.pm
parent60b941bc7868c4b0a829f7d497262015d6ab69c4 (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.pm15
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;
},
);