From 23a46b4be35277e06ec89f48730eeb694e686be8 Mon Sep 17 00:00:00 2001
From: Kenmegne <stephanie.kenmegne@gmail.com>
Date: Thu, 18 Jun 2026 15:40:06 +0000
Subject: [PATCH] add fdx-commons and fdx-consultation
---
fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/metadata/jpql/JpqlParsedQueryCriterion.java | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 156 insertions(+), 0 deletions(-)
diff --git a/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/metadata/jpql/JpqlParsedQueryCriterion.java b/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/metadata/jpql/JpqlParsedQueryCriterion.java
new file mode 100644
index 0000000..8bb21a1
--- /dev/null
+++ b/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/metadata/jpql/JpqlParsedQueryCriterion.java
@@ -0,0 +1,156 @@
+/*
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
+ */
+package com.megatim.fdxcommons.tools.database.queries.metadata.jpql;
+
+import com.megatim.fdxcommons.model.enumeration.Operateur;
+import com.megatim.fdxcommons.model.search.EnumValue;
+import com.megatim.fdxcommons.tools.database.exceptions.BadQueryCriteriaException;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ *
+ * @author ASUS
+ */
+public class JpqlParsedQueryCriterion {
+
+ private final JpqlQueryCriterion queryCriterion;
+ private final Class<?> classe;
+
+ public JpqlParsedQueryCriterion(JpqlQueryCriterion queryCriterion, Class<?> classe) {
+ this.queryCriterion = queryCriterion;
+ this.classe = classe;
+ }
+
+ public JpqlQueryCriterion parsedCriterion() throws Exception {
+ return queryCriterion != null
+ ? parsedCriterion(queryCriterion)
+ : null;
+ }
+
+ private JpqlQueryCriterion parsedCriterion(JpqlQueryCriterion criterion) throws Exception {
+
+ if (criterion.getSubCriteria() != null && !criterion.getSubCriteria().isEmpty() && criterion.getCriteriaLogicConnector() != null) {
+ List<JpqlQueryCriterion> subCriteria = new ArrayList<>();
+
+ for (JpqlQueryCriterion qc : criterion.getSubCriteria()) {
+ JpqlQueryCriterion parsedCriterion = parsedCriterion(qc);
+
+ if (parsedCriterion != null) {
+ subCriteria.add(parsedCriterion);
+ }
+ }
+ if (!subCriteria.isEmpty()) {
+ return new JpqlQueryCriterion(null,
+ null,
+ null,
+ criterion.getCriteriaLogicConnector(),
+ subCriteria,
+ criterion.isEndOfTheDay()
+ );
+ }
+ } else if ((criterion.getSubCriteria() == null || criterion.getSubCriteria().isEmpty())
+ && criterion.getNomColonne() != null && !criterion.getNomColonne().isEmpty() && criterion.getOperateur() != null) {
+ Class<?> clazz = columnType(criterion.getNomColonne());
+
+ if (clazz != null) {
+
+ Object correctValue = correctValue(clazz, criterion);
+
+ if (isUnaryOperator(criterion.getOperateur()) || (correctValue != null && !correctValue.toString().isEmpty())) {
+ return new JpqlQueryCriterion(criterion.getNomColonne(),
+ correctValue,
+ criterion.getOperateur(),
+ null,
+ Arrays.asList(),
+ criterion.isEndOfTheDay()
+ );
+ }
+ }
+ }
+ return null;
+ }
+
+ private Class<?> columnType(String nomColonne) {
+ Field[] fields = classe.getDeclaredFields();
+ String[] fieldPath = nomColonne.split("\\.");
+ try {
+ return columnType(fieldPath, fields);
+ } catch (BadQueryCriteriaException ex) {
+ Logger.getLogger(JpqlParsedQueryCriterion.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+ return null;
+ }
+ }
+
+ private Class<?> columnType(String[] fieldPath, Field[] fields) throws BadQueryCriteriaException {
+ Optional<Field> optField = Arrays.asList(fields).stream().filter(f -> f.getName().equals(fieldPath[0])).findFirst();
+
+ if (optField.isPresent()) {
+ if (fieldPath.length == 1) {
+ return optField.get().getType();
+ } else {
+ return columnType(Arrays.copyOfRange(fieldPath, 1, fieldPath.length), optField.get().getType().getDeclaredFields());
+ }
+ } else {
+ throw new BadQueryCriteriaException("Colonne " + fields[0] + " introuvable dans la classe " + optField.get().getDeclaringClass().getName());
+
+ }
+ }
+
+ private Object correctValue(Class<?> clazz, JpqlQueryCriterion criterion) throws IllegalAccessException, BadQueryCriteriaException, IllegalArgumentException, InvocationTargetException {
+
+ Object criteriaValue = criterion.getCriteriaValue();
+ if (criteriaValue == null) {
+ return null;
+ }
+
+ if (clazz.isEnum()) {
+
+ Method[] methods = clazz.getMethods();
+ Optional<Method> optionalMethod = Arrays.asList(methods)
+ .stream()
+ .filter(m -> m.getAnnotation(EnumValue.class) != null && Modifier.isStatic(m.getModifiers())).findFirst();
+
+ if (optionalMethod.isPresent()) {
+ Method method = optionalMethod.get();
+ return method.invoke(null, criteriaValue.toString());
+ }
+
+ return criteriaValue;
+
+ } else if (clazz.isAssignableFrom(LocalDateTime.class)) {
+ return dateTimeValue(criteriaValue.toString(), criterion.isEndOfTheDay());
+
+ } else {
+ return clazz.cast(criteriaValue);
+ }
+ }
+
+ private Object dateTimeValue(String criteriaValue, boolean endOfTheDay) {
+ ZonedDateTime zonedDateTime = ZonedDateTime.parse(criteriaValue, DateTimeFormatter.ISO_DATE_TIME);
+ LocalDateTime date = Timestamp.from(zonedDateTime.toInstant()).toLocalDateTime();
+
+ return endOfTheDay
+ ? date.toLocalDate().atTime(LocalTime.MAX)
+ : date.toLocalDate().atTime(LocalTime.MIN);
+ }
+
+ private boolean isUnaryOperator(Operateur operateur) {
+ return operateur.equals(Operateur.IS_NOT_NULL) || operateur.equals(Operateur.IS_NULL);
+ }
+}
--
Gitblit v1.10.0