This is an automated email from the ASF dual-hosted git repository.

borinquenkid pushed a commit to branch merge-hibernate6
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit ff435a5a452de773a05305a367932ac3e17f5d9a
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Sun Sep 7 15:05:01 2025 -0500

    more Refactoring PredicateGenerator for clarity
---
 .../orm/hibernate/query/PredicateGenerator.java    | 80 +++++++++-------------
 1 file changed, 34 insertions(+), 46 deletions(-)

diff --git 
a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
 
b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
index 67cc104e55..93e4c1312a 100644
--- 
a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
+++ 
b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
@@ -54,16 +54,13 @@ public class PredicateGenerator {
         List<Predicate> list = criteriaList.stream().
                 map(criterion -> {
                     if (criterion instanceof Query.Junction junction) {
+                        var criterionList = junction.getCriteria();
+                        var predicates = getPredicates(cb, criteriaQuery, 
root_, criterionList, fromsByProvider, entity);
                         if (junction instanceof Query.Disjunction) {
-                            List<Query.Criterion> criterionList = 
junction.getCriteria();
-                            return cb.or(getPredicates(cb, criteriaQuery, 
root_, criterionList, fromsByProvider, entity));
-
+                            return cb.or(predicates);
                         } else if (junction instanceof Query.Conjunction) {
-                            List<Query.Criterion> criterionList = 
junction.getCriteria();
-                            return cb.and(getPredicates(cb, criteriaQuery, 
root_, criterionList, fromsByProvider, entity));
+                            return cb.and(predicates);
                         } else if (junction instanceof Query.Negation) {
-                            List<Query.Criterion> criterionList = 
junction.getCriteria();
-                            Predicate[] predicates = getPredicates(cb, 
criteriaQuery, root_, criterionList, fromsByProvider, entity);
                             if (predicates.length != 1) {
                                 log.error("Must have a single predicate behind 
a not");
                                 throw new RuntimeException("Must have a single 
predicate behind a not");
@@ -79,73 +76,64 @@ public class PredicateGenerator {
                         JpaFromProvider childTablesByName = (JpaFromProvider) 
fromsByProvider.clone();
                         childTablesByName.put("root", child);
                         return cb.and(getPredicates(cb, criteriaQuery, child, 
criterionList, childTablesByName, entity));
-                    } else if (criterion instanceof Query.PropertyCriterion) {
+                    } else if (criterion instanceof Query.PropertyCriterion 
pc) {
+                        var fullyQualifiedPath = 
fromsByProvider.getFullyQualifiedPath(pc.getProperty());
                         if (criterion instanceof Query.Equals c) {
-                            return 
cb.equal(fromsByProvider.getFullyQualifiedPath(c.getProperty()), c.getValue());
+                            return cb.equal(fullyQualifiedPath, c.getValue());
                         } else if (criterion instanceof Query.NotEquals c) {
                             var notEqualToValue = 
cb.notEqual(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
c.getValue());
-                            var isNull = 
cb.isNull(fromsByProvider.getFullyQualifiedPath(c.getProperty()));
+                            var isNull = cb.isNull(fullyQualifiedPath);
                             return cb.or(notEqualToValue, isNull);
                         } else if (criterion instanceof Query.IdEquals c) {
                             return cb.equal(root_.get("id"), c.getValue());
                         } else if (criterion instanceof Query.GreaterThan c) {
-                            return 
cb.gt(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
getNumericValue(c));
+                            return cb.gt(fullyQualifiedPath, 
getNumericValue(c));
                         } else if (criterion instanceof 
Query.GreaterThanEquals c) {
-                            return 
cb.ge(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
getNumericValue(c));
+                            return cb.ge(fullyQualifiedPath, 
getNumericValue(c));
                         } else if (criterion instanceof Query.LessThan c) {
-                            return 
cb.lt(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
getNumericValue(c));
+                            return cb.lt(fullyQualifiedPath, 
getNumericValue(c));
                         } else if (criterion instanceof Query.LessThanEquals 
c) {
-                            return 
cb.le(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
getNumericValue(c));
+                            return cb.le(fullyQualifiedPath, 
getNumericValue(c));
                         } else if (criterion instanceof Query.SizeEquals c) {
-                            return 
cb.equal(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), 
c.getValue());
+                            return cb.equal(cb.size(fullyQualifiedPath), 
c.getValue());
                         } else if (criterion instanceof Query.SizeNotEquals c) 
{
-                            return 
cb.notEqual(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), 
c.getValue());
+                            return cb.notEqual(cb.size(fullyQualifiedPath), 
c.getValue());
                         } else if (criterion instanceof Query.SizeGreaterThan 
c) {
-                            return 
cb.gt(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), 
getNumericValue(c));
+                            return cb.gt(cb.size(fullyQualifiedPath), 
getNumericValue(c));
                         } else if (criterion instanceof 
Query.SizeGreaterThanEquals c) {
-                            return 
cb.ge(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), 
getNumericValue(c));
+                            return cb.ge(cb.size(fullyQualifiedPath), 
getNumericValue(c));
                         } else if (criterion instanceof Query.SizeLessThan c) {
-                            return 
cb.lt(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), 
getNumericValue(c));
+                            return cb.lt(cb.size(fullyQualifiedPath), 
getNumericValue(c));
                         } else if (criterion instanceof 
Query.SizeLessThanEquals c) {
-                            return 
cb.le(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), 
getNumericValue(c));
+                            return cb.le(cb.size(fullyQualifiedPath), 
getNumericValue(c));
                         } else if (criterion instanceof Query.Between c) {
                             if (c.getFrom() instanceof String && c.getTo() 
instanceof String) {
-                                return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (String) 
c.getFrom(), (String) c.getTo());
+                                return cb.between(fullyQualifiedPath, (String) 
c.getFrom(), (String) c.getTo());
                             } else if (c.getFrom() instanceof Short && 
c.getTo() instanceof Short) {
-                                return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (Short) 
c.getFrom(), (Short) c.getTo());
+                                return cb.between(fullyQualifiedPath, (Short) 
c.getFrom(), (Short) c.getTo());
                             } else if (c.getFrom() instanceof Integer && 
c.getTo() instanceof Integer) {
-                                return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (Integer) 
c.getFrom(), (Integer) c.getTo());
+                                return cb.between(fullyQualifiedPath, 
(Integer) c.getFrom(), (Integer) c.getTo());
                             } else if (c.getFrom() instanceof Long && 
c.getTo() instanceof Long) {
-                                return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (Long) 
c.getFrom(), (Long) c.getTo());
+                                return cb.between(fullyQualifiedPath, (Long) 
c.getFrom(), (Long) c.getTo());
                             } else if (c.getFrom() instanceof Date && 
c.getTo() instanceof Date) {
-                                return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (Date) 
c.getFrom(), (Date) c.getTo());
+                                return cb.between(fullyQualifiedPath, (Date) 
c.getFrom(), (Date) c.getTo());
                             } else if (c.getFrom() instanceof Instant && 
c.getTo() instanceof Instant) {
-                                return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (Instant) 
c.getFrom(), (Instant) c.getTo());
+                                return cb.between(fullyQualifiedPath, 
(Instant) c.getFrom(), (Instant) c.getTo());
                             } else if (c.getFrom() instanceof LocalDate && 
c.getTo() instanceof LocalDate) {
-                                return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), (LocalDate) 
c.getFrom(), (LocalDate) c.getTo());
+                                return cb.between(fullyQualifiedPath, 
(LocalDate) c.getFrom(), (LocalDate) c.getTo());
                             } else if (c.getFrom() instanceof LocalDateTime && 
c.getTo() instanceof LocalDateTime) {
-                                return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
(LocalDateTime) c.getFrom(), (LocalDateTime) c.getTo());
+                                return cb.between(fullyQualifiedPath, 
(LocalDateTime) c.getFrom(), (LocalDateTime) c.getTo());
                             } else if (c.getFrom() instanceof OffsetDateTime 
&& c.getTo() instanceof OffsetDateTime) {
-                                return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
(OffsetDateTime) c.getFrom(), (OffsetDateTime) c.getTo());
+                                return cb.between(fullyQualifiedPath, 
(OffsetDateTime) c.getFrom(), (OffsetDateTime) c.getTo());
                             } else if (c.getFrom() instanceof ZonedDateTime && 
c.getTo() instanceof ZonedDateTime) {
-                                return 
cb.between(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
(ZonedDateTime) c.getFrom(), (ZonedDateTime) c.getTo());
+                                return cb.between(fullyQualifiedPath, 
(ZonedDateTime) c.getFrom(), (ZonedDateTime) c.getTo());
                             }
                         } else if (criterion instanceof Query.ILike c) {
-                            return 
cb.ilike(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
c.getValue().toString());
+                            return cb.ilike(fullyQualifiedPath, 
c.getValue().toString());
                         } else if (criterion instanceof Query.RLike c) {
-                            return 
cb.like(fromsByProvider.getFullyQualifiedPath(c.getProperty()), c.getPattern(), 
'\\');
+                            return cb.like(fullyQualifiedPath, c.getPattern(), 
'\\');
                         } else if (criterion instanceof Query.Like c) {
-                            return 
cb.like(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
c.getValue().toString());
-                        } else if (criterion instanceof Query.SizeEquals c) {
-                            return 
cb.equal(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), 
c.getValue());
-                        } else if (criterion instanceof Query.SizeGreaterThan 
c) {
-                            return 
cb.gt(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), 
getNumericValue(c));
-                        } else if (criterion instanceof 
Query.SizeGreaterThanEquals c) {
-                            return 
cb.ge(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), 
getNumericValue(c));
-                        } else if (criterion instanceof Query.SizeLessThan c) {
-                            return 
cb.lt(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), 
getNumericValue(c));
-                        } else if (criterion instanceof 
Query.SizeLessThanEquals c) {
-                            return 
cb.le(cb.size(fromsByProvider.getFullyQualifiedPath(c.getProperty())), 
getNumericValue(c));
+                            return cb.like(fullyQualifiedPath, 
c.getValue().toString());
                         } else if (criterion instanceof Query.In c) {
                             var queryableCriteria = 
getQueryableCriteriaFromInCriteria(criterion);
                             if (Objects.nonNull(queryableCriteria)) {
@@ -160,7 +148,7 @@ public class PredicateGenerator {
                                     Collection newValues = 
gormEntities.stream().map(GormEntity::ident).toList();
                                     return cb.in(id, newValues);
                                 }
-                                return 
cb.in(fromsByProvider.getFullyQualifiedPath(c.getProperty()), c.getValues());
+                                return cb.in(fullyQualifiedPath, 
c.getValues());
                             }
                         } else if (criterion instanceof Query.NotIn c) {
                             var queryableCriteria = 
getQueryableCriteriaFromInCriteria(criterion);
@@ -179,7 +167,7 @@ public class PredicateGenerator {
                                 JpaFromProvider newMap2 = (JpaFromProvider) 
fromsByProvider.clone();
                                 Predicate[] predicates2 = getPredicates(cb, 
criteriaQuery, from2, subCriteria2, newMap2, entity);
                                 
subquery2.select(from2.get(projection.getPropertyName())).distinct(distinct).where(cb.and(predicates2));
-                                return 
cb.not(cb.in(fromsByProvider.getFullyQualifiedPath(c.getProperty())).value(subquery2));
+                                return 
cb.not(cb.in(fullyQualifiedPath).value(subquery2));
                             } else if ( Objects.nonNull(c.getSubquery())
                                     && 
!c.getSubquery().getProjections().isEmpty()
                                     && c.getSubquery().getProjections().get(0) 
instanceof Query.IdProjection
@@ -192,7 +180,7 @@ public class PredicateGenerator {
                                 
subquery2.select(from2).where(cb.and(predicates2));
                                 return 
cb.not(cb.in(root_.get("id")).value(subquery2));
                             } else {
-                                return 
cb.not(cb.in(fromsByProvider.getFullyQualifiedPath(c.getProperty()), 
c.getValue()));
+                                return cb.not(cb.in(fullyQualifiedPath, 
c.getValue()));
                             }
 
                         } else if (criterion instanceof 
Query.SubqueryCriterion c) {

Reply via email to