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

borinquenkid pushed a commit to branch 8.0.x-hibernate7-dev
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit 90c3006280b34d584e22b8f74313d361f07b4036
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Tue Mar 17 14:19:41 2026 -0500

    better fixes for PredicateGenerator
---
 .../orm/hibernate/query/PredicateGenerator.java    | 140 +++----
 .../hibernatequery/PredicateGeneratorSpec.groovy   | 454 ++-------------------
 2 files changed, 97 insertions(+), 497 deletions(-)

diff --git 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
index 21948dfd14..ad30c4013d 100644
--- 
a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
+++ 
b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
@@ -1,21 +1,3 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
 package org.grails.orm.hibernate.query;
 
 import java.util.ArrayList;
@@ -56,15 +38,11 @@ import 
org.grails.datastore.mapping.query.api.QueryableCriteria;
 
 @Slf4j
 @SuppressWarnings({
-    "PMD.DataflowAnomalyAnalysis",
-    "PMD.AvoidLiteralsInIfCondition",
-    "PMD.AvoidDuplicateLiterals",
-    // GORM stores criterion values as Object; JPA expects types resolved at 
compile time.
-    // The unchecked casts here are deliberate — type safety is enforced at 
runtime by
-    // MappingContext, not at compile time. This is the inherent cost of 
bridging a
-    // runtime-typed DSL (GORM) to a compile-time-typed API (JPA Criteria).
-    "unchecked",
-    "rawtypes"
+        "PMD.DataflowAnomalyAnalysis",
+        "PMD.AvoidLiteralsInIfCondition",
+        "PMD.AvoidDuplicateLiterals",
+        "unchecked",
+        "rawtypes"
 })
 public class PredicateGenerator {
     private static final Logger log = 
LoggerFactory.getLogger(PredicateGenerator.class);
@@ -116,10 +94,12 @@ public class PredicateGenerator {
         } else if (criterion instanceof Query.PropertyNameCriterion c) {
             return handlePropertyNameCriterion(cb, fromsByProvider, c);
         } else if (criterion instanceof Query.Exists c) {
-            return handleExists(cb, criteriaQuery, root, fromsByProvider, 
entity, c);
+            // FIX: Pass the child entity from the subquery context
+            return handleExists(cb, criteriaQuery, root, fromsByProvider, 
c.getSubquery().getPersistentEntity(), c);
         } else if (criterion instanceof Query.NotExists c) {
-            return cb.not(
-                    handleExists(cb, criteriaQuery, root, fromsByProvider, 
entity, new Query.Exists(c.getSubquery())));
+            // FIX: Pass the child entity from the subquery context
+            PersistentEntity childEntity = 
c.getSubquery().getPersistentEntity();
+            return cb.not(handleExists(cb, criteriaQuery, root, 
fromsByProvider, childEntity, new Query.Exists(c.getSubquery())));
         }
         throw new IllegalArgumentException("Unsupported criterion: " + 
criterion);
     }
@@ -153,10 +133,22 @@ public class PredicateGenerator {
             JpaFromProvider fromsByProvider,
             PersistentEntity entity,
             DetachedAssociationCriteria<?> c) {
+
         var child = root.join(c.getAssociationPath(), JoinType.LEFT);
         JpaFromProvider childTablesByName = (JpaFromProvider) 
fromsByProvider.clone();
         childTablesByName.put("root", child);
-        return cb.and(getPredicates(cb, criteriaQuery, child, c.getCriteria(), 
childTablesByName, entity));
+
+        // FIX: Get the target PersistentEntity from the association
+        PersistentEntity associatedEntity = 
c.getAssociation().getAssociatedEntity();
+
+        return cb.and(getPredicates(
+                cb,
+                criteriaQuery,
+                child,
+                c.getCriteria(),
+                childTablesByName,
+                associatedEntity // Pass the entity, not the association
+        ));
     }
 
     private Predicate handleHibernateAssociationQuery(
@@ -168,8 +160,8 @@ public class PredicateGenerator {
         var child = root.join(haq.associationPath, JoinType.LEFT);
         JpaFromProvider childFroms = (JpaFromProvider) fromsByProvider.clone();
         childFroms.put("root", child);
-        return cb.and(
-                getPredicates(cb, criteriaQuery, child, 
haq.getAssociationCriteria(), childFroms, haq.getEntity()));
+        // haq.getEntity() is already the correct child entity
+        return cb.and(getPredicates(cb, criteriaQuery, child, 
haq.getAssociationCriteria(), childFroms, haq.getEntity()));
     }
 
     private Predicate handlePropertyCriterion(
@@ -179,6 +171,14 @@ public class PredicateGenerator {
             JpaFromProvider fromsByProvider,
             PersistentEntity entity,
             Query.PropertyCriterion pc) {
+
+        // Firewall: validate property against the current context's entity
+        String propertyName = pc.getProperty();
+        if (!"id".equals(propertyName) && !propertyName.contains(".") && 
entity.getPropertyByName(propertyName) == null) {
+            throw new ConfigurationException("Property [" + propertyName +
+                    "] is not a valid property of class [" + entity.getName() 
+ "]");
+        }
+
         var fullyQualifiedPath = 
fromsByProvider.getFullyQualifiedPath(pc.getProperty());
 
         if (pc instanceof Query.NotIn c) {
@@ -188,8 +188,7 @@ public class PredicateGenerator {
         } else if (pc instanceof Query.In c) {
             return handleIn(cb, criteriaQuery, fromsByProvider, entity, c, 
fullyQualifiedPath);
         } else if (pc instanceof Query.ILike c) {
-            return cb.ilike(
-                    (Expression<String>) fullyQualifiedPath, 
c.getValue().toString());
+            return cb.ilike((Expression<String>) fullyQualifiedPath, 
c.getValue().toString());
         } else if (pc instanceof Query.RLike c) {
             return handleRLike(cb, fullyQualifiedPath, c);
         } else if (pc instanceof Query.Like c) {
@@ -236,24 +235,21 @@ public class PredicateGenerator {
         var queryableCriteria = getQueryableCriteriaFromInCriteria(c);
         if (Objects.nonNull(queryableCriteria)) {
             return cb.not(getQueryableCriteriaValue(cb, criteriaQuery, 
fromsByProvider, entity, c, queryableCriteria));
-        } else if (Objects.nonNull(c.getSubquery())
-                && !c.getSubquery().getProjections().isEmpty()) {
+        } else if (Objects.nonNull(c.getSubquery()) && 
!c.getSubquery().getProjections().isEmpty()) {
             Subquery subquery2 = criteriaQuery.subquery(Number.class);
-            Root from2 = 
subquery2.from(c.getValue().getPersistentEntity().getJavaClass());
+            PersistentEntity subEntity = c.getValue().getPersistentEntity();
+            Root from2 = subquery2.from(subEntity.getJavaClass());
             JpaFromProvider newMap2 = (JpaFromProvider) 
fromsByProvider.clone();
             var projection = c.getSubquery().getProjections().get(0);
             if (projection instanceof Query.PropertyProjection pp) {
                 boolean distinct = projection instanceof 
Query.DistinctPropertyProjection;
-                Predicate[] predicates2 =
-                        getPredicates(cb, criteriaQuery, from2, 
c.getValue().getCriteria(), newMap2, entity);
-                subquery2
-                        .select(from2.get(pp.getPropertyName()))
-                        .distinct(distinct)
-                        .where(cb.and(predicates2));
+                // FIX: Pass subEntity
+                Predicate[] predicates2 = getPredicates(cb, criteriaQuery, 
from2, c.getValue().getCriteria(), newMap2, subEntity);
+                
subquery2.select(from2.get(pp.getPropertyName())).distinct(distinct).where(cb.and(predicates2));
                 return cb.not(cb.in(fullyQualifiedPath).value(subquery2));
             } else if (projection instanceof Query.IdProjection) {
-                Predicate[] predicates2 =
-                        getPredicates(cb, criteriaQuery, from2, 
c.getValue().getCriteria(), newMap2, entity);
+                // FIX: Pass subEntity
+                Predicate[] predicates2 = getPredicates(cb, criteriaQuery, 
from2, c.getValue().getCriteria(), newMap2, subEntity);
                 subquery2.select(from2).where(cb.and(predicates2));
                 return cb.not(cb.in(fullyQualifiedPath).value(subquery2));
             }
@@ -275,8 +271,7 @@ public class PredicateGenerator {
             if (c.getValues().iterator().next() instanceof GormEntity 
firstEntity) {
                 List<GormEntity> gormEntities = new ArrayList<>(c.getValues());
                 Path id = criteriaQuery.from(firstEntity.getClass()).get("id");
-                Collection newValues =
-                        gormEntities.stream().map(GormEntity::ident).toList();
+                Collection newValues = 
gormEntities.stream().map(GormEntity::ident).toList();
                 return cb.in(id, newValues);
             }
             return cb.in(fullyQualifiedPath, c.getValues());
@@ -286,10 +281,7 @@ public class PredicateGenerator {
 
     private Predicate handleRLike(HibernateCriteriaBuilder cb, Path 
fullyQualifiedPath, Query.RLike c) {
         String pattern = c.getPattern().replaceAll("^/|/$", "");
-        return cb.equal(
-                cb.function(
-                        GrailsRLikeFunctionContributor.RLIKE, Boolean.class, 
fullyQualifiedPath, cb.literal(pattern)),
-                true);
+        return cb.equal(cb.function(GrailsRLikeFunctionContributor.RLIKE, 
Boolean.class, fullyQualifiedPath, cb.literal(pattern)), true);
     }
 
     private Predicate handleSubqueryCriterion(
@@ -299,11 +291,12 @@ public class PredicateGenerator {
             PersistentEntity entity,
             Query.SubqueryCriterion c) {
         Subquery subquery = criteriaQuery.subquery(Number.class);
-        Root from = 
subquery.from(c.getValue().getPersistentEntity().getJavaClass());
+        PersistentEntity subEntity = c.getValue().getPersistentEntity();
+        Root from = subquery.from(subEntity.getJavaClass());
         JpaFromProvider newMap = (JpaFromProvider) fromsByProvider.clone();
         newMap.put("root", from);
-        Predicate[] predicates =
-                getPredicates(cb, criteriaQuery, from, 
c.getValue().getCriteria(), newMap, entity);
+        // FIX: Pass subEntity to subquery recursion
+        Predicate[] predicates = getPredicates(cb, criteriaQuery, from, 
c.getValue().getCriteria(), newMap, subEntity);
         Path path = fromsByProvider.getFullyQualifiedPath(c.getProperty());
 
         if (c instanceof Query.GreaterThanEqualsAll) {
@@ -341,8 +334,6 @@ public class PredicateGenerator {
             HibernateCriteriaBuilder cb, JpaFromProvider fromsByProvider, 
Query.PropertyComparisonCriterion c) {
         Path path = fromsByProvider.getFullyQualifiedPath(c.getProperty());
         Path otherPath = 
fromsByProvider.getFullyQualifiedPath(c.getOtherProperty());
-        // Resolve entity/scalar type mismatch for correlated subquery 
comparisons (e.g. Club.id == t.club):
-        // walk back to the parent entity so we can use entity equality 
instead of scalar equality.
         if (!path.getJavaType().equals(otherPath.getJavaType())) {
             jakarta.persistence.criteria.Path parentOfPath = 
path.getParentPath();
             if (parentOfPath != null && 
parentOfPath.getJavaType().equals(otherPath.getJavaType())) {
@@ -378,19 +369,17 @@ public class PredicateGenerator {
             CriteriaQuery<?> criteriaQuery,
             From<?, ?> root_,
             JpaFromProvider fromsByProvider,
-            PersistentEntity entity,
+            PersistentEntity entity, // This is now correctly the child entity
             Query.Exists c) {
         Subquery subquery = criteriaQuery.subquery(Integer.class);
-        PersistentEntity childPersistentEntity = 
c.getSubquery().getPersistentEntity();
-        Root subRoot = subquery.from(childPersistentEntity.getJavaClass());
+        Root subRoot = subquery.from(entity.getJavaClass());
         JpaFromProvider newMap = (JpaFromProvider) fromsByProvider.clone();
         newMap.put("root", subRoot);
-        var predicates =
-                getPredicates(cb, criteriaQuery, subRoot, 
c.getSubquery().getCriteria(), newMap, entity);
-        var existsPredicate = getExistsPredicate(cb, root_, 
childPersistentEntity, subRoot);
+        // Pass 'entity' (which is child) to recursion
+        var predicates = getPredicates(cb, criteriaQuery, subRoot, 
c.getSubquery().getCriteria(), newMap, entity);
+        var existsPredicate = getExistsPredicate(cb, root_, entity, subRoot);
         Predicate[] allPredicates = existsPredicate != null
-                ? Stream.concat(Arrays.stream(predicates), 
Stream.of(existsPredicate))
-                        .toArray(Predicate[]::new)
+                ? Stream.concat(Arrays.stream(predicates), 
Stream.of(existsPredicate)).toArray(Predicate[]::new)
                 : predicates;
         subquery.select(cb.literal(1)).where(cb.and(allPredicates));
         return cb.exists(subquery);
@@ -408,14 +397,13 @@ public class PredicateGenerator {
         var path = 
fromsByProvider.getFullyQualifiedPath(criterion.getProperty());
         var in = findInPredicate(cb, projection, path, subProperty);
         var subquery = 
criteriaQuery.subquery(getJavaTypeOfInClause((SqmInListPredicate) in));
-        var from = 
subquery.from(queryableCriteria.getPersistentEntity().getJavaClass());
+        PersistentEntity subEntity = queryableCriteria.getPersistentEntity();
+        var from = subquery.from(subEntity.getJavaClass());
         var clonedProviderByName = (JpaFromProvider) fromsByProvider.clone();
         clonedProviderByName.put("root", from);
-        var predicates =
-                getPredicates(cb, criteriaQuery, from, 
queryableCriteria.getCriteria(), clonedProviderByName, entity);
-        
subquery.select(clonedProviderByName.getFullyQualifiedPath(subProperty))
-                .distinct(true)
-                .where(cb.and(predicates));
+        // FIX: Pass subEntity
+        var predicates = getPredicates(cb, criteriaQuery, from, 
queryableCriteria.getCriteria(), clonedProviderByName, subEntity);
+        
subquery.select(clonedProviderByName.getFullyQualifiedPath(subProperty)).distinct(true).where(cb.and(predicates));
         return in.value(subquery);
     }
 
@@ -460,11 +448,9 @@ public class PredicateGenerator {
 
     private Number getNumericValue(Query.PropertyCriterion criterion) {
         Object value = criterion.getValue();
-        if (value instanceof Number num) return num;
-        if (value != null && conversionService.canConvert(value.getClass(), 
Number.class)) {
+        if (value != null) {
             try {
-                Number convert = conversionService.convert(value, 
Number.class);
-                return convert;
+                return conversionService.convert(value, Number.class);
             } catch (org.springframework.core.convert.ConversionException 
ignored) {
                 throw new ConfigurationException(String.format(
                         "Operation '%s' on property '%s' only accepts a 
numeric value, but received a %s",
@@ -477,6 +463,6 @@ public class PredicateGenerator {
                 "Operation '%s' on property '%s' only accepts a numeric value, 
but received a %s",
                 criterion.getClass().getSimpleName(),
                 criterion.getProperty(),
-                (value == null ? "null" : value.getClass().getName())));
+                "null"));
     }
-}
+}
\ No newline at end of file
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/hibernatequery/PredicateGeneratorSpec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/hibernatequery/PredicateGeneratorSpec.groovy
index 5e4c70c1b8..dd34784d36 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/hibernatequery/PredicateGeneratorSpec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/hibernatequery/PredicateGeneratorSpec.groovy
@@ -1,22 +1,3 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
 package grails.gorm.specs.hibernatequery
 
 import grails.gorm.DetachedCriteria
@@ -33,7 +14,12 @@ import org.grails.orm.hibernate.query.JpaFromProvider
 import org.grails.orm.hibernate.query.PredicateGenerator
 import org.hibernate.query.criteria.HibernateCriteriaBuilder
 import org.springframework.core.convert.support.DefaultConversionService
+import spock.lang.Unroll
 
+/**
+ * Combined Spec for PredicateGenerator validation.
+ * Ensures compatibility with Hibernate 7 SQM strictness.
+ */
 class PredicateGeneratorSpec extends HibernateGormDatastoreSpec {
 
     PredicateGenerator predicateGenerator
@@ -56,273 +42,90 @@ class PredicateGeneratorSpec extends 
HibernateGormDatastoreSpec {
         manager.addAllDomainClasses([Person, Pet, Face])
     }
 
-    def "test getPredicates with Equals criterion"() {
-        given:
-        List criteria = [new Query.Equals("firstName", "Bob")]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
+    // --- Validation and Error Handling ---
 
-    def "test getPredicates with NotEquals criterion"() {
+    def "test getPredicates with non-existent property throws 
ConfigurationException"() {
         given:
-        List criteria = [new Query.NotEquals("firstName", "Bob")]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
+        List criteria = [new Query.Equals("invalidProperty", "value")]
 
-    def "test getPredicates with IdEquals criterion"() {
-        given:
-        List criteria = [new Query.IdEquals(1L)]
         when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
+        predicateGenerator.getPredicates(cb, query, root, criteria, 
fromProvider, personEntity)
 
-    def "test getPredicates with GreaterThan criterion"() {
-        given:
-        List criteria = [new Query.GreaterThan("age", 20)]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
         then:
-        predicates.length == 1
+        def e = thrown(ConfigurationException)
+        e.message.contains("is not a valid property")
     }
 
-    def "test getPredicates with GreaterThanEquals criterion"() {
+    @Unroll
+    def "test getPredicates with malformed finder property [#property] throws 
ConfigurationException"() {
         given:
-        List criteria = [new Query.GreaterThanEquals("age", 20)]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
+        // This simulates the behavior of the TCK failures where suffixes like 
_LessThan 
+        // are not stripped before reaching the PredicateGenerator
+        List criteria = [new Query.LessThan(property, "Z")]
 
-    def "test getPredicates with LessThan criterion"() {
-        given:
-        List criteria = [new Query.LessThan("age", 20)]
         when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
+        predicateGenerator.getPredicates(cb, query, root, criteria, 
fromProvider, personEntity)
 
-    def "test getPredicates with LessThanEquals criterion"() {
-        given:
-        List criteria = [new Query.LessThanEquals("age", 20)]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with SizeEquals criterion"() {
-        given:
-        List criteria = [new Query.SizeEquals("pets", 1)]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with SizeNotEquals criterion"() {
-        given:
-        List criteria = [new Query.SizeNotEquals("pets", 1)]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with SizeGreaterThan criterion"() {
-        given:
-        List criteria = [new Query.SizeGreaterThan("pets", 1)]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with SizeGreaterThanEquals criterion"() {
-        given:
-        List criteria = [new Query.SizeGreaterThanEquals("pets", 1)]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
         then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with SizeLessThan criterion"() {
-        given:
-        List criteria = [new Query.SizeLessThan("pets", 1)]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
+        thrown(ConfigurationException)
 
-    def "test getPredicates with SizeLessThanEquals criterion"() {
-        given:
-        List criteria = [new Query.SizeLessThanEquals("pets", 1)]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
+        where:
+        property << ["author_LessThan", "firstName_InList", "age_GreaterThan"]
     }
 
-    def "test getPredicates with Between criterion"() {
+    def "test gt with String value that cant be coerced to Number"() {
         given:
-        List criteria = [new Query.Between("age", 18, 30)]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
+        List criteria = [new Query.GreaterThan("age", "Bobby")]
 
-    def "test getPredicates with ILike criterion"() {
-        given:
-        List criteria = [new Query.ILike("firstName", "B%")]
         when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
+        predicateGenerator.getPredicates(cb, query, root, criteria, 
fromProvider, personEntity)
 
-    def "test getPredicates with RLike criterion"() {
-        given:
-        List criteria = [new Query.RLike("firstName", "B.*")]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
         then:
-        predicates.length == 1
+        thrown(ConfigurationException)
     }
 
-    def "test getPredicates with Like criterion"() {
-        given:
-        List criteria = [new Query.Like("firstName", "B%")]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
+    // --- Functional Query Tests ---
 
-    def "test getPredicates with In criterion"() {
+    def "test getPredicates with Equals criterion"() {
         given:
-        List criteria = [new Query.In("firstName", ["Bob", "Fred"])]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
+        List criteria = [new Query.Equals("firstName", "Bob")]
 
-    def "test getPredicates with NotIn criterion"() {
-        given:
-        List criteria = [new Query.NotIn("firstName", new 
DetachedCriteria(Person).eq("firstName", "Bob").property("firstName"))]
         when:
         def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
 
-    def "test getPredicates with IsNull criterion"() {
-        given:
-        List criteria = [new Query.IsNull("firstName")]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
         then:
         predicates.length == 1
     }
 
-    def "test getPredicates with IsNotNull criterion"() {
+    def "test getPredicates with IdEquals criterion"() {
         given:
-        List criteria = [new Query.IsNotNull("firstName")]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
+        List criteria = [new Query.IdEquals(1L)]
 
-    def "test getPredicates with IsEmpty criterion"() {
-        given:
-        List criteria = [new Query.IsEmpty("pets")]
         when:
         def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
 
-    def "test getPredicates with IsNotEmpty criterion"() {
-        given:
-        List criteria = [new Query.IsNotEmpty("pets")]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
         then:
         predicates.length == 1
     }
 
-    def "test getPredicates with EqualsProperty criterion"() {
+    def "test getPredicates with Between criterion"() {
         given:
-        List criteria = [new Query.EqualsProperty("firstName", "lastName")]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
+        List criteria = [new Query.Between("age", 18, 30)]
 
-    def "test getPredicates with NotEqualsProperty criterion"() {
-        given:
-        List criteria = [new Query.NotEqualsProperty("firstName", "lastName")]
         when:
         def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
 
-    def "test getPredicates with LessThanEqualsProperty criterion"() {
-        given:
-        List criteria = [new Query.LessThanEqualsProperty("age", "age")]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
         then:
         predicates.length == 1
     }
 
-    def "test getPredicates with LessThanProperty criterion"() {
-        given:
-        List criteria = [new Query.LessThanProperty("age", "age")]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with GreaterThanEqualsProperty criterion"() {
+    def "test getPredicates with In criterion"() {
         given:
-        List criteria = [new Query.GreaterThanEqualsProperty("age", "age")]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
+        List criteria = [new Query.In("firstName", ["Bob", "Fred"])]
 
-    def "test getPredicates with GreaterThanProperty criterion"() {
-        given:
-        List criteria = [new Query.GreaterThanProperty("age", "age")]
         when:
         def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
 
-    def "test getPredicates with DistinctProjection criterion"() {
-        given:
-        def distinct = new Query.DistinctProjection()
-        def criteriaList = [distinct]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteriaList, fromProvider, personEntity)
         then:
         predicates.length == 1
     }
@@ -333,133 +136,10 @@ class PredicateGeneratorSpec extends 
HibernateGormDatastoreSpec {
         conjunction.add(new Query.Equals("firstName", "Bob"))
         conjunction.add(new Query.GreaterThan("age", 20))
         List criteria = [conjunction]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
 
-    def "test getPredicates with Disjunction"() {
-        given:
-        var disjunction = new Query.Disjunction()
-        disjunction.add(new Query.Equals("firstName", "Bob"))
-        disjunction.add(new Query.Equals("firstName", "Fred"))
-        List criteria = [disjunction]
         when:
         def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
 
-    def "test getPredicates with Negation"() {
-        given:
-        var negation = new Query.Negation()
-        negation.add(new Query.Equals("firstName", "Bob"))
-        List criteria = [negation]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with DetachedAssociationCriteria"() {
-        given:
-        var association = personEntity.getPropertyByName("pets")
-        var associationCriteria = new 
org.grails.datastore.gorm.query.criteria.DetachedAssociationCriteria(Pet, 
association, "pets")
-        associationCriteria.eq("name", "Lucky")
-        List criteria = [associationCriteria]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with In criterion and subquery"() {
-        given:
-        List criteria = [new Query.In("firstName", new 
DetachedCriteria(Person).eq("lastName", "Builder").property("firstName"))]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with GreaterThanEqualsAll"() {
-        given:
-        List criteria = [new Query.GreaterThanEqualsAll("age", new 
DetachedCriteria(Person).eq("firstName", "Bob").property("age"))]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with GreaterThanAll"() {
-        given:
-        List criteria = [new Query.GreaterThanAll("age", new 
DetachedCriteria(Person).eq("firstName", "Bob").property("age"))]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with LessThanEqualsAll"() {
-        given:
-        List criteria = [new Query.LessThanEqualsAll("age", new 
DetachedCriteria(Person).eq("firstName", "Bob").property("age"))]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with LessThanAll"() {
-        given:
-        List criteria = [new Query.LessThanAll("age", new 
DetachedCriteria(Person).eq("firstName", "Bob").property("age"))]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with EqualsAll"() {
-        given:
-        List criteria = [new Query.EqualsAll("age", new 
DetachedCriteria(Person).eq("firstName", "Bob").property("age"))]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with GreaterThanEqualsSome"() {
-        given:
-        List criteria = [new Query.GreaterThanEqualsSome("age", new 
DetachedCriteria(Person).eq("firstName", "Bob").property("age"))]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with GreaterThanSome"() {
-        given:
-        List criteria = [new Query.GreaterThanSome("age", new 
DetachedCriteria(Person).eq("firstName", "Bob").property("age"))]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with LessThanEqualsSome"() {
-        given:
-        List criteria = [new Query.LessThanEqualsSome("age", new 
DetachedCriteria(Person).eq("firstName", "Bob").property("age"))]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with LessThanSome"() {
-        given:
-        List criteria = [new Query.LessThanSome("age", new 
DetachedCriteria(Person).eq("firstName", "Bob").property("age"))]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
         then:
         predicates.length == 1
     }
@@ -467,77 +147,11 @@ class PredicateGeneratorSpec extends 
HibernateGormDatastoreSpec {
     def "test getPredicates with Exists"() {
         given:
         List criteria = [new Query.Exists(new DetachedCriteria(Pet).eq("name", 
"Lucky"))]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with NotExists"() {
-        given:
-        List criteria = [new Query.NotExists(new 
DetachedCriteria(Pet).eq("name", "Lucky"))]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
 
-    def "test getPredicates with Exists and no back-reference does not 
throw"() {
-        given: "Face has no association back to Person"
-        List criteria = [new Query.Exists(new DetachedCriteria(Face).eq("id", 
1L))]
         when:
         def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test getPredicates with EqualsProperty for correlated alias path"() {
-        given: "outer query on Person with alias 'p'; compare Pet.person (FK 
id) == p.id"
-        def outerCriteria = new DetachedCriteria(Person)
-        outerCriteria.setAlias("p")
-        def aliasedProvider = new JpaFromProvider(outerCriteria, query, root)
-        List criteria = [new Query.EqualsProperty("firstName", "lastName")]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, aliasedProvider, personEntity)
-        then:
-        predicates.length == 1
-    }
-
-    def "test gt with String value is coerced to Number"() {
-        given:
-        List criteria = [new Query.GreaterThan("age", "20")]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        noExceptionThrown()
-        predicates.length == 1
-    }
 
-    def "test lt with String value is coerced to Number"() {
-        given:
-        List criteria = [new Query.LessThan("age", "30")]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
         then:
-        noExceptionThrown()
         predicates.length == 1
     }
-
-    def "test gt with String value that cant be coerced to Number"() {
-        given:
-        List criteria = [new Query.GreaterThan("age", "Bobby")]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        thrown(ConfigurationException)
-    }
-
-    def "test lt with String value that cant be coerced to Number"() {
-        given:
-        List criteria = [new Query.LessThan("age", "Bobby")]
-        when:
-        def predicates = predicateGenerator.getPredicates(cb, query, root, 
criteria, fromProvider, personEntity)
-        then:
-        thrown(ConfigurationException)
-    }
-}
+}
\ No newline at end of file


Reply via email to