diff --git a/src/Bundle/ChillMainBundle/Entity/AddressReference.php b/src/Bundle/ChillMainBundle/Entity/AddressReference.php index fe132f883..fc4339fe0 100644 --- a/src/Bundle/ChillMainBundle/Entity/AddressReference.php +++ b/src/Bundle/ChillMainBundle/Entity/AddressReference.php @@ -19,7 +19,7 @@ use Symfony\Component\Serializer\Annotation\Groups; /** * @ORM\Entity * @ORM\Table(name="chill_main_address_reference", indexes={ - * @ORM\Index(name="address_refid", columns={"refId"}, options={"where": "refid != ''"}) + * @ORM\Index(name="address_refid", columns={"refId"}) * }) * @ORM\HasLifecycleCallbacks */ diff --git a/src/Bundle/ChillMainBundle/Repository/AddressReferenceRepository.php b/src/Bundle/ChillMainBundle/Repository/AddressReferenceRepository.php index 9cbad91c9..8a0755902 100644 --- a/src/Bundle/ChillMainBundle/Repository/AddressReferenceRepository.php +++ b/src/Bundle/ChillMainBundle/Repository/AddressReferenceRepository.php @@ -130,12 +130,13 @@ final class AddressReferenceRepository implements ObjectRepository $query ->setFromClause('chill_main_address_reference cma') - ->andWhereClause('postcode_id = ?', [$postalCode->getId()]); + ->andWhereClause('postcode_id = ?', [$postalCode->getId()]) + ->andWhereClause('deletedAt IS NULL', []); $pertinenceClause = ['STRICT_WORD_SIMILARITY(addresscanonical, UNACCENT(?))']; $pertinenceArgs = [$pattern]; - $orWhere = ['addresscanonical %>> UNACCENT(?)']; - $orWhereArgs = [$pattern]; + $andWhere = []; + $andWhereArgs = []; foreach (explode(' ', $pattern) as $part) { $part = trim($part); @@ -144,8 +145,8 @@ final class AddressReferenceRepository implements ObjectRepository continue; } - $orWhere[] = "addresscanonical LIKE '%' || UNACCENT(LOWER(?)) || '%'"; - $orWhereArgs[] = $part; + $andWhere[] = "(addresscanonical LIKE '%' || UNACCENT(LOWER(?)) || '%')"; + $andWhereArgs[] = $part; $pertinenceClause[] = "(EXISTS (SELECT 1 FROM unnest(string_to_array(addresscanonical, ' ')) AS t WHERE starts_with(t, UNACCENT(LOWER(?)))))::int"; $pertinenceClause[] = @@ -154,7 +155,7 @@ final class AddressReferenceRepository implements ObjectRepository } $query ->setSelectPertinence(implode(' + ', $pertinenceClause), $pertinenceArgs) - ->andWhereClause(implode(' OR ', $orWhere), $orWhereArgs); + ->andWhereClause(implode(' AND ', $andWhere), $andWhereArgs); return $query; } diff --git a/src/Bundle/ChillMainBundle/migrations/Version20220325134944.php b/src/Bundle/ChillMainBundle/migrations/Version20220325134944.php index bc0382482..58a20d220 100644 --- a/src/Bundle/ChillMainBundle/migrations/Version20220325134944.php +++ b/src/Bundle/ChillMainBundle/migrations/Version20220325134944.php @@ -24,6 +24,10 @@ final class Version20220325134944 extends AbstractMigration $this->addSql('ALTER TABLE chill_main_address_reference DROP createdAt'); $this->addSql('ALTER TABLE chill_main_address_reference DROP deletedAt'); $this->addSql('ALTER TABLE chill_main_address_reference DROP updatedAt'); + $this->addSql('DROP INDEX address_refid'); + $this->addSql('create index address_refid + on chill_main_address_reference (refid) + where ((refid)::text <> \'\'::text)'); } public function getDescription(): string @@ -39,5 +43,7 @@ final class Version20220325134944 extends AbstractMigration $this->addSql('COMMENT ON COLUMN chill_main_address_reference.createdAt IS \'(DC2Type:datetime_immutable)\''); $this->addSql('COMMENT ON COLUMN chill_main_address_reference.deletedAt IS \'(DC2Type:datetime_immutable)\''); $this->addSql('COMMENT ON COLUMN chill_main_address_reference.updatedAt IS \'(DC2Type:datetime_immutable)\''); + $this->addSql('DROP INDEX address_refid'); + $this->addSql('CREATE INDEX address_refid ON chill_main_address_reference (refId)'); } } diff --git a/src/Bundle/ChillMainBundle/migrations/Version20220506131307.php b/src/Bundle/ChillMainBundle/migrations/Version20220506131307.php new file mode 100644 index 000000000..f3360d94a --- /dev/null +++ b/src/Bundle/ChillMainBundle/migrations/Version20220506131307.php @@ -0,0 +1,37 @@ +addSql('DROP INDEX chill_internal_address_reference_canonicalized'); + $this->addSql('create index chill_internal_address_reference_canonicalized + on chill_main_address_reference using gist (postcode_id, addresscanonical gist_trgm_ops);'); + } + + public function getDescription(): string + { + return 'Adapt search index on address reference canonicalized'; + } + + public function up(Schema $schema): void + { + $this->addSql('DROP INDEX chill_internal_address_reference_canonicalized'); + $this->addSql('create index chill_internal_address_reference_canonicalized + on chill_main_address_reference using gist (postcode_id, addresscanonical gist_trgm_ops) WHERE deletedat IS NULL;'); + } +}