Skip to content
This repository has been archived by the owner on Dec 11, 2020. It is now read-only.

Commit

Permalink
Modification de la recherche des établissements:
Browse files Browse the repository at this point in the history
- ignore les accents
  • Loading branch information
tristanrobert committed Apr 9, 2019
1 parent 0d91655 commit 10d5746
Show file tree
Hide file tree
Showing 7 changed files with 112 additions and 12 deletions.
6 changes: 5 additions & 1 deletion Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 13 additions & 6 deletions database/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,21 +52,28 @@ var tables = []interface{}{
}

const createIndexesQuery = `CREATE EXTENSION pg_trgm;
CREATE EXTENSION unaccent;
CREATE OR REPLACE FUNCTION f_unaccent(text)
RETURNS text AS
$func$
SELECT public.unaccent('public.unaccent', $1) -- schema-qualify function and dictionary
$func$ LANGUAGE sql IMMUTABLE;
CREATE INDEX trgm_idx_etablissments_s3ic ON etablissements USING gin (s3ic gin_trgm_ops);
CREATE INDEX trgm_idx_etablissments_nom ON etablissements USING gin (nom gin_trgm_ops);
CREATE INDEX trgm_idx_etablissments_raison ON etablissements USING gin (raison gin_trgm_ops);
CREATE INDEX trgm_idx_etablissments_adresse1 ON etablissements USING gin (adresse1 gin_trgm_ops);
CREATE INDEX trgm_idx_etablissments_adresse2 ON etablissements USING gin (adresse2 gin_trgm_ops);
CREATE INDEX trgm_idx_etablissments_nom ON etablissements USING gin (f_unaccent(nom) gin_trgm_ops);
CREATE INDEX trgm_idx_etablissments_raison ON etablissements USING gin (f_unaccent(raison) gin_trgm_ops);
CREATE INDEX trgm_idx_etablissments_adresse1 ON etablissements USING gin (f_unaccent(adresse1) gin_trgm_ops);
CREATE INDEX trgm_idx_etablissments_adresse2 ON etablissements USING gin (f_unaccent(adresse2) gin_trgm_ops);
CREATE INDEX trgm_idx_etablissments_code_postal ON etablissements USING gin (code_postal gin_trgm_ops);
CREATE INDEX trgm_idx_etablissments_commune ON etablissements USING gin (commune gin_trgm_ops);
CREATE INDEX trgm_idx_etablissments_commune ON etablissements USING gin (f_unaccent(commune) gin_trgm_ops);
CREATE INDEX idx_users_profile ON users(profile);
CREATE INDEX idx_inspections_etat ON inspections(etat);
CREATE INDEX idx_point_de_controles_publie ON point_de_controles(publie);
CREATE INDEX idx_messages_interne ON messages(interne);
CREATE INDEX idx_messages_lu ON messages(lu);
CREATE EXTENSION unaccent;
`
const dropIndexesQuery = `DROP EXTENSION IF EXISTS pg_trgm cascade;
DROP EXTENSION IF EXISTS unaccent;
Expand Down
11 changes: 6 additions & 5 deletions database/etablissements_repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"github.com/MTES-MCT/filharmonic-api/domain"
"github.com/MTES-MCT/filharmonic-api/errors"
"github.com/MTES-MCT/filharmonic-api/models"
"github.com/MTES-MCT/filharmonic-api/util"
"github.com/go-pg/pg"
"github.com/go-pg/pg/orm"
)
Expand All @@ -29,15 +30,15 @@ func (repo *Repository) FindEtablissements(ctx *domain.UserContext, filter domai
query.Where("s3ic ilike ?", helper.BuildSearchValue(filter.S3IC))
}
if filter.Nom != "" {
query.Where("nom ilike ? OR raison ilike ?", helper.BuildSearchValue(filter.Nom), helper.BuildSearchValue(filter.Nom))
query.Where("f_unaccent(nom) ilike ? OR f_unaccent(raison) ilike ?", helper.BuildSearchValue(util.Normalize(filter.Nom)), helper.BuildSearchValue(util.Normalize(filter.Nom)))
}
if filter.Adresse != "" {
adresse := helper.BuildSearchValue(filter.Adresse)
adresse := helper.BuildSearchValue(util.Normalize(filter.Adresse))
query.WhereGroup(func(q *orm.Query) (*orm.Query, error) {
q.WhereOr("adresse1 ilike ?", adresse).
WhereOr("adresse2 ilike ?", adresse).
q.WhereOr("f_unaccent(adresse1) ilike ?", adresse).
WhereOr("f_unaccent(adresse2) ilike ?", adresse).
WhereOr("code_postal ilike ?", adresse).
WhereOr("commune ilike ?", adresse)
WhereOr("f_unaccent(commune) ilike ?", adresse)
return q, nil
})
}
Expand Down
16 changes: 16 additions & 0 deletions database/migrations/29_alter_indexes_etablissements.up.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
CREATE OR REPLACE FUNCTION f_unaccent(text)
RETURNS text AS
$func$
SELECT public.unaccent('public.unaccent', $1) -- schema-qualify function and dictionary
$func$ LANGUAGE sql IMMUTABLE;

DROP INDEX trgm_idx_etablissments_nom;
CREATE INDEX trgm_idx_etablissments_nom ON etablissements USING gin (f_unaccent(nom) gin_trgm_ops);
DROP INDEX trgm_idx_etablissments_raison;
CREATE INDEX trgm_idx_etablissments_raison ON etablissements USING gin (f_unaccent(raison) gin_trgm_ops);
DROP INDEX trgm_idx_etablissments_adresse1;
CREATE INDEX trgm_idx_etablissments_adresse1 ON etablissements USING gin (f_unaccent(adresse1) gin_trgm_ops);
DROP INDEX trgm_idx_etablissments_adresse2;
CREATE INDEX trgm_idx_etablissments_adresse2 ON etablissements USING gin (f_unaccent(adresse2) gin_trgm_ops);
DROP INDEX trgm_idx_etablissments_commune;
CREATE INDEX trgm_idx_etablissments_commune ON etablissements USING gin (f_unaccent(commune) gin_trgm_ops);
40 changes: 40 additions & 0 deletions tests/integration/etablissements_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package integration

import (
"testing"

"github.com/MTES-MCT/filharmonic-api/domain"
"github.com/MTES-MCT/filharmonic-api/models"

"github.com/MTES-MCT/filharmonic-api/tests"
)

func TestSearchEtablissements(t *testing.T) {
assert, application, close := tests.InitService(t)
defer close()

ctxInspecteur := &domain.UserContext{
User: &models.User{
Id: 3,
Profile: models.ProfilInspecteur,
},
}
etablissementsInput := []models.Etablissement{
models.Etablissement{
Nom: "Équipement de pression",
},
models.Etablissement{
Nom: "equipement de pression",
},
models.Etablissement{
Nom: "pression",
},
}
assert.NoError(application.DB.Insert(&etablissementsInput))
filter := domain.ListEtablissementsFilter{
Nom: "équipement",
}
etablissements, err := application.Service.ListEtablissements(ctxInspecteur, filter)
assert.NoError(err)
assert.Equal(2, etablissements.Total)
}
15 changes: 15 additions & 0 deletions util/strings.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package util

import (
"unicode"

"golang.org/x/text/runes"
"golang.org/x/text/transform"
"golang.org/x/text/unicode/norm"
)

func Normalize(value string) string {
t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC)
s, _, _ := transform.String(t, value)
return s
}
17 changes: 17 additions & 0 deletions util/strings_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package util

import (
"testing"

"github.com/stretchr/testify/require"
)

func TestNormalize(t *testing.T) {
assert := require.New(t)
assert.Equal("equipement", Normalize("équipement"))
assert.Equal("Equipement", Normalize("Équipement"))
assert.Equal("hotel", Normalize("hôtel"))
assert.Equal("A Nantes", Normalize("À Nantes"))
assert.Equal("A-Nantes", Normalize("À-Nantes"))
assert.Equal("A_Nantes", Normalize("À_Nantes"))
}

0 comments on commit 10d5746

Please sign in to comment.