diff --git a/pom.xml b/pom.xml index 22a16d3..52baa01 100644 --- a/pom.xml +++ b/pom.xml @@ -43,10 +43,6 @@ io.quarkus quarkus-hibernate-reactive-panache - - io.quarkus - quarkus-reactive-mysql-client - io.quarkus quarkus-reactive-pg-client diff --git a/src/main/java/fr/titionfire/ffsaf/data/CustomPostgreSQLDialect.java b/src/main/java/fr/titionfire/ffsaf/data/CustomPostgreSQLDialect.java new file mode 100644 index 0000000..cdb3ef9 --- /dev/null +++ b/src/main/java/fr/titionfire/ffsaf/data/CustomPostgreSQLDialect.java @@ -0,0 +1,35 @@ +package fr.titionfire.ffsaf.data; + +import org.hibernate.boot.model.FunctionContributions; +import org.hibernate.dialect.PostgreSQLDialect; +import org.hibernate.query.sqm.function.SqmFunctionRegistry; +import org.hibernate.query.sqm.produce.function.FunctionParameterType; +import org.hibernate.type.BasicType; +import org.hibernate.type.BasicTypeRegistry; +import org.hibernate.type.StandardBasicTypes; +import org.hibernate.type.spi.TypeConfiguration; +import org.jboss.logging.Logger; + +public class CustomPostgreSQLDialect extends PostgreSQLDialect { + private static final Logger LOGGER = Logger.getLogger(PostgreSQLDialect.class); + + public CustomPostgreSQLDialect() { + super(); + } + + @Override + public void initializeFunctionRegistry(FunctionContributions functionContributions) { + super.initializeFunctionRegistry(functionContributions); + + LOGGER.info("Initializing custom function registry"); + + SqmFunctionRegistry functionRegistry = functionContributions.getFunctionRegistry(); + TypeConfiguration typeConfiguration = functionContributions.getTypeConfiguration(); + BasicTypeRegistry basicTypeRegistry = typeConfiguration.getBasicTypeRegistry(); + BasicType stringType = basicTypeRegistry.resolve(StandardBasicTypes.STRING); + + functionRegistry.namedDescriptorBuilder("unaccent").setInvariantType(stringType).setExactArgumentCount(1) + .setParameterTypes(new FunctionParameterType[]{FunctionParameterType.STRING}).register(); + + } +} \ No newline at end of file diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/CompetitionService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/CompetitionService.java index 98aac2f..57af452 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/CompetitionService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/CompetitionService.java @@ -252,7 +252,7 @@ public class CompetitionService { } else { if (fname == null || lname == null) return Uni.createFrom().failure(new DBadRequestException("Nom et prénom requis")); - return combRepository.find("LOWER(lname) LIKE LOWER(?1) AND LOWER(fname) LIKE LOWER(?2)", lname, + return combRepository.find("unaccent(lname) ILIKE unaccent(?1) AND unaccent(fname) ILIKE unaccent(?2)", lname, fname).firstResult() .invoke(Unchecked.consumer(combModel -> { if (combModel == null) diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java index 219dcb3..69694df 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java @@ -69,7 +69,8 @@ public class MembreService { public SimpleCombModel find(int licence, String np) throws Throwable { return VertxContextSupport.subscribeAndAwait(() -> Panache.withTransaction(() -> - repository.find("licence = ?1 AND (LOWER(lname) LIKE LOWER(?2) OR LOWER(fname) LIKE LOWER(?2))", + repository.find( + "licence = ?1 AND (unaccent(lname) ILIKE unaccent(?2) OR unaccent(fname) ILIKE unaccent(?2))", licence, np).firstResult().map(SimpleCombModel::fromModel))); } @@ -78,19 +79,22 @@ public class MembreService { () -> Panache.withTransaction(() -> repository.findById(id).map(SimpleCombModel::fromModel))); } + final static String FIND_NAME_REQUEST = "unaccent(fname) ILIKE unaccent(?1) OR unaccent(lname) ILIKE unaccent(?1) " + + "OR unaccent(fname || ' ' || lname) ILIKE unaccent(?1) OR unaccent(lname || ' ' || fname) ILIKE unaccent(?1)"; + public Uni> searchAdmin(int limit, int page, String search, String club) { if (search == null) search = ""; - search = search + "%"; + search = "%" + search.replaceAll(" ", "% %") + "%"; PanacheQuery query; - if (club == null || club.isBlank()) - query = repository.find("(LOWER(lname) LIKE LOWER(?1) OR LOWER(fname) LIKE LOWER(?1))", - Sort.ascending("fname", "lname"), search).page(Page.ofSize(limit)); - else + if (club == null || club.isBlank()) { + query = repository.find(FIND_NAME_REQUEST, Sort.ascending("fname", "lname"), search) + .page(Page.ofSize(limit)); + } else query = repository.find( - "LOWER(club.name) LIKE LOWER(?2) AND (LOWER(lname) LIKE LOWER(?1) OR LOWER(fname) LIKE LOWER(?1))", + "LOWER(club.name) LIKE LOWER(?2) AND (" + FIND_NAME_REQUEST + ")", Sort.ascending("fname", "lname"), search, club + "%").page(Page.ofSize(limit)); return getPageResult(query, limit, page); } @@ -98,12 +102,13 @@ public class MembreService { public Uni> search(int limit, int page, String search, String subject) { if (search == null) search = ""; - search = search + "%"; + search = "%" + search.replaceAll(" ", "% %") + "%"; + String finalSearch = search; return repository.find("userId = ?1", subject).firstResult() .chain(membreModel -> { PanacheQuery query = repository.find( - "club = ?1 AND (LOWER(lname) LIKE LOWER(?2) OR LOWER(fname) LIKE LOWER(?2))", + "club = ?1 AND (" + FIND_NAME_REQUEST + ")", Sort.ascending("fname", "lname"), membreModel.getClub(), finalSearch) .page(Page.ofSize(limit)); return getPageResult(query, limit, page); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 065e516..0d7a12e 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,7 +1,3 @@ -# DEV -%dev.quarkus.datasource.db-kind=mysql -%dev.quarkus.datasource.reactive.url=mysql://${database.hostname}:${database.port}/${database.database}?charset=utf8mb4 - # DB quarkus.datasource.db-kind=postgresql quarkus.datasource.username=${database.user} @@ -11,6 +7,8 @@ quarkus.datasource.reactive.url=postgresql://${database.hostname}:${database.por quarkus.hibernate-orm.database.generation=update quarkus.hibernate-orm.physical-naming-strategy=fr.titionfire.ffsaf.data.SafcaNamingStrategy +quarkus.hibernate-orm.dialect=fr.titionfire.ffsaf.data.CustomPostgreSQLDialect + quarkus.http.cors=true quarkus.quartz.start-mode=forced