You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by bo...@apache.org on 2026/06/26 17:55:28 UTC
(grails-core) branch 8.0.x-hibernate7.gorm-scaling-clean updated (5ad16445c5 -> b4dd42f312)
This is an automated email from the ASF dual-hosted git repository.
borinquenkid pushed a change to branch 8.0.x-hibernate7.gorm-scaling-clean
in repository https://gitbox.apache.org/repos/asf/grails-core.git
from 5ad16445c5 Merge branch '8.0.x' into 8.0.x-hibernate7.gorm-scaling-clean
new 1658d7aae7 Fix CI compilation failures: static type errors, duplicate import, and debug spec cleanup
new b4dd42f312 Restore as Class[] casts in GrailsDataHibernate5TckManager dropped by merge
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../core/GrailsDataHibernate5TckManager.groovy | 4 +-
.../grails/gorm/hibernate/HibernateEntity.groovy | 4 +-
.../orm/hibernate/HibernateGormStaticApi.groovy | 19 ++---
.../gorm/mongo/DebugGeoJSONDecodeSpec.groovy | 82 ----------------------
.../gorm/mongo/DebugGeoJSONQuerySpec.groovy | 66 -----------------
.../datastore/gorm/mongo/DebugGeoJSONSpec.groovy | 73 -------------------
.../datastore/gorm/mongo/DebugGetSpec.groovy | 54 --------------
.../datastore/gorm/mongo/GeoPlaceTest.groovy | 66 -----------------
.../datastore/gorm/mongo/GeoRetrieveTest.groovy | 64 -----------------
.../datastore/gorm/mongo/SimplePlaceTest.groovy | 52 --------------
.../tests/DataServiceConnectionRoutingSpec.groovy | 12 ++++
...aServiceMultiTenantConnectionRoutingSpec.groovy | 11 +++
.../tck/tests/DomainMultiDataSourceSpec.groovy | 12 ++++
.../DomainMultiTenantMultiDataSourceSpec.groovy | 11 +++
14 files changed, 61 insertions(+), 469 deletions(-)
delete mode 100644 grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/DebugGeoJSONDecodeSpec.groovy
delete mode 100644 grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/DebugGeoJSONQuerySpec.groovy
delete mode 100644 grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/DebugGeoJSONSpec.groovy
delete mode 100644 grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/DebugGetSpec.groovy
delete mode 100644 grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/GeoPlaceTest.groovy
delete mode 100644 grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/GeoRetrieveTest.groovy
delete mode 100644 grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/SimplePlaceTest.groovy
(grails-core) 02/02: Restore as Class[] casts in GrailsDataHibernate5TckManager dropped by merge
Posted by bo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
borinquenkid pushed a commit to branch 8.0.x-hibernate7.gorm-scaling-clean
in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit b4dd42f312a3c633125572da617b3e69f67fa3cc
Author: Walter Duque de Estrada <wb...@mac.com>
AuthorDate: Fri Jun 26 12:50:17 2026 -0500
Restore as Class[] casts in GrailsDataHibernate5TckManager dropped by merge
The cosmetics cleanup commit (efc250a173) removed the 'as Class[]' coercions
from domainClasses when passing it to DefaultGrailsApplication and
HibernateDatastore constructors. Those constructors expect Class<?>[] but
getDomainClasses() returns Collections.unmodifiableList() (an
UnmodifiableRandomAccessList), so Groovy's MOP cannot find a matching
constructor at runtime, failing every TCK spec with:
GroovyRuntimeException: Could not find matching constructor for:
DefaultGrailsApplication(UnmodifiableRandomAccessList, GroovyClassLoader)
Co-Authored-By: Claude Sonnet 4.6 <no...@anthropic.com>
---
.../grails/data/hibernate5/core/GrailsDataHibernate5TckManager.groovy | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/grails-data-hibernate5/core/src/test/groovy/org/apache/grails/data/hibernate5/core/GrailsDataHibernate5TckManager.groovy b/grails-data-hibernate5/core/src/test/groovy/org/apache/grails/data/hibernate5/core/GrailsDataHibernate5TckManager.groovy
index b6a730ae32..e4ce172698 100644
--- a/grails-data-hibernate5/core/src/test/groovy/org/apache/grails/data/hibernate5/core/GrailsDataHibernate5TckManager.groovy
+++ b/grails-data-hibernate5/core/src/test/groovy/org/apache/grails/data/hibernate5/core/GrailsDataHibernate5TckManager.groovy
@@ -73,10 +73,10 @@ class GrailsDataHibernate5TckManager extends GrailsDataTckManager {
boolean isTransactional = true
System.setProperty('hibernate5.gorm.suite', "true")
- grailsApplication = new DefaultGrailsApplication(domainClasses, new GroovyClassLoader(GrailsDataHibernate5TckManager.getClassLoader()))
+ grailsApplication = new DefaultGrailsApplication(domainClasses as Class[], new GroovyClassLoader(GrailsDataHibernate5TckManager.getClassLoader()))
grailsApplication.config.putAll(config)
- hibernateDatastore = new HibernateDatastore(DatastoreUtils.createPropertyResolver(config), domainClasses)
+ hibernateDatastore = new HibernateDatastore(DatastoreUtils.createPropertyResolver(config), domainClasses as Class[])
transactionManager = hibernateDatastore.getTransactionManager()
sessionFactory = hibernateDatastore.sessionFactory
if (transactionStatus == null && isTransactional) {
(grails-core) 01/02: Fix CI compilation failures: static type errors, duplicate import, and debug spec cleanup
Posted by bo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
borinquenkid pushed a commit to branch 8.0.x-hibernate7.gorm-scaling-clean
in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 1658d7aae7e332abc7251261e6cdcab36f4138f8
Author: Walter Duque de Estrada <wb...@mac.com>
AuthorDate: Fri Jun 26 12:43:05 2026 -0500
Fix CI compilation failures: static type errors, duplicate import, and debug spec cleanup
- HibernateGormStaticApi: replace bare `persistentEntity` references (from
the now-removed AbstractGormApi field) with `gormPersistentEntity` property
calls in buildWhereHql, validateWherePropertyName, getAllInternal,
prepareHqlQuery, firePostQueryEvent, and firePreQueryEvent; fixes 17
@CompileStatic errors that appeared after the GormRegistry migration removed
the field
- HibernateGormStaticApi: remove duplicate `import...Query` (was shadowing the
aliased `import...Query as GormQuery`); update two bare Query usages to GormQuery
- HibernateEntity: replace removed GormEnhancer.findStaticApi() call with
GormRegistry.findStaticApi() so currentHibernateStaticApi() compiles under
@CompileStatic
- grails-data-mongodb: remove 7 debug/duplicate geo test files (DebugGeoJSONSpec,
DebugGeoJSONDecodeSpec, DebugGeoJSONQuerySpec, DebugGetSpec, GeoPlaceTest,
GeoRetrieveTest, SimplePlaceTest) that imported a non-existent MongoDatastoreSpec
and whose coverage is fully provided by GeoJSONTypePersistenceSpec
- grails-datamapping-tck: add Javadoc to four replacement specs explaining why
CrossLayerMultiDataSourceSpec and CrossLayerMultiTenantMultiDataSourceSpec were
removed and where their coverage now lives
Co-Authored-By: Claude Sonnet 4.6 <no...@anthropic.com>
---
.../grails/gorm/hibernate/HibernateEntity.groovy | 4 +-
.../orm/hibernate/HibernateGormStaticApi.groovy | 19 ++---
.../gorm/mongo/DebugGeoJSONDecodeSpec.groovy | 82 ----------------------
.../gorm/mongo/DebugGeoJSONQuerySpec.groovy | 66 -----------------
.../datastore/gorm/mongo/DebugGeoJSONSpec.groovy | 73 -------------------
.../datastore/gorm/mongo/DebugGetSpec.groovy | 54 --------------
.../datastore/gorm/mongo/GeoPlaceTest.groovy | 66 -----------------
.../datastore/gorm/mongo/GeoRetrieveTest.groovy | 64 -----------------
.../datastore/gorm/mongo/SimplePlaceTest.groovy | 52 --------------
.../tests/DataServiceConnectionRoutingSpec.groovy | 12 ++++
...aServiceMultiTenantConnectionRoutingSpec.groovy | 11 +++
.../tck/tests/DomainMultiDataSourceSpec.groovy | 12 ++++
.../DomainMultiTenantMultiDataSourceSpec.groovy | 11 +++
13 files changed, 59 insertions(+), 467 deletions(-)
diff --git a/grails-data-hibernate7/core/src/main/groovy/grails/gorm/hibernate/HibernateEntity.groovy b/grails-data-hibernate7/core/src/main/groovy/grails/gorm/hibernate/HibernateEntity.groovy
index 23677dd143..c85676f784 100644
--- a/grails-data-hibernate7/core/src/main/groovy/grails/gorm/hibernate/HibernateEntity.groovy
+++ b/grails-data-hibernate7/core/src/main/groovy/grails/gorm/hibernate/HibernateEntity.groovy
@@ -23,7 +23,7 @@ import groovy.transform.Generated
import org.codehaus.groovy.runtime.InvokerHelper
import org.grails.datastore.gorm.GormEntity
-import org.grails.datastore.gorm.GormEnhancer
+import org.grails.datastore.gorm.GormRegistry
import org.grails.datastore.mapping.model.PersistentEntity
import org.grails.datastore.mapping.model.types.Association
import org.grails.datastore.mapping.model.types.ToOne
@@ -141,7 +141,7 @@ trait HibernateEntity<D> extends GormEntity<D> {
@Generated
private static HibernateGormStaticApi currentHibernateStaticApi() {
- (HibernateGormStaticApi) GormEnhancer.findStaticApi(this)
+ (HibernateGormStaticApi) GormRegistry.findStaticApi(this)
}
/**
diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy
index c904016a90..06a1e153c3 100644
--- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy
+++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy
@@ -44,7 +44,6 @@ import org.grails.datastore.mapping.model.PersistentProperty
import org.grails.datastore.mapping.model.config.GormProperties
import org.grails.datastore.mapping.model.types.Basic
import org.grails.datastore.mapping.model.types.Simple
-import org.grails.datastore.mapping.query.Query
import org.grails.datastore.mapping.query.Restrictions
import org.grails.datastore.mapping.query.api.BuildableCriteria
import org.grails.datastore.mapping.query.event.PostQueryEvent
@@ -214,7 +213,7 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> {
List<D> list(Map params) {
PersistentEntity entity = getGormPersistentEntity()
HqlQueryContext ctx = HqlQueryContext.prepare(entity, null, null, null, params, new HashMap<>(), false, false)
- Query q = HibernateHqlQueryCreator.createHqlQuery(getHibernateDatastore(), getHibernateDatastore().getSessionFactory(), entity, ctx)
+ GormQuery q = HibernateHqlQueryCreator.createHqlQuery(getHibernateDatastore(), getHibernateDatastore().getSessionFactory(), entity, ctx)
if (HqlListQueryBuilder.isPaged(params)) {
return (List<D>) new PagedResultList(q)
}
@@ -439,17 +438,19 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> {
}
private String buildWhereHql(Map<String, Object> queryMap) {
+ PersistentEntity pe = gormPersistentEntity
String whereClause = queryMap.collect { String key, Object value ->
String propertyName = validateWherePropertyName(key)
value == null ? "$propertyName is null" : "$propertyName = :$propertyName"
}.join(' and ')
- return "from ${persistentEntity.name} where $whereClause"
+ return "from ${pe.name} where $whereClause"
}
private String validateWherePropertyName(String propertyName) {
- PersistentProperty property = persistentEntity.getPropertyByName(propertyName)
+ PersistentEntity pe = gormPersistentEntity
+ PersistentProperty property = pe.getPropertyByName(propertyName)
if (property == null || property.name != propertyName) {
- throw new IllegalArgumentException("Property [$propertyName] is not a valid property of ${persistentEntity.name}")
+ throw new IllegalArgumentException("Property [$propertyName] is not a valid property of ${pe.name}")
}
return propertyName
}
@@ -507,6 +508,7 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> {
private List<D> getAllInternal(List ids) {
if (!ids) return []
+ PersistentEntity persistentEntity = gormPersistentEntity
String idName = persistentEntity.identity.name
String entity = persistentEntity.name
Class<?> idType = persistentEntity.identity.type
@@ -611,7 +613,7 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> {
} as SessionCallback<D>)
}
- protected void populateQueryByExample(Session session, Query query, D example) {
+ protected void populateQueryByExample(Session session, GormQuery query, D example) {
PersistentEntity pe = getGormPersistentEntity()
MappingContext mappingContext = pe.mappingContext
def ea = mappingContext.createEntityAccess(pe, example)
@@ -711,6 +713,7 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> {
Map namedParams,
Collection positionalParams,
Map args) {
+ PersistentEntity persistentEntity = gormPersistentEntity
Map<String, Object> coercedParams = namedParams?.collectEntries { k, v -> [k.toString(), v] } ?: [:]
Map<String, Object> coercedArgs = args?.collectEntries { k, v -> [k.toString(), v] } ?: [:]
def ctx = HqlQueryContext.prepare(persistentEntity, hql, coercedParams, positionalParams, coercedArgs, new HashMap<>(), isNative, isUpdate)
@@ -724,14 +727,14 @@ class HibernateGormStaticApi<D> extends GormStaticApi<D> {
protected void firePostQueryEvent(Object result) {
def hibernateSession = new HibernateSession(getHibernateDatastore(), getHibernateDatastore().getSessionFactory())
- def hibernateQuery = new HibernateQuery(hibernateSession, (GrailsHibernatePersistentEntity) persistentEntity)
+ def hibernateQuery = new HibernateQuery(hibernateSession, (GrailsHibernatePersistentEntity) gormPersistentEntity)
def list = result instanceof List ? (List) result : Collections.singletonList(result)
getHibernateDatastore().applicationEventPublisher.publishEvent(new PostQueryEvent(getHibernateDatastore(), hibernateQuery, list))
}
protected void firePreQueryEvent() {
def hibernateSession = new HibernateSession(getHibernateDatastore(), getHibernateDatastore().getSessionFactory())
- def hibernateQuery = new HibernateQuery(hibernateSession, (GrailsHibernatePersistentEntity) persistentEntity)
+ def hibernateQuery = new HibernateQuery(hibernateSession, (GrailsHibernatePersistentEntity) gormPersistentEntity)
getHibernateDatastore().applicationEventPublisher.publishEvent(new PreQueryEvent(getHibernateDatastore(), hibernateQuery))
}
diff --git a/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/DebugGeoJSONDecodeSpec.groovy b/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/DebugGeoJSONDecodeSpec.groovy
deleted file mode 100644
index 6dbdd4d719..0000000000
--- a/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/DebugGeoJSONDecodeSpec.groovy
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2026 the original author or authors.
- *
- * Licensed 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.datastore.gorm.mongo
-
-import org.apache.grails.data.mongo.core.MongoDatastoreSpec
-import grails.mongodb.geo.GeometryCollection
-import grails.mongodb.geo.Point
-import grails.persistence.Entity
-
-class DebugGeoJSONDecodeSpec extends MongoDatastoreSpec {
-
- void setupSpec() {
- manager.addAllDomainClasses([PlaceWithGeoJSON])
- }
-
- void "test simple GeoJSON field"() {
- when: "A Place with a single GeoJSON field is saved"
- def p = new PlaceWithGeoJSON(point: Point.valueOf(5, 10))
- p.save(flush: true, validate: false)
- def savedId = p.id
- println "Saved Place with id: ${savedId}, point: ${p.point}"
-
- and: "The session is cleared"
- manager.session.clear()
-
- and: "Place.get() is called"
- println "Calling PlaceWithGeoJSON.get(${savedId})..."
- def retrieved = PlaceWithGeoJSON.get(savedId)
- println "Retrieved: ${retrieved}"
-
- then: "The Place should be retrieved"
- retrieved != null
- retrieved.id == savedId
- retrieved.point == Point.valueOf(5, 10)
- }
-
- void "test GeoJSON collection field"() {
- when: "A Place with a GeometryCollection is saved"
- def col = new GeometryCollection()
- col << Point.valueOf(5, 10)
- println "Created GeometryCollection: ${col}"
-
- def p = new PlaceWithGeoJSON(geometryCollection: col)
- p.save(flush: true, validate: false)
- def savedId = p.id
- println "Saved Place with id: ${savedId}, geomCollection: ${p.geometryCollection}"
-
- and: "The session is cleared"
- manager.session.clear()
-
- and: "Place.get() is called"
- println "Calling PlaceWithGeoJSON.get(${savedId})..."
- def retrieved = PlaceWithGeoJSON.get(savedId)
- println "Retrieved: ${retrieved}"
-
- then: "The Place should be retrieved"
- retrieved != null
- retrieved.id == savedId
- retrieved.geometryCollection == col
- }
-}
-
-@Entity
-class PlaceWithGeoJSON {
- Long id
- Point point
- GeometryCollection geometryCollection
-}
diff --git a/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/DebugGeoJSONQuerySpec.groovy b/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/DebugGeoJSONQuerySpec.groovy
deleted file mode 100644
index 4da4ac471c..0000000000
--- a/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/DebugGeoJSONQuerySpec.groovy
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright 2026 the original author or authors.
- *
- * Licensed 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.datastore.gorm.mongo
-
-import org.apache.grails.data.mongo.core.MongoDatastoreSpec
-import grails.mongodb.geo.GeometryCollection
-import grails.mongodb.geo.Point
-import grails.persistence.Entity
-import com.mongodb.client.MongoCollection
-import org.bson.Document
-
-class DebugGeoJSONQuerySpec extends MongoDatastoreSpec {
-
- void setupSpec() {
- manager.addAllDomainClasses([PlaceWithGeoJSONQuery])
- }
-
- void "test raw query for GeoJSON collection field"() {
- when: "A Place with a GeometryCollection is saved"
- def col = new GeometryCollection()
- col << Point.valueOf(5, 10)
-
- def p = new PlaceWithGeoJSONQuery(geometryCollection: col)
- p.save(flush: true, validate: false)
- def savedId = p.id
- println "Saved Place with id: ${savedId}"
-
- and: "The session is cleared"
- manager.session.clear()
-
- and: "We do a raw query for the document"
- def entity = manager.mongoDatastore.mappingContext.getPersistentEntity(PlaceWithGeoJSONQuery.name)
- def collection = manager.session.getCollection(entity)
- println "Collection: ${collection}"
-
- def query = new Document('_id', savedId)
- println "Query: ${query}"
-
- def doc = collection.find(query).first()
- println "Raw document found: ${doc}"
-
- then: "The document should exist"
- doc != null
- }
-}
-
-@Entity
-class PlaceWithGeoJSONQuery {
- Long id
- Point point
- GeometryCollection geometryCollection
-}
diff --git a/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/DebugGeoJSONSpec.groovy b/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/DebugGeoJSONSpec.groovy
deleted file mode 100644
index 749e14cfeb..0000000000
--- a/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/DebugGeoJSONSpec.groovy
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2026 the original author or authors.
- *
- * Licensed 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.datastore.gorm.mongo
-
-import org.apache.grails.data.mongo.core.MongoDatastoreSpec
-import grails.mongodb.geo.Point
-import grails.persistence.Entity
-import com.mongodb.client.MongoCollection
-import org.bson.Document
-
-@Entity
-class DebugPlace {
- Long id
- String name
- Point point
-
- static mapping = {
- point geoIndex: '2dsphere'
- }
-}
-
-class DebugGeoJSONSpec extends MongoDatastoreSpec {
-
- void setupSpec() {
- manager.addAllDomainClasses([DebugPlace])
- }
-
- void "test debug place save and retrieve"() {
- when: "save a place with a point"
- def point = new Point(5, 10)
- def p = new DebugPlace(name: "Test", point: point)
- println "Before save: id=${p.id}"
- p.save(flush: true, validate: false)
- println "After save: id=${p.id}, object=${p}"
-
- then: "id should be set"
- p.id != null
-
- when: "check mongodb directly"
- MongoCollection<Document> col = manager.mongoDatastore.mongoClient
- .getDatabase("test")
- .getCollection("debugPlace")
- def allDocs = col.find().into([])
- println "Documents in MongoDB: ${allDocs.size()}"
- allDocs.each { println " $it" }
-
- then: "document should exist"
- allDocs.size() == 1
-
- when: "clear session and retrieve"
- manager.session.clear()
- def retrieved = DebugPlace.get(p.id)
- println "Retrieved: ${retrieved}"
-
- then: "should get the object back"
- retrieved != null
- retrieved.point == point
- }
-}
diff --git a/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/DebugGetSpec.groovy b/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/DebugGetSpec.groovy
deleted file mode 100644
index 0081903edc..0000000000
--- a/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/DebugGetSpec.groovy
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2026 the original author or authors.
- *
- * Licensed 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.datastore.gorm.mongo
-
-import org.apache.grails.data.mongo.core.MongoDatastoreSpec
-import grails.persistence.Entity
-
-class DebugGetSpec extends MongoDatastoreSpec {
-
- void setupSpec() {
- manager.addAllDomainClasses([TestPlace])
- }
-
- void "test Place.get() returns entity"() {
- when: "A simple Place is saved"
- def p = new TestPlace(name: "Test")
- p.save(flush: true, validate: false)
- def savedId = p.id
- println "Saved TestPlace with id: ${savedId}"
-
- and: "The session is cleared"
- manager.session.clear()
-
- and: "TestPlace.get() is called"
- println "Calling TestPlace.get(${savedId})..."
- def retrieved = TestPlace.get(savedId)
- println "Retrieved: ${retrieved}"
-
- then: "The TestPlace should be retrieved"
- retrieved != null
- retrieved.id == savedId
- retrieved.name == "Test"
- }
-}
-
-@Entity
-class TestPlace {
- Long id
- String name
-}
diff --git a/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/GeoPlaceTest.groovy b/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/GeoPlaceTest.groovy
deleted file mode 100644
index 1d6fa81777..0000000000
--- a/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/GeoPlaceTest.groovy
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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.datastore.gorm.mongo
-
-import org.apache.grails.data.mongo.core.MongoDatastoreSpec
-import grails.mongodb.geo.Point
-import grails.persistence.Entity
-import com.mongodb.client.MongoCollection
-import org.bson.Document
-
-@Entity
-class GeoPlace {
- Long id
- String name
- Point point
-
- static mapping = {
- point geoIndex: '2dsphere'
- }
-}
-
-class GeoPlaceTest extends MongoDatastoreSpec {
- void setupSpec() {
- manager.addAllDomainClasses([GeoPlace])
- }
-
- void "test geo save"() {
- when:
- def point = new Point(5, 10)
- def p = new GeoPlace(name: "Test", point: point)
- println "Before save: id=${p.id}"
- p.save(flush: true, validate: false)
- println "After save: id=${p.id}"
-
- then:
- p.id != null
-
- when:
- // Check MongoDB
- MongoCollection<Document> col = manager.mongoDatastore.mongoClient
- .getDatabase("test")
- .getCollection("geoPlace")
- def docs = col.find().into([])
- println "MongoDB has ${docs.size()} docs"
- docs.each { println "Doc: $it" }
-
- then:
- docs.size() == 1
- }
-}
diff --git a/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/GeoRetrieveTest.groovy b/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/GeoRetrieveTest.groovy
deleted file mode 100644
index 328d8ec80a..0000000000
--- a/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/GeoRetrieveTest.groovy
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * 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.datastore.gorm.mongo
-
-import org.apache.grails.data.mongo.core.MongoDatastoreSpec
-import grails.mongodb.geo.Point
-import grails.persistence.Entity
-import com.mongodb.client.MongoCollection
-import org.bson.Document
-
-@Entity
-class GeoPlace2 {
- Long id
- String name
- Point point
-
- static mapping = {
- point geoIndex: '2dsphere'
- }
-}
-
-class GeoRetrieveTest extends MongoDatastoreSpec {
- void setupSpec() {
- manager.addAllDomainClasses([GeoPlace2])
- }
-
- void "test geo retrieve"() {
- when:
- def point = new Point(5, 10)
- def p = new GeoPlace2(name: "Test", point: point)
- p.save(flush: true, validate: false)
- def savedId = p.id
- println "Saved with id: ${savedId}"
- manager.session.clear()
-
- then:
- savedId != null
-
- when:
- def retrieved = GeoPlace2.get(savedId)
- println "Retrieved: ${retrieved}"
- println "Retrieved.point: ${retrieved?.point}"
-
- then:
- retrieved != null
- retrieved.point == point
- }
-}
diff --git a/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/SimplePlaceTest.groovy b/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/SimplePlaceTest.groovy
deleted file mode 100644
index eb1ab5d81c..0000000000
--- a/grails-data-mongodb/core/src/test/groovy/org/grails/datastore/gorm/mongo/SimplePlaceTest.groovy
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.datastore.gorm.mongo
-
-import org.apache.grails.data.mongo.core.MongoDatastoreSpec
-import grails.mongodb.geo.Point
-import grails.persistence.Entity
-import com.mongodb.client.MongoCollection
-import org.bson.Document
-
-@Entity
-class SimplePlace {
- Long id
- String name
- Point point
-
- static mapping = {
- point geoIndex: '2dsphere'
- }
-}
-
-class SimplePlaceTest extends MongoDatastoreSpec {
- void setupSpec() {
- manager.addAllDomainClasses([SimplePlace])
- }
-
- void "test simple save"() {
- when:
- def p = new SimplePlace(name: "Test")
- p.save(flush: true, validate: false)
-
- then:
- p.id != null
- println "ID after save: ${p.id}"
- }
-}
diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DataServiceConnectionRoutingSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DataServiceConnectionRoutingSpec.groovy
index 3fe965e5cf..efca2d2432 100644
--- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DataServiceConnectionRoutingSpec.groovy
+++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DataServiceConnectionRoutingSpec.groovy
@@ -25,6 +25,18 @@ import org.apache.grails.data.testing.tck.domains.DataServiceRoutingProduct
import org.apache.grails.data.testing.tck.domains.DataServiceRoutingProductDataService
import org.apache.grails.data.testing.tck.domains.DataServiceRoutingProductService
+/**
+ * Verifies that {@code @Service}-based Data Service operations route to the correct secondary
+ * datasource via the {@code GormRegistry} selector chain.
+ *
+ * <p>Replaces the service-layer portion of the removed {@code CrossLayerMultiDataSourceSpec}.
+ * That spec obtained a service bean via {@code manager.getServiceForConnection()} — internal
+ * wiring that changed when {@code GormEnhancer}'s static maps were replaced by a single
+ * {@code GormRegistry}. Services are now resolved through the registry's connection-routing
+ * selector ({@code PreferredDatastoreSelector} → {@code QualifiedDatastoreSelector} →
+ * {@code DefaultDatastoreSelector}). The domain-API routing side is covered by
+ * {@link DomainMultiDataSourceSpec}.</p>
+ */
@Requires({ instance.manager?.supportsMultipleDataSources() })
class DataServiceConnectionRoutingSpec extends GrailsDataTckSpec {
diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DataServiceMultiTenantConnectionRoutingSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DataServiceMultiTenantConnectionRoutingSpec.groovy
index 9996629baf..b72c03992f 100644
--- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DataServiceMultiTenantConnectionRoutingSpec.groovy
+++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DataServiceMultiTenantConnectionRoutingSpec.groovy
@@ -27,6 +27,17 @@ import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec
import org.apache.grails.data.testing.tck.domains.DataServiceRoutingMetric
import org.apache.grails.data.testing.tck.domains.DataServiceRoutingMetricService
+/**
+ * Verifies that {@code @Service}-based Data Service operations on a secondary datasource are
+ * correctly scoped to the active tenant via the {@code GormRegistry} selector chain.
+ *
+ * <p>Replaces the service-layer portion of the removed {@code CrossLayerMultiTenantMultiDataSourceSpec}.
+ * That spec obtained a tenant-scoped service via {@code manager.getServiceForMultiTenantConnection()}
+ * — internal wiring that no longer exists after the {@code GormEnhancer} static maps were replaced
+ * by a single {@code GormRegistry}. Services now receive tenant context through the registry's
+ * selector chain combined with GORM's {@code CurrentTenantHolder}. The domain-API side of this
+ * contract is covered by {@link DomainMultiTenantMultiDataSourceSpec}.</p>
+ */
@RestoreSystemProperties
@Requires({ instance.manager?.supportsMultiTenantMultiDataSource() })
class DataServiceMultiTenantConnectionRoutingSpec extends GrailsDataTckSpec {
diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DomainMultiDataSourceSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DomainMultiDataSourceSpec.groovy
index b7be3ba2e3..c2138763c8 100644
--- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DomainMultiDataSourceSpec.groovy
+++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DomainMultiDataSourceSpec.groovy
@@ -23,6 +23,18 @@ import spock.lang.Requires
import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec
import org.apache.grails.data.testing.tck.domains.DataServiceRoutingProduct
+/**
+ * Verifies that domain-API CRUD operations route to the correct secondary datasource.
+ *
+ * <p>Replaces the domain-layer portion of the removed {@code CrossLayerMultiDataSourceSpec}.
+ * That spec tested cross-layer visibility (domain save visible via service and vice versa) using
+ * {@code manager.getServiceForConnection()} — a wiring mechanism that no longer exists after the
+ * {@code GormRegistry} rewrite. The service-routing side of that contract is now covered by
+ * {@link DataServiceConnectionRoutingSpec}; data isolation between connections is verified in
+ * the 'secondary data not visible on default' and 'default data not visible on secondary' features
+ * below. Cross-layer visibility follows implicitly from both layers routing to the same
+ * child datastore.</p>
+ */
@Requires({ instance.manager?.supportsMultipleDataSources() })
class DomainMultiDataSourceSpec extends GrailsDataTckSpec {
diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DomainMultiTenantMultiDataSourceSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DomainMultiTenantMultiDataSourceSpec.groovy
index 39efaf8f86..ae9a638195 100644
--- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DomainMultiTenantMultiDataSourceSpec.groovy
+++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DomainMultiTenantMultiDataSourceSpec.groovy
@@ -26,6 +26,17 @@ import org.grails.datastore.mapping.multitenancy.resolvers.SystemPropertyTenantR
import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec
import org.apache.grails.data.testing.tck.domains.DataServiceRoutingMetric
+/**
+ * Verifies that domain-API operations on a secondary datasource are correctly scoped to the
+ * active tenant.
+ *
+ * <p>Replaces the domain-layer portion of the removed {@code CrossLayerMultiTenantMultiDataSourceSpec}.
+ * That spec tested cross-layer visibility under a tenant context (domain save visible via service
+ * and vice versa) using {@code manager.getServiceForMultiTenantConnection()} — internal wiring
+ * that changed with the {@code GormRegistry} rewrite. The service-routing side is now covered by
+ * {@link DataServiceMultiTenantConnectionRoutingSpec}; tenant isolation across connections is
+ * verified in the 'tenant1 data not visible to tenant2' feature below.</p>
+ */
@RestoreSystemProperties
@Requires({ instance.manager?.supportsMultiTenantMultiDataSource() })
class DomainMultiTenantMultiDataSourceSpec extends GrailsDataTckSpec {