fix search on address: do not take deleted one into account

This commit is contained in:
Julien Fastré 2022-05-06 15:22:10 +02:00
parent 189974d5e4
commit 31d076d49b
4 changed files with 51 additions and 7 deletions

View File

@ -19,7 +19,7 @@ use Symfony\Component\Serializer\Annotation\Groups;
/** /**
* @ORM\Entity * @ORM\Entity
* @ORM\Table(name="chill_main_address_reference", indexes={ * @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 * @ORM\HasLifecycleCallbacks
*/ */

View File

@ -130,12 +130,13 @@ final class AddressReferenceRepository implements ObjectRepository
$query $query
->setFromClause('chill_main_address_reference cma') ->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(?))']; $pertinenceClause = ['STRICT_WORD_SIMILARITY(addresscanonical, UNACCENT(?))'];
$pertinenceArgs = [$pattern]; $pertinenceArgs = [$pattern];
$orWhere = ['addresscanonical %>> UNACCENT(?)']; $andWhere = [];
$orWhereArgs = [$pattern]; $andWhereArgs = [];
foreach (explode(' ', $pattern) as $part) { foreach (explode(' ', $pattern) as $part) {
$part = trim($part); $part = trim($part);
@ -144,8 +145,8 @@ final class AddressReferenceRepository implements ObjectRepository
continue; continue;
} }
$orWhere[] = "addresscanonical LIKE '%' || UNACCENT(LOWER(?)) || '%'"; $andWhere[] = "(addresscanonical LIKE '%' || UNACCENT(LOWER(?)) || '%')";
$orWhereArgs[] = $part; $andWhereArgs[] = $part;
$pertinenceClause[] = $pertinenceClause[] =
"(EXISTS (SELECT 1 FROM unnest(string_to_array(addresscanonical, ' ')) AS t WHERE starts_with(t, UNACCENT(LOWER(?)))))::int"; "(EXISTS (SELECT 1 FROM unnest(string_to_array(addresscanonical, ' ')) AS t WHERE starts_with(t, UNACCENT(LOWER(?)))))::int";
$pertinenceClause[] = $pertinenceClause[] =
@ -154,7 +155,7 @@ final class AddressReferenceRepository implements ObjectRepository
} }
$query $query
->setSelectPertinence(implode(' + ', $pertinenceClause), $pertinenceArgs) ->setSelectPertinence(implode(' + ', $pertinenceClause), $pertinenceArgs)
->andWhereClause(implode(' OR ', $orWhere), $orWhereArgs); ->andWhereClause(implode(' AND ', $andWhere), $andWhereArgs);
return $query; return $query;
} }

View File

@ -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 createdAt');
$this->addSql('ALTER TABLE chill_main_address_reference DROP deletedAt'); $this->addSql('ALTER TABLE chill_main_address_reference DROP deletedAt');
$this->addSql('ALTER TABLE chill_main_address_reference DROP updatedAt'); $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 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.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.deletedAt IS \'(DC2Type:datetime_immutable)\'');
$this->addSql('COMMENT ON COLUMN chill_main_address_reference.updatedAt 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)');
} }
} }

View File

@ -0,0 +1,37 @@
<?php
/**
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Chill\Migrations\Main;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
final class Version20220506131307 extends AbstractMigration
{
public function down(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);');
}
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;');
}
}