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