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/08/11 16:10:29 UTC

(grails-core) 01/01: Re-enable grails-datamapping-rx module

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

borinquenkid pushed a commit to branch feat/enable-datamapping-rx
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit 131b7694ad536788b28e888482d9fccdc23f8ea6
Author: Walter Duque de Estrada <wb...@mac.com>
AuthorDate: Tue Aug 11 11:09:09 2026 -0500

    Re-enable grails-datamapping-rx module
    
    The module was disabled in settings.gradle (and gradle/publish-root-config.gradle,
    which independently gated GrailsPublishExtension registration) pending a port to
    the current Grails release. This restores it to the active build:
    
    - Fix RxSchedule.java: an @interface illegally declared a `default` annotation
      member with a method body instead of a constant default value, and referenced
      a removed GroovyTransformOrder constant (RX_SCHEDULE -> RX_SCHEDULER_ORDER).
    - Fix grails.gorm.rx.DetachedCriteria.clone(): illegally narrowed visibility
      from the inherited public AbstractDetachedCriteria.clone().
    - Fix RxEntity.groovy: missing `import rx.Observable`.
    - Fix RxScheduleIOTransformation.groovy: same stale GroovyTransformOrder
      constant reference (RX_SCHEDULE_IO_ORDER -> RX_SCHEDULER_ORDER).
    - Fix FindByFinder/FindAllByFinder (rx): both called a 3-arg buildQuery(...)
      overload that no longer exists after the finders' Groovy->Java conversion;
      inlined the query-building steps (applyAdditionalCriteria/applyDetachedCriteria/
      configureQueryWithArguments/getJunction) that the current 2-arg buildQuery
      performs internally, using the query the finder already creates via
      RxDatastoreClient instead of a Session.
    - Bring the module's Checkstyle and CodeNarc compliance up to date with the
      rest of the codebase (it had never been checked while disabled).
    
    Compiles, and its test suite passes (8/8).
    
    Co-Authored-By: Claude Sonnet 5 <no...@anthropic.com>
---
 gradle/publish-root-config.gradle                  |  2 +-
 .../groovy/grails/gorm/rx/CriteriaBuilder.groovy   | 19 +++--
 .../groovy/grails/gorm/rx/DetachedCriteria.groovy  | 11 ++-
 .../main/groovy/grails/gorm/rx/MultiTenant.groovy  |  2 +-
 .../src/main/groovy/grails/gorm/rx/RxEntity.groovy | 33 ++++-----
 .../grails/gorm/rx/api/RxGormAllOperations.groovy  |  1 +
 .../gorm/rx/api/RxGormInstanceOperations.groovy    |  3 +-
 .../grails/gorm/rx/api/RxGormOperations.groovy     |  4 +-
 .../gorm/rx/api/RxGormStaticOperations.groovy      |  9 +--
 .../gorm/rx/collection/ObservableCollection.java   |  5 +-
 .../gorm/rx/collection/RxPersistentCollection.java |  3 -
 .../grails/gorm/rx/multitenancy/Tenants.groovy     |  8 ++-
 .../groovy/grails/gorm/rx/services/RxSchedule.java | 19 ++---
 .../datastore/rx/AbstractRxDatastoreClient.groovy  | 81 ++++++++++++----------
 .../grails/datastore/rx/RxDatastoreClient.groovy   |  5 +-
 .../datastore/rx/RxDatastoreClientAware.groovy     |  3 +-
 .../datastore/rx/batch/BatchOperation.groovy       |  1 +
 .../datastore/rx/collection/RxCollection.groovy    |  2 +-
 .../rx/collection/RxCollectionUtils.groovy         |  4 +-
 .../rx/collection/RxPersistentList.groovy          | 23 +++---
 .../datastore/rx/collection/RxPersistentSet.groovy | 23 +++---
 .../rx/collection/RxPersistentSortedSet.groovy     | 18 ++---
 .../internal/RxDatastoreClientImplementor.groovy   |  2 +-
 .../AbstractObservableProxyMethodHandler.java      | 26 +++----
 .../proxy/IdQueryObservableProxyMethodHandler.java | 29 ++++----
 .../IdentifierObservableProxyMethodHandler.java    | 22 +++---
 .../grails/datastore/rx/proxy/ProxyFactory.java    |  4 +-
 .../proxy/QueryObservableProxyMethodHandler.java   | 21 +++---
 .../rx/proxy/RxJavassistProxyFactory.java          | 45 ++++++------
 .../grails/datastore/rx/query/QueryState.groovy    |  7 +-
 .../org/grails/datastore/rx/query/RxQuery.groovy   |  1 -
 .../grails/datastore/rx/query/RxQueryUtils.groovy  | 31 ++++-----
 .../org/grails/gorm/rx/api/RxGormEnhancer.groovy   | 38 +++++-----
 .../grails/gorm/rx/api/RxGormInstanceApi.groovy    |  1 -
 .../org/grails/gorm/rx/api/RxGormStaticApi.groovy  | 42 +++++------
 .../grails/gorm/rx/api/RxGormValidationApi.groovy  |  5 +-
 .../TenantDelegatingRxGormOperations.groovy        |  1 +
 .../org/grails/gorm/rx/config/Settings.groovy      |  2 +-
 .../rx/events/AutoTimestampEventListener.groovy    |  6 +-
 .../gorm/rx/events/DomainEventListener.groovy      |  4 +-
 .../gorm/rx/events/MultiTenantEventListener.groovy | 32 ++++-----
 .../gorm/rx/events/ValidationEventListener.groovy  | 10 +--
 .../grails/gorm/rx/finders/CountByFinder.groovy    |  2 +
 .../gorm/rx/finders/FindAllByBooleanFinder.groovy  |  5 +-
 .../grails/gorm/rx/finders/FindAllByFinder.groovy  |  6 +-
 .../gorm/rx/finders/FindByBooleanFinder.groovy     |  5 +-
 .../org/grails/gorm/rx/finders/FindByFinder.groovy |  6 +-
 .../gorm/rx/finders/FindOrCreateByFinder.groovy    | 30 ++++----
 .../gorm/rx/finders/FindOrSaveByFinder.groovy      |  3 +-
 .../implementers/ObservableResultAdapter.groovy    | 27 ++++----
 .../ObservableServiceImplementerAdapter.groovy     |  6 +-
 .../implementers/SingleResultAdapter.groovy        | 20 +++---
 .../rx/services/support/RxServiceSupport.groovy    |  1 -
 .../org/grails/gorm/rx/transform/RxAstUtils.groovy | 25 +++----
 .../rx/transform/RxScheduleIOTransformation.groovy | 34 ++++-----
 settings.gradle                                    |  3 +-
 56 files changed, 386 insertions(+), 395 deletions(-)

diff --git a/gradle/publish-root-config.gradle b/gradle/publish-root-config.gradle
index 78b1c0cf11..f6f363140b 100644
--- a/gradle/publish-root-config.gradle
+++ b/gradle/publish-root-config.gradle
@@ -125,7 +125,7 @@ def publishedProjects = [
         'grails-datamapping-core-test',
         'grails-datastore-async',
         'grails-datastore-core',
-        //'grails-datamapping-rx',
+        'grails-datamapping-rx',
         'grails-datamapping-support',
         'grails-datamapping-tck',
         'grails-datamapping-validation',
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/CriteriaBuilder.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/CriteriaBuilder.groovy
index e3dd782fec..227e434ba6 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/CriteriaBuilder.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/CriteriaBuilder.groovy
@@ -19,7 +19,6 @@
 
 package grails.gorm.rx
 
-import groovy.transform.InheritConstructors
 import org.grails.datastore.gorm.query.criteria.AbstractCriteriaBuilder
 import org.grails.datastore.mapping.model.MappingContext
 import org.grails.datastore.mapping.query.Query
@@ -53,10 +52,10 @@ class CriteriaBuilder<T> extends AbstractCriteriaBuilder {
      * @return An observable
      */
     Observable<T> get(@DelegatesTo(CriteriaBuilder) Closure callable) {
-        ensureQueryIsInitialized();
-        invokeClosureNode(callable);
+        ensureQueryIsInitialized()
+        invokeClosureNode(callable)
 
-        uniqueResult = true;
+        uniqueResult = true
         return ((RxQuery)query).singleResult()
     }
 
@@ -96,7 +95,7 @@ class CriteriaBuilder<T> extends AbstractCriteriaBuilder {
      * @return An observable
      */
     Observable<T> findAll(@DelegatesTo(CriteriaBuilder) Closure additionalCriteria) {
-        findAll (Collections.emptyMap(), additionalCriteria)
+        findAll(Collections.emptyMap(), additionalCriteria)
     }
 
     /**
@@ -129,7 +128,7 @@ class CriteriaBuilder<T> extends AbstractCriteriaBuilder {
      * @param additionalCriteria Any additional criteria
      * @return An observable that emits a list
      */
-    Observable<List<T>> list(@DelegatesTo(CriteriaBuilder) Closure additionalCriteria ) {
+    Observable<List<T>> list(@DelegatesTo(CriteriaBuilder) Closure additionalCriteria) {
         findAll(Collections.emptyMap(), additionalCriteria).toList()
     }
 
@@ -146,7 +145,6 @@ class CriteriaBuilder<T> extends AbstractCriteriaBuilder {
         return ((RxQuery)query).singleResult(args)
     }
 
-
     /**
      * Calculates the total number of matches for the query
      *
@@ -160,7 +158,7 @@ class CriteriaBuilder<T> extends AbstractCriteriaBuilder {
 
     Observable<List<T>> listDistinct(Map args = Collections.emptyMap(), @DelegatesTo(CriteriaBuilder) Closure additionalCriteria = null) {
         prepareQuery(args, additionalCriteria)
-        query.projections().distinct();
+        query.projections().distinct()
 
         ((RxQuery)query).findAll(args).toList()
     }
@@ -169,13 +167,12 @@ class CriteriaBuilder<T> extends AbstractCriteriaBuilder {
         listDistinct(Collections.emptyMap(), callable)
     }
 
-
     protected void prepareQuery(Map args, Closure additionalCriteria) {
         ensureQueryIsInitialized()
-        populateArgumentsForCriteria(targetClass, query, args);
+        populateArgumentsForCriteria(targetClass, query, args)
         invokeClosureNode(additionalCriteria)
         for (Query.Order orderEntry : orderEntries) {
-            query.order(orderEntry);
+            query.order(orderEntry)
         }
     }
 
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/DetachedCriteria.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/DetachedCriteria.groovy
index c1d5ff5c1c..9711b13955 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/DetachedCriteria.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/DetachedCriteria.groovy
@@ -20,11 +20,9 @@
 package grails.gorm.rx
 
 import groovy.transform.CompileStatic
-import groovy.transform.InheritConstructors
 import org.grails.datastore.gorm.finders.DynamicFinder
 import org.grails.datastore.gorm.query.criteria.AbstractDetachedCriteria
 import org.grails.datastore.mapping.query.Query
-import org.grails.datastore.mapping.query.api.Criteria
 import org.grails.datastore.mapping.query.api.ProjectionList
 import org.grails.datastore.mapping.query.api.QueryArgumentsAware
 import org.grails.datastore.mapping.query.api.QueryableCriteria
@@ -44,6 +42,7 @@ import jakarta.persistence.FetchType
  */
 @CompileStatic
 class DetachedCriteria<T> extends AbstractDetachedCriteria<Observable<T>> implements PersistentObservable<T> {
+
     DetachedCriteria(Class<Observable<T>> targetClass, String alias) {
         super(targetClass, alias)
     }
@@ -267,7 +266,7 @@ class DetachedCriteria<T> extends AbstractDetachedCriteria<Observable<T>> implem
     }
 
     @Override
-    protected DetachedCriteria<T> clone() {
+    DetachedCriteria<T> clone() {
         return (DetachedCriteria)super.clone()
     }
 
@@ -644,11 +643,11 @@ class DetachedCriteria<T> extends AbstractDetachedCriteria<Observable<T>> implem
         }
         DynamicFinder.applyDetachedCriteria(query, this)
 
-        for(entry in fetchStrategies) {
-            switch(entry.value) {
+        for (entry in fetchStrategies) {
+            switch (entry.value) {
                 case FetchType.EAGER:
                     query.join(entry.key)
-                break
+                    break
                 default:
                     query.select(entry.key)
             }
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/MultiTenant.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/MultiTenant.groovy
index 77429be4ee..cd9c104754 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/MultiTenant.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/MultiTenant.groovy
@@ -55,7 +55,7 @@ trait MultiTenant<D> extends RxEntity<D> {
      * @return The result of the closure
      */
     @Generated
-    static RxGormAllOperations<D> eachTenant( @DelegatesTo(RxGormAllOperations) Closure callable) {
+    static RxGormAllOperations<D> eachTenant(@DelegatesTo(RxGormAllOperations) Closure callable) {
         RxGormEnhancer.findStaticApi(this, ConnectionSource.DEFAULT).eachTenant callable
     }
 
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/RxEntity.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/RxEntity.groovy
index 96bb1c6713..d6ef20a95e 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/RxEntity.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/RxEntity.groovy
@@ -22,6 +22,7 @@ package grails.gorm.rx
 import groovy.transform.CompileStatic
 import groovy.transform.Generated
 
+import rx.Observable
 import rx.Subscriber
 
 import grails.gorm.rx.api.RxGormAllOperations
@@ -100,7 +101,7 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
 
     @Generated
     private Observable<D> doSave(Map arguments, boolean isInsert) {
-        boolean shouldValidate = arguments?.containsKey("validate") ? arguments.validate : true
+        boolean shouldValidate = arguments?.containsKey('validate') ? arguments.validate : true
         if (shouldValidate) {
             def hasErrors = !validate()
             if (hasErrors) {
@@ -143,7 +144,6 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
         currentRxGormInstanceApi().delete this, arguments
     }
 
-
     /**
      * Checks whether a field is dirty
      *
@@ -182,11 +182,11 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
         final MappingContext mappingContext = entity.mappingContext
         final EntityReflector entityReflector = mappingContext.getEntityReflector(entity)
 
-        if(prop instanceof Association) {
+        if (prop instanceof Association) {
             Association association = (Association)prop
             Class javaClass = association.associatedEntity?.javaClass
             final boolean isBasic = association instanceof Basic
-            if(isBasic) {
+            if (isBasic) {
                 javaClass = ((Basic)association).componentType
             }
 
@@ -228,14 +228,14 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
     Serializable getAssociationId(String associationName) {
         PersistentEntity entity = getGormPersistentEntity()
         def association = entity.getPropertyByName(associationName)
-        if(association instanceof ToOne) {
+        if (association instanceof ToOne) {
             MappingContext mappingContext = currentRxGormStaticApi().datastoreClient.mappingContext
             def proxyHandler = mappingContext.getProxyHandler()
             def entityReflector = mappingContext.getEntityReflector(entity)
             def value = entityReflector.getProperty(this, associationName)
-            if(value != null) {
+            if (value != null) {
 
-                if(proxyHandler.isProxy(value)) {
+                if (proxyHandler.isProxy(value)) {
                     return proxyHandler.getIdentifier(value)
                 }
                 else {
@@ -260,7 +260,7 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
 
         final MappingContext mappingContext = entity.mappingContext
         final EntityReflector reflector = mappingContext.getEntityReflector(entity)
-        if(reflector != null && (prop instanceof Association)) {
+        if (reflector != null && (prop instanceof Association)) {
 
             final Association association = (Association)prop
             final propertyName = association.name
@@ -274,7 +274,7 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
 
             Class javaClass = association.associatedEntity?.javaClass
             final boolean isBasic = association instanceof Basic
-            if(isBasic) {
+            if (isBasic) {
                 javaClass = ((Basic)association).componentType
             }
 
@@ -286,7 +286,7 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
             }
             else {
                 def conversionService = mappingContext.conversionService
-                if(conversionService.canConvert(arg.getClass(), javaClass)) {
+                if (conversionService.canConvert(arg.getClass(), javaClass)) {
                     obj = conversionService.convert(arg, javaClass)
                 }
                 else {
@@ -310,11 +310,11 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
 
                     Collection otherSideValue = (Collection)associationReflector.getProperty(obj, name)
                     if (otherSideValue == null) {
-                        otherSideValue =  (Collection)( [].asType(otherSide.type) )
+                        otherSideValue =  (Collection)([].asType(otherSide.type))
                         associationReflector.setProperty(obj, name, otherSideValue)
                     }
                     otherSideValue.add(targetObject)
-                    if(obj instanceof DirtyCheckable) {
+                    if (obj instanceof DirtyCheckable) {
                         ((DirtyCheckable)obj).markDirty(name)
                     }
                 }
@@ -359,7 +359,6 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
         currentRxGormStaticApi().proxy(id, args)
     }
 
-
     /**
      * Obtain a proxy to the given instance
      *
@@ -386,7 +385,7 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
      */
     @Generated
     static Observable<Number> deleteAll(D...objects) {
-        deleteAll( (Iterable<D>)Arrays.asList(objects) )
+        deleteAll((Iterable<D>) Arrays.asList(objects))
     }
 
     /**
@@ -454,7 +453,7 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
     static Observable<Boolean> exists(Serializable id) {
         get(id).map { D o ->
             o != null
-        }.switchIfEmpty(Observable.create( { Subscriber s ->
+        }.switchIfEmpty(Observable.create({ Subscriber s ->
             s.onNext(false)
         } as Observable.OnSubscribe))
     }
@@ -531,8 +530,6 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
         currentRxGormStaticApi().last params
     }
 
-
-
     /**
      * List all entities and return an observable
      *
@@ -740,7 +737,7 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
      * @return
      */
     @Generated
-    static <T> T withConnection(String connectionName, @DelegatesTo(RxGormAllOperations) Closure<T> callable ) {
+    static <T> T withConnection(String connectionName, @DelegatesTo(RxGormAllOperations) Closure<T> callable) {
         def staticOperations = (RxGormAllOperations<D>) RxGormEnhancer.findStaticApi(this, connectionName)
         callable.setDelegate(staticOperations)
         return callable.call()
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormAllOperations.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormAllOperations.groovy
index 167c522388..6df3184517 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormAllOperations.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormAllOperations.groovy
@@ -26,4 +26,5 @@ package grails.gorm.rx.api
  * @since 6.0
  */
 interface RxGormAllOperations<D> extends RxGormStaticOperations<D>, RxGormInstanceOperations<D> {
+
 }
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormInstanceOperations.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormInstanceOperations.groovy
index 13cba11472..d8a780e6d7 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormInstanceOperations.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormInstanceOperations.groovy
@@ -53,7 +53,6 @@ interface RxGormInstanceOperations<D> {
      */
     Observable<D> save(D instance, Map arguments)
 
-
     /**
      * Saves an entity and returns an {@link Observable}, forcing an insert operation regardless whether an identifier is already present or not
      *
@@ -86,4 +85,4 @@ interface RxGormInstanceOperations<D> {
      * @return An observable that returns a boolean true if successful
      */
     Observable<Boolean> delete(D instance, Map arguments)
-}
\ No newline at end of file
+}
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormOperations.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormOperations.groovy
index 3b4f7473b3..ba2a0fc733 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormOperations.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormOperations.groovy
@@ -20,7 +20,6 @@
 package grails.gorm.rx.api
 
 import rx.Observable
-import rx.Single
 
 /**
  * Interface for Reactive GORM operations on instances
@@ -46,7 +45,6 @@ interface RxGormOperations<D> {
      */
     Observable<D> save(Map<String, Object> arguments)
 
-
     /**
      * Saves an entity and returns an {@link Observable}, forcing an insert operation regardless whether an identifier is already present or not
      *
@@ -76,4 +74,4 @@ interface RxGormOperations<D> {
      * @return An observable that returns a boolean true if successful
      */
     Observable<Boolean> delete(Map<String, Object> arguments)
-}
\ No newline at end of file
+}
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormStaticOperations.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormStaticOperations.groovy
index 1e2281caee..e007a19a79 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormStaticOperations.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormStaticOperations.groovy
@@ -32,6 +32,7 @@ import rx.Observable
  * @since 6.0
  */
 interface RxGormStaticOperations<D> {
+
     /**
      * @return A new instance of this RxEntity
      */
@@ -55,7 +56,6 @@ interface RxGormStaticOperations<D> {
      */
     Observable<D> get(Serializable id, Map queryArgs)
 
-
     /**
      * Retrieve a proxy to an instance by id
      *
@@ -74,7 +74,6 @@ interface RxGormStaticOperations<D> {
      */
     ObservableProxy<D> proxy(Serializable id, Map queryArgs)
 
-
     /**
      * Retrieve a proxy to an instance by id
      *
@@ -228,8 +227,6 @@ interface RxGormStaticOperations<D> {
      */
     Observable<D> last(Map params)
 
-
-
     /**
      * List all entities and return an observable
      *
@@ -380,7 +377,6 @@ interface RxGormStaticOperations<D> {
      */
     Object staticPropertyMissing(String property)
 
-
     /**
      * Execute the closure with the given tenantId
      *
@@ -390,7 +386,6 @@ interface RxGormStaticOperations<D> {
      */
     def <T> T withTenant(Serializable tenantId, @DelegatesTo(RxGormAllOperations) Closure<T> callable)
 
-
     /**
      * Execute the closure for each tenant
      *
@@ -406,4 +401,4 @@ interface RxGormStaticOperations<D> {
      * @return The operations
      */
     RxGormAllOperations<D> withTenant(Serializable tenantId)
-}
\ No newline at end of file
+}
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/collection/ObservableCollection.java b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/collection/ObservableCollection.java
index 4b0344748e..8b34744cfe 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/collection/ObservableCollection.java
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/collection/ObservableCollection.java
@@ -18,11 +18,11 @@
  */
 package grails.gorm.rx.collection;
 
+import java.util.List;
 
-import grails.gorm.rx.PersistentObservable;
 import rx.Observable;
 
-import java.util.List;
+import grails.gorm.rx.PersistentObservable;
 
 /**
  * @author Graeme Rocher
@@ -30,7 +30,6 @@ import java.util.List;
  */
 public interface ObservableCollection<T> extends PersistentObservable<T> {
 
-
     /**
      * Returns an Observable for the operation
      *<p>
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/collection/RxPersistentCollection.java b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/collection/RxPersistentCollection.java
index bab3ac740c..897a400913 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/collection/RxPersistentCollection.java
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/collection/RxPersistentCollection.java
@@ -20,9 +20,6 @@ package grails.gorm.rx.collection;
 
 import org.grails.datastore.mapping.collection.PersistentCollection;
 
-import java.io.Serializable;
-import java.util.List;
-
 /**
  * Represents a reactive collection
  *
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/multitenancy/Tenants.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/multitenancy/Tenants.groovy
index 74bea083c5..be79886b2e 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/multitenancy/Tenants.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/multitenancy/Tenants.groovy
@@ -27,6 +27,7 @@ import org.grails.datastore.mapping.multitenancy.MultiTenancySettings
 import org.grails.datastore.mapping.multitenancy.TenantResolver
 import org.grails.datastore.rx.RxDatastoreClient
 import org.grails.gorm.rx.api.RxGormEnhancer
+
 /**
  * Tenants implementation for RxGORM
  *
@@ -36,6 +37,7 @@ import org.grails.gorm.rx.api.RxGormEnhancer
 @CompileStatic
 @Slf4j
 class Tenants {
+
     /**
      * Execute the given closure for each tenant.
      *
@@ -64,7 +66,7 @@ class Tenants {
     static Serializable currentId() {
         RxDatastoreClient datastoreClient = RxGormEnhancer.findSingleDatastoreClient()
         def tenantId = grails.gorm.multitenancy.Tenants.CurrentTenant.get()
-        if(tenantId != null) {
+        if (tenantId != null) {
             return tenantId
         }
         else {
@@ -78,7 +80,7 @@ class Tenants {
     static Serializable currentId(Class<? extends RxDatastoreClient> datastoreClass) {
         RxDatastoreClient datastore = RxGormEnhancer.findDatastoreClientByType(datastoreClass)
         def tenantId = grails.gorm.multitenancy.Tenants.CurrentTenant.get()
-        if(tenantId != null) {
+        if (tenantId != null) {
             log.debug "Found tenant id [$tenantId] bound to thread local"
             return tenantId
         }
@@ -149,7 +151,7 @@ class Tenants {
                     return callable.call(tenantIdentifier)
                     break
                 default:
-                    throw new IllegalArgumentException("Provided closure accepts too many arguments")
+                    throw new IllegalArgumentException('Provided closure accepts too many arguments')
             }
         }
     }
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/services/RxSchedule.java b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/services/RxSchedule.java
index a92da1b9ea..e7aacb17f4 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/services/RxSchedule.java
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/services/RxSchedule.java
@@ -18,12 +18,17 @@
  */
 package grails.gorm.rx.services;
 
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
 import org.codehaus.groovy.transform.GroovyASTTransformationClass;
-import org.grails.datastore.gorm.transform.GormASTTransformationClass;
-import rx.schedulers.Schedulers;
-import org.apache.grails.common.compiler.GroovyTransformOrder;
 
-import java.lang.annotation.*;
+import org.apache.grails.common.compiler.GroovyTransformOrder;
+import org.grails.datastore.gorm.transform.GormASTTransformationClass;
 
 /**
  * A transformation that transforms the body of a method to return an Observable that runs on the IO Scheduler
@@ -40,7 +45,7 @@ import java.lang.annotation.*;
 public @interface RxSchedule {
 
     /**
-     * @return A closure that returns the scheduler to run on. Default is {@link Schedulers#io()}
+     * @return A closure that returns the scheduler to run on. Default is {@link rx.schedulers.Schedulers#io()}
      */
     Class scheduler() default Object.class;
     /**
@@ -48,7 +53,5 @@ public @interface RxSchedule {
      */
     boolean singleResult() default false;
 
-    default int priority() {
-        return GroovyTransformOrder.RX_SCHEDULE;
-    }
+    int priority() default GroovyTransformOrder.RX_SCHEDULER_ORDER;
 }
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/AbstractRxDatastoreClient.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/AbstractRxDatastoreClient.groovy
index ca085f6db6..51341c9952 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/AbstractRxDatastoreClient.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/AbstractRxDatastoreClient.groovy
@@ -33,7 +33,12 @@ import org.grails.datastore.mapping.core.exceptions.ConfigurationException
 import org.grails.datastore.mapping.dirty.checking.DirtyCheckable
 import org.grails.datastore.mapping.dirty.checking.DirtyCheckableCollection
 import org.grails.datastore.mapping.engine.EntityAccess
-import org.grails.datastore.mapping.engine.event.*
+import org.grails.datastore.mapping.engine.event.PostDeleteEvent
+import org.grails.datastore.mapping.engine.event.PostInsertEvent
+import org.grails.datastore.mapping.engine.event.PostUpdateEvent
+import org.grails.datastore.mapping.engine.event.PreDeleteEvent
+import org.grails.datastore.mapping.engine.event.PreInsertEvent
+import org.grails.datastore.mapping.engine.event.PreUpdateEvent
 import org.grails.datastore.mapping.model.MappingContext
 import org.grails.datastore.mapping.model.PersistentEntity
 import org.grails.datastore.mapping.model.PersistentProperty
@@ -68,6 +73,7 @@ import org.springframework.context.support.StaticMessageSource
 import rx.Observable
 
 import jakarta.persistence.CascadeType
+
 /**
  * Abstract implementation the {@link RxDatastoreClient} interface
  *
@@ -96,7 +102,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
         MultiTenancySettings multiTenancySettings = connectionSourceSettings.multiTenancy
         this.multiTenancyMode = multiTenancySettings.getMode()
         this.tenantResolver = multiTenancySettings.getTenantResolver()
-        if(this.tenantResolver instanceof RxDatastoreClientAware) {
+        if (this.tenantResolver instanceof RxDatastoreClientAware) {
             ((RxDatastoreClientAware)tenantResolver).setRxDatastoreClient(this)
         }
         this.mappingContext.setValidatorRegistry(
@@ -128,7 +134,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
 
     @Override
     RxDatastoreClient getDatastoreClientForTenantId(Serializable tenantId) {
-        if(multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DATABASE) {
+        if (multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DATABASE) {
             return getDatastoreClient(tenantId.toString())
         }
         else {
@@ -149,7 +155,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
         configurableApplicationEventPublisher.addApplicationListener(new AutoTimestampEventListener(this))
         configurableApplicationEventPublisher.addApplicationListener(new DomainEventListener(this))
 
-        if(multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DISCRIMINATOR) {
+        if (multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DISCRIMINATOR) {
             configurableApplicationEventPublisher.addApplicationListener(new MultiTenantEventListener(this))
         }
     }
@@ -199,7 +205,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
     @Override
     final Query createQuery(Class type, QueryState queryState, Map arguments) {
         def entity = mappingContext.getPersistentEntity(type.name)
-        if(entity == null) {
+        if (entity == null) {
             throw new IllegalArgumentException("Type [$type.name] is not a persistent type")
         }
 
@@ -237,23 +243,23 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
     Observable<Number> deleteAll(Iterable instances, Map<String, Object> arguments) {
         def ctx = this.mappingContext
         def proxyHandler = ctx.getProxyHandler()
-        if(instances != null) {
+        if (instances != null) {
             def batchOperation = new BatchOperation(arguments)
             List<ApplicationEvent> postEvents = []
-            for(o in instances) {
+            for (o in instances) {
                 Class type = proxyHandler.getProxiedClass(o)
                 def entity = ctx.getPersistentEntity(type.name)
-                if(entity == null) {
+                if (entity == null) {
                     throw new IllegalArgumentException("Type [$type.name] of instance [$o] is not a persistent type")
                 }
                 def reflector = mappingContext.getEntityReflector(entity)
                 def id = proxyHandler.getIdentifier(o) ?: reflector.getIdentifier(o)
-                if(id != null) {
+                if (id != null) {
 
                     def ea = ctx.createEntityAccess(entity, o)
                     def preDeleteEvent = new PreDeleteEvent(this, entity, ea)
                     eventPublisher?.publishEvent(preDeleteEvent)
-                    if(!preDeleteEvent.isCancelled()) {
+                    if (!preDeleteEvent.isCancelled()) {
                         batchOperation.addDelete(entity, id, o)
                         postEvents.add new PostDeleteEvent(this, entity, ea)
                     }
@@ -261,9 +267,9 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
             }
 
             return batchDelete(batchOperation).map { Number deleteCount ->
-                if(deleteCount > 0) {
-                    if(eventPublisher != null) {
-                        for(event in postEvents) {
+                if (deleteCount > 0) {
+                    if (eventPublisher != null) {
+                        for (event in postEvents) {
                             eventPublisher.publishEvent(event)
                         }
                     }
@@ -285,7 +291,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
     @Override
     final <T1> Observable<T1> persist(T1 instance, Map<String, Object> arguments) {
         persistAll((Iterable<T1>)Collections.singletonList(instance), arguments).map { List<Serializable> identifiers ->
-            if(!identifiers.isEmpty()) {
+            if (!identifiers.isEmpty()) {
                 return instance
             }
             else {
@@ -297,7 +303,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
     @Override
     final <T1> Observable<T1> insert(T1 instance, Map<String, Object> arguments) {
         insertAll((Iterable<T1>)Collections.singletonList(instance), arguments).map { List<Serializable> identifiers ->
-            if(!identifiers.isEmpty()) {
+            if (!identifiers.isEmpty()) {
                 return instance
             }
             else {
@@ -360,14 +366,14 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
                         postEvents.add(new PostUpdateEvent(this, entity, entityAccess))
                     }
                 } else {
-                    if(!hasId) {
+                    if (!hasId) {
                         ValueGenerator valueGenerator = entity.getMapping().getIdentifier().generator
-                        if(valueGenerator == ValueGenerator.NATIVE) {
+                        if (valueGenerator == ValueGenerator.NATIVE) {
                             // if the identifier is generated natively then use the hash code to identity the entity since the
                             // identifiers themselves will be generated from the insert operation
                             id = o.hashCode()
                         }
-                        else if(valueGenerator == ValueGenerator.ASSIGNED) {
+                        else if (valueGenerator == ValueGenerator.ASSIGNED) {
                             throw new IdentityGenerationException("Id generator is set to assigned but not identifier was provided for entity $o")
                         }
                         else {
@@ -405,35 +411,35 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
     }
 
     void processAssociations(PersistentEntity entity, Serializable id, Object instance, EntityReflector entityReflector, BatchOperation operation, List<ApplicationEvent> postEvents) {
-        if(operation.isAlreadyPending(entity, id, instance)) {
+        if (operation.isAlreadyPending(entity, id, instance)) {
             return
         }
-        for(association in entity.associations) {
-            if(association.doesCascade(CascadeType.PERSIST) && !association.isEmbedded() && !association.isBasic()) {
+        for (association in entity.associations) {
+            if (association.doesCascade(CascadeType.PERSIST) && !association.isEmbedded() && !association.isBasic()) {
                 def associatedEntity = association.associatedEntity
 
-                if(association instanceof ToOne) {
-                    DirtyCheckable associatedObject = (DirtyCheckable )entityReflector.getProperty(instance, association.name)
-                    if(associatedObject != null && associatedObject.hasChanged()) {
+                if (association instanceof ToOne) {
+                    DirtyCheckable associatedObject = (DirtyCheckable) entityReflector.getProperty(instance, association.name)
+                    if (associatedObject != null && associatedObject.hasChanged()) {
                         scheduleInsertOrUpdate(associatedEntity, associatedObject, operation, postEvents)
                     }
                 }
-                else if(association instanceof ToMany) {
+                else if (association instanceof ToMany) {
                     Iterable collection = (Iterable)entityReflector.getProperty(instance, association.name)
-                    if(collection != null) {
+                    if (collection != null) {
 
-                        if(collection instanceof PersistentCollection) {
-                            if( !((PersistentCollection)collection).isInitialized() ) {
+                        if (collection instanceof PersistentCollection) {
+                            if (!((PersistentCollection) collection).isInitialized()) {
                                 continue
                             }
                         }
-                        if(collection instanceof DirtyCheckableCollection) {
-                            if( !((DirtyCheckableCollection)collection).hasChanged() ) {
+                        if (collection instanceof DirtyCheckableCollection) {
+                            if (!((DirtyCheckableCollection) collection).hasChanged()) {
                                 continue
                             }
                         }
 
-                        for(obj in collection) {
+                        for (obj in collection) {
                             scheduleInsertOrUpdate(associatedEntity, (DirtyCheckable)obj, operation, postEvents)
                         }
                     }
@@ -457,7 +463,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
     protected void scheduleInsert(PersistentEntity associatedEntity, DirtyCheckable associatedObject, EntityReflector associationReflector, EntityAccess associationAccess, BatchOperation operation, List<ApplicationEvent> postEvents) {
         ValueGenerator valueGenerator = associatedEntity.getMapping().getIdentifier().generator
         def associatedId
-        if(valueGenerator == ValueGenerator.NATIVE) {
+        if (valueGenerator == ValueGenerator.NATIVE) {
             // if the identifier is generated natively then use the hash code to identity the entity since the
             // identifiers themselves will be generated from the insert operation
             associatedId = associatedObject.hashCode()
@@ -494,9 +500,9 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
     }
 
     protected boolean isIndexed(PersistentProperty property) {
-        PropertyMapping<Property> pm = property.getMapping();
-        final Property keyValue = pm.getMappedForm();
-        return keyValue != null && keyValue.isIndex();
+        PropertyMapping<Property> pm = property.getMapping()
+        final Property keyValue = pm.getMappedForm()
+        return keyValue != null && keyValue.isIndex()
     }
 
     @Override
@@ -504,7 +510,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
         try {
             RxGormEnhancer.close()
             def registry = GroovySystem.metaClassRegistry
-            for(entity in mappingContext.persistentEntities) {
+            for (entity in mappingContext.persistentEntities) {
                 registry.removeMetaClass(entity.javaClass)
             }
         } finally {
@@ -575,7 +581,6 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
      */
     abstract Serializable generateIdentifier(PersistentEntity entity, Object instance, EntityReflector reflector)
 
-
     /**
      * Creates a query for the given entity
      *
@@ -599,7 +604,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
     @Override
     RxDatastoreClient getDatastoreClient(String connectionSourceName) {
         def datastoreClient = this.datastoreClients.get(connectionSourceName)
-        if(datastoreClient == null) {
+        if (datastoreClient == null) {
             throw new ConfigurationException("No connection source configured for name [$connectionSourceName]. Check your configuration.")
         }
         return datastoreClient
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/RxDatastoreClient.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/RxDatastoreClient.groovy
index d296a6465a..0761b0068c 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/RxDatastoreClient.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/RxDatastoreClient.groovy
@@ -20,7 +20,6 @@
 package org.grails.datastore.rx
 
 import grails.gorm.rx.proxy.ObservableProxy
-import org.grails.datastore.mapping.core.Datastore
 import org.grails.datastore.mapping.core.connections.ConnectionSource
 import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings
 import org.grails.datastore.mapping.core.connections.ConnectionSources
@@ -54,7 +53,6 @@ interface RxDatastoreClient<T> extends Closeable, QueryCreator, Settings, Connec
      */
     public <T1> Observable<T1> get(Class<T1> type, Serializable id)
 
-
     /**
      * Persist and instance and return the observable
      *
@@ -207,7 +205,6 @@ interface RxDatastoreClient<T> extends Closeable, QueryCreator, Settings, Connec
      */
     RxDatastoreClient getDatastoreClient(String connectionSourceName)
 
-
     /**
      * @return The multi tenancy mode
      */
@@ -227,4 +224,4 @@ interface RxDatastoreClient<T> extends Closeable, QueryCreator, Settings, Connec
      * @return The datastore
      */
     RxDatastoreClient getDatastoreClientForTenantId(Serializable tenantId);
-}
\ No newline at end of file
+}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/RxDatastoreClientAware.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/RxDatastoreClientAware.groovy
index 78d4bdacf2..674e79265d 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/RxDatastoreClientAware.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/RxDatastoreClientAware.groovy
@@ -26,10 +26,11 @@ package org.grails.datastore.rx
  * @since 6.0
  */
 interface RxDatastoreClientAware {
+
     /**
      * Sets the datastore client
      *
      * @param datastoreClient The datastore client
      */
     void setRxDatastoreClient(RxDatastoreClient datastoreClient)
-}
\ No newline at end of file
+}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/batch/BatchOperation.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/batch/BatchOperation.groovy
index 333de2f12e..08963bc371 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/batch/BatchOperation.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/batch/BatchOperation.groovy
@@ -31,6 +31,7 @@ import org.grails.datastore.mapping.model.PersistentEntity
 
 @CompileStatic
 class BatchOperation {
+
     final Map<PersistentEntity, Map<Serializable, EntityOperation>> deletes = [:].withDefault { [:] }
     final Map<PersistentEntity, Map<Serializable, EntityOperation>> updates = [:].withDefault { [:] }
     final Map<PersistentEntity, Map<Serializable, EntityOperation>> inserts = [:].withDefault { [:] }
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxCollection.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxCollection.groovy
index 08dc2bef28..ead93f71cc 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxCollection.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxCollection.groovy
@@ -34,7 +34,7 @@ import grails.gorm.rx.collection.ObservableCollection
  * @since 6.0
  */
 @CompileStatic
-trait RxCollection<T> implements ObservableCollection<T>{
+trait RxCollection<T> implements ObservableCollection<T> {
 
     /**
      * The underlying observable
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxCollectionUtils.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxCollectionUtils.groovy
index c7b7664444..c554fdb178 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxCollectionUtils.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxCollectionUtils.groovy
@@ -42,7 +42,7 @@ class RxCollectionUtils {
      * @return
      */
     static Collection createConcreteCollection(Association association, Serializable foreignKey, QueryState queryState) {
-        switch(association.type) {
+        switch (association.type) {
             case SortedSet:
                 return new RxPersistentSortedSet(RxGormEnhancer.findInstanceApi(association.associatedEntity.javaClass).datastoreClient, association, foreignKey, queryState)
             case List:
@@ -61,7 +61,7 @@ class RxCollectionUtils {
      * @return
      */
     static Collection createConcreteCollection(Association association, Query initializerQuery, QueryState queryState) {
-        switch(association.type) {
+        switch (association.type) {
             case SortedSet:
                 return new RxPersistentSortedSet(RxGormEnhancer.findInstanceApi(association.associatedEntity.javaClass).datastoreClient, association, initializerQuery, queryState)
             case List:
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentList.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentList.groovy
index e305204eca..c7f15ec187 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentList.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentList.groovy
@@ -23,7 +23,6 @@ import grails.gorm.rx.collection.RxUnidirectionalCollection
 import groovy.transform.CompileStatic
 import groovy.util.logging.Slf4j
 import org.grails.datastore.mapping.collection.PersistentList
-import org.grails.datastore.mapping.collection.PersistentSet
 import org.grails.datastore.mapping.model.types.Association
 import org.grails.datastore.mapping.query.Query
 import org.grails.datastore.rx.RxDatastoreClient
@@ -32,8 +31,6 @@ import org.grails.datastore.rx.internal.RxDatastoreClientImplementor
 import org.grails.datastore.rx.query.QueryState
 import org.grails.datastore.rx.query.RxQuery
 import rx.Observable
-import rx.Subscriber
-import rx.Subscription
 
 /**
  * Represents a reactive list that can be observed in order to allow non-blocking lazy loading of associations
@@ -43,13 +40,14 @@ import rx.Subscription
  */
 //@CompileStatic
 @Slf4j
-class RxPersistentList<T> extends PersistentList implements RxPersistentCollection<T>, RxUnidirectionalCollection , RxCollection<T>{
+class RxPersistentList<T> extends PersistentList implements RxPersistentCollection<T>, RxUnidirectionalCollection , RxCollection<T> {
+
     final RxDatastoreClient datastoreClient
     final Association association
 
     protected final QueryState queryState
 
-    RxPersistentList( RxDatastoreClient datastoreClient, Association association, Serializable associationKey, QueryState queryState = null) {
+    RxPersistentList(RxDatastoreClient datastoreClient, Association association, Serializable associationKey, QueryState queryState = null) {
         super(association, associationKey, null)
         this.datastoreClient = datastoreClient
         this.association = association
@@ -57,7 +55,7 @@ class RxPersistentList<T> extends PersistentList implements RxPersistentCollecti
         this.observable = resolveObservable()
     }
 
-    RxPersistentList( RxDatastoreClient datastoreClient, Association association, List<Serializable> entitiesKeys, QueryState queryState = null) {
+    RxPersistentList(RxDatastoreClient datastoreClient, Association association, List<Serializable> entitiesKeys, QueryState queryState = null) {
         super(entitiesKeys, association.associatedEntity.javaClass, null)
         this.datastoreClient = datastoreClient
         this.association = association
@@ -65,7 +63,7 @@ class RxPersistentList<T> extends PersistentList implements RxPersistentCollecti
         this.observable = resolveObservable()
     }
 
-    RxPersistentList( RxDatastoreClient datastoreClient, Association association, Query initializerQuery, QueryState queryState = null) {
+    RxPersistentList(RxDatastoreClient datastoreClient, Association association, Query initializerQuery, QueryState queryState = null) {
         super(association, null, null)
         this.datastoreClient = datastoreClient
         this.association = association
@@ -75,13 +73,13 @@ class RxPersistentList<T> extends PersistentList implements RxPersistentCollecti
 
     @Override
     void initialize() {
-        if(initializing != null) return
+        if (initializing != null) return
         initializing = true
 
         try {
             def observable = toListObservable()
 
-            if(((RxDatastoreClientImplementor)datastoreClient).isAllowBlockingOperations()) {
+            if (((RxDatastoreClientImplementor)datastoreClient).isAllowBlockingOperations()) {
                 log.warn("Association $association initialised using blocking operation. Consider using subscribe(..) or an eager query instead")
 
                 addAll observable.toBlocking().first()
@@ -97,8 +95,8 @@ class RxPersistentList<T> extends PersistentList implements RxPersistentCollecti
 
     protected Observable resolveObservable() {
         def query = ((RxDatastoreClientImplementor)datastoreClient).createQuery(childType, queryState)
-        if(associationKey != null) {
-            query.eq( association.inverseSide.name, associationKey )
+        if (associationKey != null) {
+            query.eq(association.inverseSide.name, associationKey)
         }
         else {
             query.in(association.associatedEntity.identity.name, keys.toList())
@@ -110,10 +108,9 @@ class RxPersistentList<T> extends PersistentList implements RxPersistentCollecti
         ((RxQuery) query).findAll()
     }
 
-
     @Override
     List<Serializable> getAssociationKeys() {
-        if(keys != null) {
+        if (keys != null) {
             return keys.toList()
         }
         else {
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentSet.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentSet.groovy
index 7dc6347f4b..5407759f97 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentSet.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentSet.groovy
@@ -31,8 +31,6 @@ import org.grails.datastore.rx.internal.RxDatastoreClientImplementor
 import org.grails.datastore.rx.query.QueryState
 import org.grails.datastore.rx.query.RxQuery
 import rx.Observable
-import rx.Subscriber
-import rx.Subscription
 
 /**
  * Represents a reactive set that can be observed in order to allow non-blocking lazy loading of associations
@@ -43,12 +41,13 @@ import rx.Subscription
 @CompileStatic
 @Slf4j
 class RxPersistentSet<T> extends PersistentSet implements RxPersistentCollection<T>, RxUnidirectionalCollection, RxCollection<T> {
+
     final RxDatastoreClient datastoreClient
     final Association association
 
     protected final QueryState queryState
 
-    RxPersistentSet( RxDatastoreClient datastoreClient, Association association, Serializable associationKey, QueryState queryState = new QueryState()) {
+    RxPersistentSet(RxDatastoreClient datastoreClient, Association association, Serializable associationKey, QueryState queryState = new QueryState()) {
         super(association, associationKey, null)
         this.datastoreClient = datastoreClient
         this.association = association
@@ -56,7 +55,7 @@ class RxPersistentSet<T> extends PersistentSet implements RxPersistentCollection
         this.observable = resolveObservable()
     }
 
-    RxPersistentSet( RxDatastoreClient datastoreClient, Association association, Serializable associationKey, Set target, QueryState queryState = new QueryState()) {
+    RxPersistentSet(RxDatastoreClient datastoreClient, Association association, Serializable associationKey, Set target, QueryState queryState = new QueryState()) {
         super(association, associationKey, null, target)
         this.datastoreClient = datastoreClient
         this.association = association
@@ -64,7 +63,7 @@ class RxPersistentSet<T> extends PersistentSet implements RxPersistentCollection
         this.observable = resolveObservable()
     }
 
-    RxPersistentSet( RxDatastoreClient datastoreClient, Association association, List<Serializable> entitiesKeys, QueryState queryState = null) {
+    RxPersistentSet(RxDatastoreClient datastoreClient, Association association, List<Serializable> entitiesKeys, QueryState queryState = null) {
         super(entitiesKeys, association.associatedEntity.javaClass, null)
         this.datastoreClient = datastoreClient
         this.association = association
@@ -72,7 +71,7 @@ class RxPersistentSet<T> extends PersistentSet implements RxPersistentCollection
         this.observable = resolveObservable()
     }
 
-    RxPersistentSet( RxDatastoreClient datastoreClient, Association association, Query initializerQuery, QueryState queryState = null) {
+    RxPersistentSet(RxDatastoreClient datastoreClient, Association association, Query initializerQuery, QueryState queryState = null) {
         super(association, null, null)
         this.datastoreClient = datastoreClient
         this.association = association
@@ -80,11 +79,10 @@ class RxPersistentSet<T> extends PersistentSet implements RxPersistentCollection
         this.observable = resolveObservable(initializerQuery)
     }
 
-
     protected Observable resolveObservable() {
         def query = ((RxDatastoreClientImplementor)datastoreClient).createQuery(childType, queryState)
-        if(associationKey != null) {
-            query.eq( association.inverseSide.name, associationKey )
+        if (associationKey != null) {
+            query.eq(association.inverseSide.name, associationKey)
         }
         else {
             query.in(association.associatedEntity.identity.name, keys.toList())
@@ -98,13 +96,13 @@ class RxPersistentSet<T> extends PersistentSet implements RxPersistentCollection
 
     @Override
     void initialize() {
-        if(initializing != null) return
+        if (initializing != null) return
         initializing = Boolean.TRUE
 
         try {
             def observable = toListObservable()
 
-            if(((RxDatastoreClientImplementor)datastoreClient).isAllowBlockingOperations()) {
+            if (((RxDatastoreClientImplementor)datastoreClient).isAllowBlockingOperations()) {
                 log.warn("Association $association initialised using blocking operation. Consider using subscribe(..) or an eager query instead")
 
                 addAll observable.toBlocking().first()
@@ -118,10 +116,9 @@ class RxPersistentSet<T> extends PersistentSet implements RxPersistentCollection
         }
     }
 
-
     @Override
     List<Serializable> getAssociationKeys() {
-        if(keys != null) {
+        if (keys != null) {
             return keys.toList() as List<Serializable>
         }
         else {
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentSortedSet.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentSortedSet.groovy
index 25ee14c2e5..6b41520308 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentSortedSet.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentSortedSet.groovy
@@ -44,12 +44,13 @@ import rx.Subscription
 @CompileStatic
 @Slf4j
 class RxPersistentSortedSet<T> extends PersistentSortedSet implements RxPersistentCollection<T>, RxUnidirectionalCollection, RxCollection<T> {
+
     final RxDatastoreClient datastoreClient
     final Association association
 
     protected final QueryState queryState
 
-    RxPersistentSortedSet( RxDatastoreClient datastoreClient, Association association, Serializable associationKey, QueryState queryState = null) {
+    RxPersistentSortedSet(RxDatastoreClient datastoreClient, Association association, Serializable associationKey, QueryState queryState = null) {
         super(association, associationKey, null)
         this.datastoreClient = datastoreClient
         this.association = association
@@ -57,7 +58,7 @@ class RxPersistentSortedSet<T> extends PersistentSortedSet implements RxPersiste
         this.observable = resolveObservable()
     }
 
-    RxPersistentSortedSet( RxDatastoreClient datastoreClient, Association association, List<Serializable> entitiesKeys, QueryState queryState = null) {
+    RxPersistentSortedSet(RxDatastoreClient datastoreClient, Association association, List<Serializable> entitiesKeys, QueryState queryState = null) {
         super(entitiesKeys, association.associatedEntity.javaClass, null)
         this.datastoreClient = datastoreClient
         this.association = association
@@ -65,7 +66,7 @@ class RxPersistentSortedSet<T> extends PersistentSortedSet implements RxPersiste
         this.observable = resolveObservable()
     }
 
-    RxPersistentSortedSet( RxDatastoreClient datastoreClient, Association association, Query initializerQuery, QueryState queryState = null) {
+    RxPersistentSortedSet(RxDatastoreClient datastoreClient, Association association, Query initializerQuery, QueryState queryState = null) {
         super(association, null, null)
         this.datastoreClient = datastoreClient
         this.association = association
@@ -75,8 +76,8 @@ class RxPersistentSortedSet<T> extends PersistentSortedSet implements RxPersiste
 
     protected Observable resolveObservable() {
         def query = ((RxDatastoreClientImplementor)datastoreClient).createQuery(childType, queryState)
-        if(associationKey != null) {
-            query.eq( association.inverseSide.name, associationKey )
+        if (associationKey != null) {
+            query.eq(association.inverseSide.name, associationKey)
         }
         else {
             query.in(association.associatedEntity.identity.name, keys.toList())
@@ -90,14 +91,13 @@ class RxPersistentSortedSet<T> extends PersistentSortedSet implements RxPersiste
 
     @Override
     void initialize() {
-        if(initializing != null) return
+        if (initializing != null) return
         initializing = true
 
-
         try {
             def observable = toListObservable()
 
-            if(((RxDatastoreClientImplementor)datastoreClient).isAllowBlockingOperations()) {
+            if (((RxDatastoreClientImplementor)datastoreClient).isAllowBlockingOperations()) {
                 log.warn("Association $association initialised using blocking operation. Consider using subscribe(..) or an eager query instead")
 
                 addAll observable.toBlocking().first()
@@ -148,7 +148,7 @@ class RxPersistentSortedSet<T> extends PersistentSortedSet implements RxPersiste
 
     @Override
     List<Serializable> getAssociationKeys() {
-        if(keys != null) {
+        if (keys != null) {
             return keys.toList() as List<Serializable>
         }
         else {
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/internal/RxDatastoreClientImplementor.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/internal/RxDatastoreClientImplementor.groovy
index 5a2274b0a9..334aab2b7f 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/internal/RxDatastoreClientImplementor.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/internal/RxDatastoreClientImplementor.groovy
@@ -133,4 +133,4 @@ interface RxDatastoreClientImplementor<T> extends RxDatastoreClient<T> {
      */
     RxGormValidationApi createValidationApi(PersistentEntity entity, String connectionSourceName)
 
-}
\ No newline at end of file
+}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/AbstractObservableProxyMethodHandler.java b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/AbstractObservableProxyMethodHandler.java
index 2d8445b016..9b6f5c1679 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/AbstractObservableProxyMethodHandler.java
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/AbstractObservableProxyMethodHandler.java
@@ -18,15 +18,17 @@
  */
 package org.grails.datastore.rx.proxy;
 
-import org.grails.datastore.mapping.proxy.EntityProxyMethodHandler;
-import org.grails.datastore.rx.RxDatastoreClient;
-import org.grails.datastore.rx.query.QueryState;
-import org.springframework.util.ReflectionUtils;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
 import rx.Observable;
 import rx.Subscriber;
 
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
+import org.springframework.util.ReflectionUtils;
+
+import org.grails.datastore.mapping.proxy.EntityProxyMethodHandler;
+import org.grails.datastore.rx.RxDatastoreClient;
+import org.grails.datastore.rx.query.QueryState;
 
 /**
  * Abstract proxy generator for ObservableProxy instances
@@ -56,11 +58,11 @@ public abstract class AbstractObservableProxyMethodHandler extends EntityProxyMe
 
     @Override
     protected Object invokeEntityProxyMethods(Object self, String methodName, Object[] args) {
-        if(methodName.equals("subscribe")) {
+        if (methodName.equals("subscribe")) {
             Observable observable = resolveObservable();
             return observable.subscribe((Subscriber) args[0]);
         }
-        else if(methodName.equals("toObservable")) {
+        else if (methodName.equals("toObservable")) {
             return resolveObservable();
         }
         else {
@@ -70,16 +72,16 @@ public abstract class AbstractObservableProxyMethodHandler extends EntityProxyMe
 
     protected Object handleInvocationFallback(Object self, Method thisMethod, Object[] args) {
         Object actualTarget = getProxyTarget(self);
-        if(!thisMethod.getDeclaringClass().isInstance(actualTarget)) {
-            if(Modifier.isPublic(thisMethod.getModifiers())) {
+        if (!thisMethod.getDeclaringClass().isInstance(actualTarget)) {
+            if (Modifier.isPublic(thisMethod.getModifiers())) {
                 final Method method = ReflectionUtils.findMethod(actualTarget.getClass(), thisMethod.getName(), thisMethod.getParameterTypes());
-                if(method != null) {
+                if (method != null) {
                     ReflectionUtils.makeAccessible(method);
                     thisMethod = method;
                 }
             } else {
                 final Method method = ReflectionUtils.findMethod(actualTarget.getClass(), thisMethod.getName(), thisMethod.getParameterTypes());
-                if(method != null) {
+                if (method != null) {
                     thisMethod = method;
                 }
             }
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/IdQueryObservableProxyMethodHandler.java b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/IdQueryObservableProxyMethodHandler.java
index d1343e265d..030ef1f82c 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/IdQueryObservableProxyMethodHandler.java
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/IdQueryObservableProxyMethodHandler.java
@@ -18,18 +18,19 @@
  */
 package org.grails.datastore.rx.proxy;
 
+import java.io.Serializable;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import rx.Observable;
+import rx.functions.Func1;
+
 import org.grails.datastore.mapping.query.Query;
 import org.grails.datastore.rx.RxDatastoreClient;
 import org.grails.datastore.rx.exceptions.BlockingOperationException;
 import org.grails.datastore.rx.internal.RxDatastoreClientImplementor;
 import org.grails.datastore.rx.query.QueryState;
 import org.grails.datastore.rx.query.RxQuery;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import rx.Observable;
-import rx.functions.Func1;
-
-import java.io.Serializable;
 
 /**
  * A proxy {@link javassist.util.proxy.MethodHandler} that uses a query to resolve the id of the the target
@@ -58,18 +59,18 @@ public class IdQueryObservableProxyMethodHandler extends AbstractObservableProxy
         queryResult = queryResult.switchMap(new Func1<Object, Observable>() {
             @Override
             public Observable call(Object id) {
-                if(type.isInstance(id)) {
+                if (type.isInstance(id)) {
                     return Observable.just(id);
                 }
-                else if(id != null) {
+                else if (id != null) {
                     Serializable key = (Serializable) id;
                     proxyKey = key;
                     Object loadedEntity = queryState.getLoadedEntity(type, key);
-                    if(loadedEntity != null) {
+                    if (loadedEntity != null) {
                         return Observable.just(loadedEntity);
                     }
                     else {
-                        return ((RxDatastoreClientImplementor)client).get(type, key, queryState);
+                        return ((RxDatastoreClientImplementor) client).get(type, key, queryState);
                     }
                 }
                 else {
@@ -88,17 +89,17 @@ public class IdQueryObservableProxyMethodHandler extends AbstractObservableProxy
 
     @Override
     protected Object resolveDelegate(Object self) {
-        if(target != null) {
+        if (target != null) {
             return target;
         }
-        if(((RxDatastoreClientImplementor)client).isAllowBlockingOperations()) {
-            if(LOG.isWarnEnabled()) {
+        if (((RxDatastoreClientImplementor) client).isAllowBlockingOperations()) {
+            if (LOG.isWarnEnabled()) {
                 LOG.warn("Entity of type [{}] with id [{}] lazy loaded using a blocking operation. Consider using ObservableProxy.subscribe(..) instead", type.getName(), proxyKey);
             }
             this.target = observable.toBlocking().first();
         }
         else {
-            throw new BlockingOperationException("Cannot initialize proxy for class ["+type+"] using a blocking operation. Use ObservableProxy.subscribe(..) instead.");
+            throw new BlockingOperationException("Cannot initialize proxy for class [" + type + "] using a blocking operation. Use ObservableProxy.subscribe(..) instead.");
         }
         return this.target;
     }
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/IdentifierObservableProxyMethodHandler.java b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/IdentifierObservableProxyMethodHandler.java
index 0636d55b68..63ca5e9af1 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/IdentifierObservableProxyMethodHandler.java
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/IdentifierObservableProxyMethodHandler.java
@@ -18,17 +18,17 @@
  */
 package org.grails.datastore.rx.proxy;
 
-import org.grails.datastore.rx.RxDatastoreClient;
-import org.grails.datastore.rx.exceptions.BlockingOperationException;
-import org.grails.datastore.rx.internal.RxDatastoreClientImplementor;
-import org.grails.datastore.rx.query.QueryState;
+import java.io.Serializable;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import rx.Observable;
-import rx.functions.Action1;
 import rx.functions.Func1;
 
-import java.io.Serializable;
+import org.grails.datastore.rx.RxDatastoreClient;
+import org.grails.datastore.rx.exceptions.BlockingOperationException;
+import org.grails.datastore.rx.internal.RxDatastoreClientImplementor;
+import org.grails.datastore.rx.query.QueryState;
 
 /**
  * A proxy {@link javassist.util.proxy.MethodHandler} that uses the entity class and identifier to resolve the target
@@ -62,23 +62,23 @@ class IdentifierObservableProxyMethodHandler extends AbstractObservableProxyMeth
 
     @Override
     protected Object resolveDelegate(Object self) {
-        if(target != null) {
+        if (target != null) {
             return target;
         }
 
         Object loadedEntity = queryState != null ? queryState.getLoadedEntity(type, proxyKey) : null;
-        if(loadedEntity != null) {
+        if (loadedEntity != null) {
             this.target = loadedEntity;
         }
         else {
-            if(((RxDatastoreClientImplementor)client).isAllowBlockingOperations()) {
-                if(LOG.isWarnEnabled()) {
+            if (((RxDatastoreClientImplementor) client).isAllowBlockingOperations()) {
+                if (LOG.isWarnEnabled()) {
                     LOG.warn("Entity of type [{}] with id [{}] lazy loaded using a blocking operation. Consider using ObservableProxy.subscribe(..) instead", type.getName(), proxyKey);
                 }
                 this.target = observable.toBlocking().first();
             }
             else {
-                throw new BlockingOperationException("Cannot initialize proxy for class ["+type+"] using a blocking operation. Use ObservableProxy.subscribe(..) instead.");
+                throw new BlockingOperationException("Cannot initialize proxy for class [" + type + "] using a blocking operation. Use ObservableProxy.subscribe(..) instead.");
             }
         }
         return this.target;
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/ProxyFactory.java b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/ProxyFactory.java
index dd541afdcb..be1da95062 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/ProxyFactory.java
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/ProxyFactory.java
@@ -18,14 +18,14 @@
  */
 package org.grails.datastore.rx.proxy;
 
+import java.io.Serializable;
+
 import grails.gorm.rx.proxy.ObservableProxy;
 import org.grails.datastore.mapping.proxy.ProxyHandler;
 import org.grails.datastore.mapping.query.Query;
 import org.grails.datastore.rx.RxDatastoreClient;
 import org.grails.datastore.rx.query.QueryState;
 
-import java.io.Serializable;
-
 /**
  * @author Graeme Rocher
  * @since 6.0
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/QueryObservableProxyMethodHandler.java b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/QueryObservableProxyMethodHandler.java
index 12be245f66..88627bad61 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/QueryObservableProxyMethodHandler.java
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/QueryObservableProxyMethodHandler.java
@@ -18,18 +18,19 @@
  */
 package org.grails.datastore.rx.proxy;
 
+import java.io.Serializable;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import rx.Observable;
+import rx.functions.Func1;
+
 import org.grails.datastore.mapping.query.Query;
 import org.grails.datastore.rx.RxDatastoreClient;
 import org.grails.datastore.rx.exceptions.BlockingOperationException;
 import org.grails.datastore.rx.internal.RxDatastoreClientImplementor;
 import org.grails.datastore.rx.query.QueryState;
 import org.grails.datastore.rx.query.RxQuery;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import rx.Observable;
-import rx.functions.Func1;
-
-import java.io.Serializable;
 
 /**
  * A proxy {@link javassist.util.proxy.MethodHandler} that uses a query to resolve the target using a query
@@ -66,18 +67,18 @@ public class QueryObservableProxyMethodHandler extends AbstractObservableProxyMe
 
     @Override
     protected Object resolveDelegate(Object self) {
-        if(target != null) {
+        if (target != null) {
             return target;
         }
 
-        if(((RxDatastoreClientImplementor)client).isAllowBlockingOperations()) {
-            if(LOG.isWarnEnabled()) {
+        if (((RxDatastoreClientImplementor) client).isAllowBlockingOperations()) {
+            if (LOG.isWarnEnabled()) {
                 LOG.warn("Entity of type [{}] lazy loaded using a blocking operation. Consider using ObservableProxy.subscribe(..) instead", type.getName());
             }
             this.target = observable.toBlocking().first();
         }
         else {
-            throw new BlockingOperationException("Cannot initialize proxy for class ["+type+"] using a blocking operation. Use ObservableProxy.subscribe(..) instead.");
+            throw new BlockingOperationException("Cannot initialize proxy for class [" + type + "] using a blocking operation. Use ObservableProxy.subscribe(..) instead.");
         }
         return this.target;
     }
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/RxJavassistProxyFactory.java b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/RxJavassistProxyFactory.java
index 1ab5a2309d..d81c4bf6f2 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/RxJavassistProxyFactory.java
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/RxJavassistProxyFactory.java
@@ -18,11 +18,21 @@
  */
 package org.grails.datastore.rx.proxy;
 
-import grails.gorm.rx.proxy.ObservableProxy;
+import java.io.Serializable;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
 import groovy.lang.GroovyObject;
+
 import javassist.util.proxy.MethodFilter;
 import javassist.util.proxy.MethodHandler;
 import javassist.util.proxy.ProxyObject;
+
+import grails.gorm.rx.proxy.ObservableProxy;
 import org.grails.datastore.mapping.core.Session;
 import org.grails.datastore.mapping.engine.AssociationQueryExecutor;
 import org.grails.datastore.mapping.query.Query;
@@ -30,14 +40,6 @@ import org.grails.datastore.mapping.reflect.ReflectionUtils;
 import org.grails.datastore.rx.RxDatastoreClient;
 import org.grails.datastore.rx.query.QueryState;
 
-import java.io.Serializable;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
 /**
  * Creates observable proxy instances using Javassist
  *
@@ -45,7 +47,7 @@ import java.util.concurrent.ConcurrentHashMap;
  * @since 6.0
  */
 public class RxJavassistProxyFactory implements ProxyFactory, org.grails.datastore.mapping.proxy.ProxyFactory {
-    private static final Map<Class, Class > PROXY_FACTORIES = new ConcurrentHashMap<Class, Class >();
+    private static final Map<Class, Class> PROXY_FACTORIES = new ConcurrentHashMap<Class, Class>();
     private static final Set<String> EXCLUDES = new HashSet(Arrays.asList("$getStaticMetaClass"));
     private static final Class[] EMPTY_CLASS_ARRAY = {};
 
@@ -54,8 +56,8 @@ public class RxJavassistProxyFactory implements ProxyFactory, org.grails.datasto
         Class proxyClass = getProxyClass(type);
         MethodHandler mi = createMethodHandler(client, type, proxyClass, key, queryState);
         Object proxy = ReflectionUtils.instantiate(proxyClass);
-        ((ProxyObject)proxy).setHandler(mi);
-        return (T)proxy;
+        ((ProxyObject) proxy).setHandler(mi);
+        return (T) proxy;
     }
 
     @Override
@@ -63,7 +65,7 @@ public class RxJavassistProxyFactory implements ProxyFactory, org.grails.datasto
         Class proxyClass = getProxyClass(query.getEntity().getJavaClass());
         MethodHandler mi = createMethodHandler(proxyClass, client, query, queryState);
         Object proxy = ReflectionUtils.instantiate(proxyClass);
-        ((ProxyObject)proxy).setHandler(mi);
+        ((ProxyObject) proxy).setHandler(mi);
         return (ObservableProxy) proxy;
     }
 
@@ -82,30 +84,30 @@ public class RxJavassistProxyFactory implements ProxyFactory, org.grails.datasto
 
     @Override
     public boolean isInitialized(Object object) {
-        return !isProxy(object) || ((ObservableProxy)object).isInitialized();
+        return !isProxy(object) || ((ObservableProxy) object).isInitialized();
     }
 
     @Override
     public boolean isInitialized(Object object, String associationName) {
-        return !isProxy(object) || ((ObservableProxy)object).isInitialized();
+        return !isProxy(object) || ((ObservableProxy) object).isInitialized();
     }
 
     @Override
     public Object unwrap(Object object) {
-        return isProxy(object) ? ((ObservableProxy)object).getTarget() : object;
+        return isProxy(object) ? ((ObservableProxy) object).getTarget() : object;
     }
 
     @Override
     public Serializable getIdentifier(Object o) {
-        if(isProxy(o)) {
-            return ((ObservableProxy)o).getProxyKey();
+        if (isProxy(o)) {
+            return ((ObservableProxy) o).getProxyKey();
         }
         return null;
     }
 
     @Override
     public Class<?> getProxiedClass(Object o) {
-        if(isProxy(o)) {
+        if (isProxy(o)) {
             return o.getClass().getSuperclass();
         }
         return o.getClass();
@@ -114,12 +116,11 @@ public class RxJavassistProxyFactory implements ProxyFactory, org.grails.datasto
 
     @Override
     public void initialize(Object o) {
-        if(isProxy(o)) {
-            ((ObservableProxy)o).initialize();
+        if (isProxy(o)) {
+            ((ObservableProxy) o).initialize();
         }
     }
 
-
     protected <T> Class<T> getProxyClass(Class<T> type) {
 
         Class proxyClass = PROXY_FACTORIES.get(type);
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/QueryState.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/QueryState.groovy
index c90cc31fef..9064e73995 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/QueryState.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/QueryState.groovy
@@ -35,12 +35,9 @@ class QueryState {
 
     private final Map<Class, Map<Serializable, Object>> loadedEntities = new ConcurrentHashMap<>()
 
-    QueryState() {
-    }
-
     void addLoadedEntity(Class type, Serializable id, Object object) {
         def loadedByType = loadedEntities.get(type)
-        if(loadedByType == null) {
+        if (loadedByType == null) {
             loadedByType = new ConcurrentHashMap<Serializable, Object>()
             loadedByType.put(id, object)
             loadedEntities.put(type, loadedByType)
@@ -52,7 +49,7 @@ class QueryState {
 
     public <T> T getLoadedEntity(Class<T> type, Serializable id) {
         def loadedByType = loadedEntities.get(type)
-        if(loadedByType == null) {
+        if (loadedByType == null) {
             return null
         }
         else {
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/RxQuery.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/RxQuery.groovy
index 81a08bb8e8..1b85ac7c59 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/RxQuery.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/RxQuery.groovy
@@ -31,7 +31,6 @@ import rx.Observable
 @CompileStatic
 interface RxQuery<T> {
 
-
     /**
      * @return All results matching this query as an observable
      */
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/RxQueryUtils.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/RxQueryUtils.groovy
index 54b085188a..871556998d 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/RxQueryUtils.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/RxQueryUtils.groovy
@@ -57,26 +57,26 @@ class RxQueryUtils {
      * @return The new observable
      */
     static Observable processFetchStrategies(RxDatastoreClientImplementor datastoreClient, Observable observable, PersistentEntity entity, Map<String, FetchType> fetchStrategies, QueryState queryState) {
-        if(!fetchStrategies.isEmpty()) {
+        if (!fetchStrategies.isEmpty()) {
 
             EntityReflector entityReflector = entity.mappingContext.getEntityReflector(entity)
             List<String> joinedProperties = []
             observable = observable.switchMap { Object o ->
 
                 List<Observable<?>> observables = [Observable.just(o)] as List<Observable<?>>
-                if(entity.isInstance(o)) {
+                if (entity.isInstance(o)) {
 
-                    for(fetch in fetchStrategies) {
+                    for (fetch in fetchStrategies) {
                         PersistentProperty property = entity.getPropertyByName(fetch.key)
                         FetchType fetchType = fetch.value
-                        if(fetchType == FetchType.EAGER) {
+                        if (fetchType == FetchType.EAGER) {
                             def propertyName = property.name
                             def currentValue = entityReflector.getProperty(o, propertyName)
 
-                            if(property instanceof ToOne && (currentValue instanceof ObservableProxy)) {
+                            if (property instanceof ToOne && (currentValue instanceof ObservableProxy)) {
                                 ToOne toOne = (ToOne)property
-                                if(!toOne.isEmbedded()) {
-                                    if(!toOne.isForeignKeyInChild()) {
+                                if (!toOne.isEmbedded()) {
+                                    if (!toOne.isForeignKeyInChild()) {
                                         joinedProperties.add(propertyName)
                                         observables.add datastoreClient.get(toOne.associatedEntity.javaClass, ((ObservableProxy)currentValue).getProxyKey(), queryState)
                                     }
@@ -90,25 +90,24 @@ class RxQueryUtils {
                                     }
                                 }
                             }
-                            else if(property instanceof ToMany) {
+                            else if (property instanceof ToMany) {
                                 ToMany toMany = (ToMany)property
-                                if(toMany.isBidirectional() && !(toMany instanceof ManyToMany)) {
+                                if (toMany.isBidirectional() && !(toMany instanceof ManyToMany)) {
                                     def inverseSide = toMany.inverseSide
-                                    if(inverseSide instanceof ManyToOne) {
+                                    if (inverseSide instanceof ManyToOne) {
                                         joinedProperties.add(propertyName)
 
-
                                         RxQuery rxQuery = (RxQuery)datastoreClient.createQuery(inverseSide.owner.javaClass, queryState)
                                                 .eq(inverseSide.name, o)
 
                                         observables.add((Observable) rxQuery.findAll().toList())
                                     }
                                 }
-                                else if(currentValue instanceof RxUnidirectionalCollection) {
+                                else if (currentValue instanceof RxUnidirectionalCollection) {
                                     RxUnidirectionalCollection ruc = (RxUnidirectionalCollection)currentValue
                                     def associationKeys = ruc.associationKeys
                                     joinedProperties.add(propertyName)
-                                    if(associationKeys) {
+                                    if (associationKeys) {
                                         def inverseEntity = toMany.associatedEntity
                                         RxQuery rxQuery = (RxQuery)datastoreClient.createQuery(inverseEntity.javaClass, queryState)
                                                 .in(inverseEntity.identity.name, associationKeys)
@@ -134,11 +133,11 @@ class RxQueryUtils {
                 List<Object> result = (List<Object>) r
                 // first result is the entity
                 def entityInstance = result.get(0)
-                if(result.size() > 1) {
+                if (result.size() > 1) {
                     int i = 0
-                    for(o in result[1..-1]) {
+                    for (o in result[1..-1]) {
                         String name = joinedProperties.get(i++)
-                        if(o instanceof Collection) {
+                        if (o instanceof Collection) {
                             def propertyWriter = entityReflector.getPropertyWriter(name)
                             o = o.asType(propertyWriter.propertyType())
                             propertyWriter.write(entityInstance, DirtyCheckingSupport.wrap((Collection)o, (DirtyCheckable)entityInstance, name))
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormEnhancer.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormEnhancer.groovy
index 6e62dfa63c..b22b73d34e 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormEnhancer.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormEnhancer.groovy
@@ -31,6 +31,7 @@ import org.grails.datastore.rx.RxDatastoreClient
 import org.grails.datastore.rx.internal.RxDatastoreClientImplementor
 
 import java.util.concurrent.ConcurrentHashMap
+
 /**
  * Enhances {@link grails.gorm.rx.RxEntity} instances with behaviour necessary at runtime
  *
@@ -52,8 +53,6 @@ class RxGormEnhancer {
     }
     private static final Map<Class<? extends RxDatastoreClient>, RxDatastoreClient> DATASTORE_CLIENTS = new ConcurrentHashMap<Class<? extends RxDatastoreClient>, RxDatastoreClient>()
 
-
-
     private RxGormEnhancer() {
     }
 
@@ -76,19 +75,19 @@ class RxGormEnhancer {
         String defaultConnectionSource = ConnectionSourcesSupport.getDefaultConnectionSourceName(entity)
         RxDatastoreClientImplementor rxDatastoreClientImplementor = (RxDatastoreClientImplementor) client
 
-        if(!DATASTORE_CLIENTS.containsKey(client.getClass())) {
-            DATASTORE_CLIENTS.put( (Class<? extends RxDatastoreClient>)client.getClass(), client)
+        if (!DATASTORE_CLIENTS.containsKey(client.getClass())) {
+            DATASTORE_CLIENTS.put((Class<? extends RxDatastoreClient>)client.getClass(), client)
         }
 
-        if(MultiTenant.isAssignableFrom(entity.javaClass) || defaultConnectionSource == ConnectionSource.ALL) {
-            for(ConnectionSource cs in client.getConnectionSources().getAllConnectionSources()) {
+        if (MultiTenant.isAssignableFrom(entity.javaClass) || defaultConnectionSource == ConnectionSource.ALL) {
+            for (ConnectionSource cs in client.getConnectionSources().getAllConnectionSources()) {
                 registerEntityWithConnectionSource(entity, cs.name, cs.name, rxDatastoreClientImplementor)
             }
         }
         else {
             registerEntityWithConnectionSource(entity, ConnectionSource.DEFAULT, defaultConnectionSource, rxDatastoreClientImplementor)
-            for(String connectionSourceName in connectionSourceNames) {
-                if(connectionSourceName == ConnectionSource.DEFAULT) continue
+            for (String connectionSourceName in connectionSourceNames) {
+                if (connectionSourceName == ConnectionSource.DEFAULT) continue
                 registerEntityWithConnectionSource(entity, connectionSourceName, connectionSourceName, rxDatastoreClientImplementor)
             }
         }
@@ -104,7 +103,7 @@ class RxGormEnhancer {
      */
     static RxDatastoreClient findDatastoreClientByType(Class<? extends RxDatastoreClient> datastoreType) {
         RxDatastoreClient client = DATASTORE_CLIENTS.get(datastoreType)
-        if(client == null) {
+        if (client == null) {
             throw new IllegalStateException("No RxGORM implementation configured for type [$datastoreType]. Ensure RxGORM has been initialized correctly")
         }
         return client
@@ -117,11 +116,11 @@ class RxGormEnhancer {
      */
     static RxDatastoreClient findSingleDatastoreClient() {
         Collection<RxDatastoreClient> allDatastores = DATASTORE_CLIENTS.values()
-        if(allDatastores.isEmpty()) {
-            throw new IllegalStateException("No RxGORM implementations configured. Ensure RxGORM has been initialized correctly")
+        if (allDatastores.isEmpty()) {
+            throw new IllegalStateException('No RxGORM implementations configured. Ensure RxGORM has been initialized correctly')
         }
-        else if(allDatastores.size() > 1) {
-            throw new IllegalStateException("More than one RxGORM implementation is configured. Specific the client type!")
+        else if (allDatastores.size() > 1) {
+            throw new IllegalStateException('More than one RxGORM implementation is configured. Specific the client type!')
         }
         else {
             return allDatastores.first()
@@ -135,10 +134,10 @@ class RxGormEnhancer {
      * @return
      */
     static <T> String findTenantId(Class<T> entity) {
-        if(MultiTenant.isAssignableFrom(entity)) {
+        if (MultiTenant.isAssignableFrom(entity)) {
             RxDatastoreClient datastoreClient = findStaticApi(entity, ConnectionSource.DEFAULT).datastoreClient
-            if(datastoreClient.multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DATABASE) {
-                return Tenants.currentId( (Class<? extends RxDatastoreClient>) datastoreClient.getClass() )
+            if (datastoreClient.multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DATABASE) {
+                return Tenants.currentId((Class<? extends RxDatastoreClient>) datastoreClient.getClass())
             }
             else {
                 return ConnectionSource.DEFAULT
@@ -159,13 +158,12 @@ class RxGormEnhancer {
      */
     static <T> RxGormStaticApi<T> findStaticApi(Class<T> type, String qualifier = findTenantId(type)) {
         def api = STATIC_APIS.get(qualifier).get(type.name)
-        if(api == null) {
+        if (api == null) {
             throw stateException(type)
         }
         return api
     }
 
-
     /**
      * Find the instance API for the given type
      *
@@ -175,7 +173,7 @@ class RxGormEnhancer {
      */
     static <T> RxGormInstanceApi<T> findInstanceApi(Class<T> type, String qualifier = findTenantId(type)) {
         def api = INSTANCE_APIS.get(qualifier).get(type.name)
-        if(api == null) {
+        if (api == null) {
             throw stateException(type)
         }
         return api
@@ -191,7 +189,7 @@ class RxGormEnhancer {
 
     static <T> RxGormValidationApi<T> findValidationApi(Class<T> type, String qualifier = findTenantId(type)) {
         def api = VALIDATION_APIS.get(qualifier).get(type.name)
-        if(api == null) {
+        if (api == null) {
             throw stateException(type)
         }
         return api
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormInstanceApi.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormInstanceApi.groovy
index 043a5a87fe..b3631cac98 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormInstanceApi.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormInstanceApi.groovy
@@ -25,7 +25,6 @@ import org.grails.datastore.mapping.model.PersistentEntity
 import org.grails.datastore.mapping.reflect.EntityReflector
 import org.grails.datastore.rx.RxDatastoreClient
 import rx.Observable
-import rx.Single
 
 /**
  * Bridge to the implementation of the instance method level operations
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormStaticApi.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormStaticApi.groovy
index 4b20b8aa03..a1b8d63cc9 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormStaticApi.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormStaticApi.groovy
@@ -50,6 +50,7 @@ import org.grails.gorm.rx.finders.FindOrSaveByFinder
 import org.springframework.beans.PropertyAccessorFactory
 import rx.Observable
 import rx.Subscriber
+
 /**
  * Bridge to the implementation of the static method level operations for RX GORM
  *
@@ -107,7 +108,7 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
      * @return A single that will emit the first object, if it exists
      */
     Observable<D> first(String property) {
-        first(sort:property)
+        first(sort: property)
     }
 
     /**
@@ -128,7 +129,6 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
         ((RxQuery)q).singleResult(newParams)
     }
 
-
     /**
      * Finds the last object sorted by propertyName
      *
@@ -137,7 +137,7 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
      * @return A single that will emit the first object, if it exists
      */
     Observable<D> last(String property) {
-        last(sort:property)
+        last(sort: property)
     }
 
     /**
@@ -153,7 +153,7 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
         def q = datastoreClient.createQuery(persistentClass, params)
         Map<String,Object> newParams = new LinkedHashMap<>(params)
         newParams.put('order', 'desc')
-        if(!newParams.containsKey('sort')) {
+        if (!newParams.containsKey('sort')) {
             newParams.put('sort', entity.identity.name)
         }
         DynamicFinder.populateArgumentsForCriteria(persistentClass, q, newParams)
@@ -193,12 +193,12 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
      */
     @Override
     Observable<List<Serializable>> saveAll(Iterable<D> objects, Map arguments = Collections.emptyMap()) {
-        boolean shouldValidate = arguments?.containsKey("validate") ? arguments.validate : true
-        if(shouldValidate) {
+        boolean shouldValidate = arguments?.containsKey('validate') ? arguments.validate : true
+        if (shouldValidate) {
             def firstInvalid = objects.find() {
                 (it instanceof GormValidateable) && !((GormValidateable)it).validate()
             }
-            if(firstInvalid != null) {
+            if (firstInvalid != null) {
                 throw new ValidationException("Validation error occurred during call to save() for entity [$firstInvalid]", ((GormValidateable)firstInvalid).errors)
             }
             else {
@@ -217,12 +217,12 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
 
     @Override
     Observable<List<Serializable>> insertAll(Iterable<D> objects, Map arguments = [:]) {
-        boolean shouldValidate = arguments?.containsKey("validate") ? arguments.validate : true
-        if(shouldValidate) {
+        boolean shouldValidate = arguments?.containsKey('validate') ? arguments.validate : true
+        if (shouldValidate) {
             def firstInvalid = objects.find() {
                 (it instanceof GormValidateable) && !((GormValidateable)it).validate()
             }
-            if(firstInvalid != null) {
+            if (firstInvalid != null) {
                 throw new ValidationException("Validation error occurred during call to save() for entity [$firstInvalid]", ((GormValidateable)firstInvalid).errors)
             }
             else {
@@ -282,7 +282,6 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
         ((RxQuery<D>)query).singleResult(args)
     }
 
-
     /**
      * Finds a single result matching all of the given conditions. Eg. Book.findWhere(author:"Stephen King", title:"The Stand").  If
      * a matching persistent entity is not found a new entity is created and returned.
@@ -298,7 +297,6 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
         } as Observable.OnSubscribe))
     }
 
-
     /**
      * Finds a single result matching all of the given conditions. Eg. Book.findWhere(author:"Stephen King", title:"The Stand").  If
      * a matching persistent entity is not found a new entity is created, saved and returned.
@@ -329,7 +327,7 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
                     }
                 })
             }
-        } as Observable.OnSubscribe ))
+        } as Observable.OnSubscribe))
     }
 
     /**
@@ -407,7 +405,6 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
         (DetachedCriteria<D>)new DetachedCriteria<D>(persistentClass).or(callable)
     }
 
-
     /**
      * Creates a criteria builder instance
      */
@@ -436,7 +433,7 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
             }
         }
 
-        if(builderArgs?.uniqueResult) {
+        if (builderArgs?.uniqueResult) {
             return criteriaBuilder.get(callable)
 
         }
@@ -470,17 +467,17 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
             // FYI... This is relevant to http://jira.grails.org/browse/GRAILS-3463 and may
             // become problematic if http://jira.codehaus.org/browse/GROOVY-5876 is addressed...
             final argumentsForMethod
-            if(varArgs == null) {
+            if (varArgs == null) {
                 argumentsForMethod = [null] as Object[]
             }
             // if the argument component type is not an Object then we have an array passed that is the actual argument
-            else if(varArgs.getClass().componentType != Object) {
+            else if (varArgs.getClass().componentType != Object) {
                 // so we wrap it in an object array
                 argumentsForMethod = [varArgs] as Object[]
             }
             else {
 
-                if(varArgs.length == 1 && varArgs[0].getClass().isArray()) {
+                if (varArgs.length == 1 && varArgs[0].getClass().isArray()) {
                     argumentsForMethod = varArgs[0]
                 } else {
 
@@ -493,7 +490,6 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
         return method.invoke(persistentClass, methodName, args)
     }
 
-
     /**
      * Property missing handler
      *
@@ -577,7 +573,7 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
 
     @Override
     def <T> T withTenant(Serializable tenantId, @DelegatesTo(RxGormAllOperations) Closure<T> callable) {
-        if(multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DATABASE) {
+        if (multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DATABASE) {
 
             def staticApi = RxGormEnhancer.findStaticApi(persistentClass, tenantId.toString())
             callable.setDelegate(staticApi)
@@ -592,7 +588,7 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
                     throw new IllegalArgumentException("Closure accepts too many arguments. Expected 0 or 1, but were $argLength")
             }
         }
-        else if(multiTenancyMode.isSharedConnection()) {
+        else if (multiTenancyMode.isSharedConnection()) {
             Tenants.withId((Class<RxDatastoreClient>)datastoreClient.getClass(), tenantId) {
                 def staticApi = RxGormEnhancer.findStaticApi(persistentClass, ConnectionSource.DEFAULT)
                 callable.setDelegate(staticApi)
@@ -625,10 +621,10 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
 
     @Override
     RxGormAllOperations<D> withTenant(Serializable tenantId) {
-        if(multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DATABASE) {
+        if (multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DATABASE) {
             return RxGormEnhancer.<D> findStaticApi(persistentClass, tenantId.toString())
         }
-        else if(multiTenancyMode.isSharedConnection()) {
+        else if (multiTenancyMode.isSharedConnection()) {
             return new TenantDelegatingRxGormOperations<D>(datastoreClient, tenantId, RxGormEnhancer.<D> findStaticApi(persistentClass))
         }
         else {
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormValidationApi.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormValidationApi.groovy
index b273678f7a..2ae311ba3c 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormValidationApi.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormValidationApi.groovy
@@ -24,6 +24,7 @@ import org.grails.datastore.gorm.GormValidationApi
 import org.grails.datastore.mapping.engine.event.ValidationEvent
 import org.grails.datastore.mapping.model.PersistentEntity
 import org.grails.datastore.rx.RxDatastoreClient
+
 /**
  * RxGORM version of validation API
  *
@@ -31,7 +32,7 @@ import org.grails.datastore.rx.RxDatastoreClient
  * @since 6.0
  */
 @CompileStatic
-class RxGormValidationApi<D> extends GormValidationApi<D>{
+class RxGormValidationApi<D> extends GormValidationApi<D> {
 
     final RxDatastoreClient datastoreClient
     RxGormValidationApi(PersistentEntity entity, RxDatastoreClient datastoreClient) {
@@ -41,6 +42,6 @@ class RxGormValidationApi<D> extends GormValidationApi<D>{
 
     @Override
     protected ValidationEvent createValidationEvent(Object target) {
-        return new ValidationEvent(datastoreClient, persistentEntity, mappingContext.createEntityAccess(persistentEntity, target) )
+        return new ValidationEvent(datastoreClient, persistentEntity, mappingContext.createEntityAccess(persistentEntity, target))
     }
 }
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/multitenancy/TenantDelegatingRxGormOperations.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/multitenancy/TenantDelegatingRxGormOperations.groovy
index 3436504783..4a80dda613 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/multitenancy/TenantDelegatingRxGormOperations.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/multitenancy/TenantDelegatingRxGormOperations.groovy
@@ -36,6 +36,7 @@ import rx.Observable
  */
 @CompileStatic
 class TenantDelegatingRxGormOperations<D> implements RxGormAllOperations<D> {
+
     final RxDatastoreClient datastoreClient
     final Serializable tenantId
     final RxGormAllOperations<D> delegateOperations
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/config/Settings.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/config/Settings.groovy
index 388ee55eb4..7330186ce9 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/config/Settings.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/config/Settings.groovy
@@ -25,7 +25,7 @@ package org.grails.gorm.rx.config
  * @author Graeme Rocher
  * @since 6.0
  */
-interface Settings extends org.grails.datastore.mapping.config.Settings{
+interface Settings extends org.grails.datastore.mapping.config.Settings {
 
     /**
      * Whether blocking operations are allowed
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/AutoTimestampEventListener.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/AutoTimestampEventListener.groovy
index 378a95f866..9524b6c23c 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/AutoTimestampEventListener.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/AutoTimestampEventListener.groovy
@@ -22,6 +22,7 @@ package org.grails.gorm.rx.events
 import groovy.transform.CompileStatic
 import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent
 import org.grails.datastore.rx.RxDatastoreClient
+
 /**
  * An auto timestamp event listener for RxGORM
  *
@@ -30,6 +31,7 @@ import org.grails.datastore.rx.RxDatastoreClient
  */
 @CompileStatic
 class AutoTimestampEventListener extends org.grails.datastore.gorm.events.AutoTimestampEventListener {
+
     final RxDatastoreClient datastoreClient
 
     AutoTimestampEventListener(RxDatastoreClient datastoreClient) {
@@ -39,8 +41,8 @@ class AutoTimestampEventListener extends org.grails.datastore.gorm.events.AutoTi
 
     @Override
     protected boolean isValidSource(AbstractPersistenceEvent event) {
-        Object source = event.getSource();
-        return (source instanceof RxDatastoreClient) && source.equals(datastoreClient);
+        Object source = event.getSource()
+        return (source instanceof RxDatastoreClient) && source.equals(datastoreClient)
     }
 
     @Override
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/DomainEventListener.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/DomainEventListener.groovy
index 5940f2a1b6..03f77eb5a3 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/DomainEventListener.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/DomainEventListener.groovy
@@ -41,8 +41,8 @@ class DomainEventListener extends org.grails.datastore.gorm.events.DomainEventLi
 
     @Override
     protected boolean isValidSource(AbstractPersistenceEvent event) {
-        Object source = event.getSource();
-        return (source instanceof RxDatastoreClient) && source.equals(datastoreClient);
+        Object source = event.getSource()
+        return (source instanceof RxDatastoreClient) && source.equals(datastoreClient)
     }
 
     @Override
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/MultiTenantEventListener.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/MultiTenantEventListener.groovy
index c5de1e2edf..aa1e6504c3 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/MultiTenantEventListener.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/MultiTenantEventListener.groovy
@@ -43,6 +43,7 @@ import org.springframework.util.Assert
  */
 @CompileStatic
 class MultiTenantEventListener implements PersistenceEventListener {
+
     protected final RxDatastoreClient datastoreClient
 
     MultiTenantEventListener(RxDatastoreClient datastoreClient) {
@@ -51,50 +52,50 @@ class MultiTenantEventListener implements PersistenceEventListener {
 
     @Override
     boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
-        return PreQueryEvent.class.isAssignableFrom(eventType) || PostQueryEvent.class.isAssignableFrom(eventType) || PreInsertEvent.class.isAssignableFrom(eventType)
+        return PreQueryEvent.isAssignableFrom(eventType) || PostQueryEvent.isAssignableFrom(eventType) || PreInsertEvent.isAssignableFrom(eventType)
     }
 
     @Override
     boolean supportsSourceType(Class<?> sourceType) {
-        return RxDatastoreClient.class.isAssignableFrom(sourceType)
+        return RxDatastoreClient.isAssignableFrom(sourceType)
     }
 
     @Override
     void onApplicationEvent(ApplicationEvent event) {
-        if(supportsEventType(event.getClass())) {
+        if (supportsEventType(event.getClass())) {
             RxDatastoreClient datastoreClient = (RxDatastoreClient) event.getSource()
-            Assert.notNull(datastoreClient, "Datastore client should never be null from source event")
-            if(event instanceof PreQueryEvent) {
+            Assert.notNull(datastoreClient, 'Datastore client should never be null from source event')
+            if (event instanceof PreQueryEvent) {
                 PreQueryEvent preQueryEvent = (PreQueryEvent) event
                 Query query = preQueryEvent.getQuery()
 
                 PersistentEntity entity = query.getEntity()
-                if(entity.isMultiTenant()) {
-                    if(supportsSourceType(datastoreClient.getClass()) && this.datastoreClient.equals(datastoreClient)) {
+                if (entity.isMultiTenant()) {
+                    if (supportsSourceType(datastoreClient.getClass()) && this.datastoreClient.equals(datastoreClient)) {
                         TenantId tenantId = entity.getTenantId()
-                        if(tenantId != null) {
+                        if (tenantId != null) {
                             Serializable currentId = Tenants.currentId(datastoreClient.getClass())
-                            query.eq(tenantId.getName(), currentId )
+                            query.eq(tenantId.getName(), currentId)
                         }
                     }
                 }
             }
-            else if(event instanceof PreInsertEvent) {
+            else if (event instanceof PreInsertEvent) {
                 PreInsertEvent preInsertEvent = (PreInsertEvent) event
                 PersistentEntity entity = preInsertEvent.getEntity()
-                if(entity.isMultiTenant()) {
+                if (entity.isMultiTenant()) {
                     TenantId tenantId = entity.getTenantId()
                     EntityReflector reflector = entity.getReflector()
-                    if(supportsSourceType(datastoreClient.getClass()) && this.datastoreClient.equals(datastoreClient)) {
+                    if (supportsSourceType(datastoreClient.getClass()) && this.datastoreClient.equals(datastoreClient)) {
                         Serializable currentId = Tenants.currentId(datastoreClient.getClass())
-                        if(currentId != null) {
+                        if (currentId != null) {
                             try {
-                                if(currentId == ConnectionSource.DEFAULT) {
+                                if (currentId == ConnectionSource.DEFAULT) {
                                     currentId = (Serializable) preInsertEvent.getEntityAccess().getProperty(tenantId.getName())
                                 }
                                 reflector.setProperty(preInsertEvent.getEntityObject(), tenantId.getName(), currentId)
                             } catch (Exception e) {
-                                throw new TenantException("Could not assigned tenant id ["+currentId+"] to property ["+tenantId+"], probably due to a type mismatch. You should return a type from the tenant resolver that matches the property type of the tenant id!: " + e.getMessage(), e);
+                                throw new TenantException('Could not assigned tenant id [' + currentId + '] to property [' + tenantId + '], probably due to a type mismatch. You should return a type from the tenant resolver that matches the property type of the tenant id!: ' + e.getMessage(), e)
                             }
                         }
                     }
@@ -109,4 +110,3 @@ class MultiTenantEventListener implements PersistenceEventListener {
     }
 }
 
-
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/ValidationEventListener.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/ValidationEventListener.groovy
index fb593cbc29..7f06b7e446 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/ValidationEventListener.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/ValidationEventListener.groovy
@@ -27,6 +27,7 @@ import org.grails.datastore.mapping.engine.event.PreInsertEvent
 import org.grails.datastore.mapping.engine.event.PreUpdateEvent
 import org.grails.datastore.rx.RxDatastoreClient
 import org.springframework.context.ApplicationEvent
+
 /**
  * A validation event listener for RxGORM
  *
@@ -35,6 +36,7 @@ import org.springframework.context.ApplicationEvent
  */
 @CompileStatic
 class ValidationEventListener implements PersistenceEventListener {
+
     @Override
     boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
         return PreInsertEvent.isAssignableFrom(eventType) || PreUpdateEvent.isAssignableFrom(eventType)
@@ -49,15 +51,15 @@ class ValidationEventListener implements PersistenceEventListener {
     void onApplicationEvent(ApplicationEvent event) {
         def persistenceEvent = (AbstractPersistenceEvent) event
         def entityObject = persistenceEvent.getEntityObject()
-        if(entityObject instanceof GormValidateable) {
+        if (entityObject instanceof GormValidateable) {
             GormValidateable gormValidateable = (GormValidateable) entityObject
-            if(gormValidateable.shouldSkipValidation()) {
-                if( gormValidateable.getErrors()?.hasErrors() )  {
+            if (gormValidateable.shouldSkipValidation()) {
+                if (gormValidateable.getErrors()?.hasErrors()) {
                     persistenceEvent.cancel()
                 }
             }
             else {
-                if( !gormValidateable.validate() ) {
+                if (!gormValidateable.validate()) {
                     persistenceEvent.cancel()
                 }
             }
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/CountByFinder.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/CountByFinder.groovy
index cbee306a4b..88f470c322 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/CountByFinder.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/CountByFinder.groovy
@@ -22,6 +22,7 @@ package org.grails.gorm.rx.finders
 import groovy.transform.CompileStatic
 import org.grails.datastore.gorm.finders.DynamicFinderInvocation
 import org.grails.datastore.rx.RxDatastoreClient
+
 /**
  * Implementation of countBy* dynamic finder for RxGORM
  *
@@ -30,6 +31,7 @@ import org.grails.datastore.rx.RxDatastoreClient
  */
 @CompileStatic
 class CountByFinder extends org.grails.datastore.gorm.finders.CountByFinder {
+
     final RxDatastoreClient datastoreClient
     CountByFinder(RxDatastoreClient datastoreClient) {
         super(datastoreClient.mappingContext)
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindAllByBooleanFinder.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindAllByBooleanFinder.groovy
index 5cef38d502..296e9a74ae 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindAllByBooleanFinder.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindAllByBooleanFinder.groovy
@@ -29,13 +29,14 @@ import org.grails.datastore.rx.RxDatastoreClient
  */
 @CompileStatic
 class FindAllByBooleanFinder extends FindAllByFinder {
+
     FindAllByBooleanFinder(RxDatastoreClient datastoreClient) {
         super(datastoreClient)
         setPattern(org.grails.datastore.gorm.finders.FindAllByBooleanFinder.METHOD_PATTERN)
     }
 
     @Override
-    public boolean firstExpressionIsRequiredBoolean() {
-        return true;
+    boolean firstExpressionIsRequiredBoolean() {
+        return true
     }
 }
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindAllByFinder.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindAllByFinder.groovy
index dd0efc912b..2c8b56bf44 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindAllByFinder.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindAllByFinder.groovy
@@ -32,6 +32,7 @@ import org.grails.datastore.rx.query.RxQuery
  */
 @CompileStatic
 class FindAllByFinder extends org.grails.datastore.gorm.finders.FindAllByFinder {
+
     final RxDatastoreClient datastoreClient
 
     FindAllByFinder(RxDatastoreClient datastoreClient) {
@@ -43,7 +44,10 @@ class FindAllByFinder extends org.grails.datastore.gorm.finders.FindAllByFinder
     protected Object doInvokeInternal(DynamicFinderInvocation invocation) {
         def javaClass = invocation.getJavaClass()
         def query = datastoreClient.createQuery(javaClass)
-        query = buildQuery(invocation, javaClass, query)
+        applyAdditionalCriteria(query, invocation.getCriteria())
+        applyDetachedCriteria(query, invocation.getDetachedCriteria())
+        configureQueryWithArguments(javaClass, query, invocation.getArguments())
+        query.add(getJunction(invocation))
         def arguments = invocation.getArguments()
         if (arguments.length > 0 && (arguments[0] instanceof Map)) {
             ((RxQuery)query).findAll((Map)arguments[0])
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindByBooleanFinder.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindByBooleanFinder.groovy
index db73157141..f0bdf2c0fc 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindByBooleanFinder.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindByBooleanFinder.groovy
@@ -29,13 +29,14 @@ import org.grails.datastore.rx.RxDatastoreClient
  */
 @CompileStatic
 class FindByBooleanFinder extends FindByFinder {
+
     FindByBooleanFinder(RxDatastoreClient datastoreClient) {
         super(datastoreClient)
         setPattern(org.grails.datastore.gorm.finders.FindByBooleanFinder.METHOD_PATTERN)
     }
 
     @Override
-    public boolean firstExpressionIsRequiredBoolean() {
-        return true;
+    boolean firstExpressionIsRequiredBoolean() {
+        return true
     }
 }
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindByFinder.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindByFinder.groovy
index 7c6327e407..1c9a977677 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindByFinder.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindByFinder.groovy
@@ -21,7 +21,6 @@ package org.grails.gorm.rx.finders
 
 import groovy.transform.CompileStatic
 import org.grails.datastore.gorm.finders.DynamicFinderInvocation
-import org.grails.datastore.mapping.model.MappingContext
 import org.grails.datastore.rx.RxDatastoreClient
 
 /**
@@ -44,7 +43,10 @@ class FindByFinder extends org.grails.datastore.gorm.finders.FindByFinder {
     protected Object doInvokeInternal(DynamicFinderInvocation invocation) {
         def javaClass = invocation.getJavaClass()
         def query = datastoreClient.createQuery(javaClass)
-        query = buildQuery(invocation, javaClass, query)
+        applyAdditionalCriteria(query, invocation.getCriteria())
+        applyDetachedCriteria(query, invocation.getDetachedCriteria())
+        configureQueryWithArguments(javaClass, query, invocation.getArguments())
+        query.add(getJunction(invocation))
         invokeQuery(query)
     }
 }
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindOrCreateByFinder.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindOrCreateByFinder.groovy
index 835f04591c..9da50a7dd7 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindOrCreateByFinder.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindOrCreateByFinder.groovy
@@ -25,7 +25,6 @@ import org.grails.datastore.gorm.finders.DynamicFinderInvocation
 import org.grails.datastore.gorm.finders.MethodExpression
 import org.grails.datastore.rx.RxDatastoreClient
 import rx.Observable
-import rx.Observer
 import rx.Subscriber
 
 /**
@@ -36,6 +35,7 @@ import rx.Subscriber
  */
 @CompileStatic
 class FindOrCreateByFinder extends FindByFinder {
+
     FindOrCreateByFinder(RxDatastoreClient datastoreClient) {
         super(datastoreClient)
         setPattern(org.grails.datastore.gorm.finders.FindOrCreateByFinder.METHOD_PATTERN)
@@ -44,7 +44,7 @@ class FindOrCreateByFinder extends FindByFinder {
     @Override
     protected Object doInvokeInternal(DynamicFinderInvocation invocation) {
         Observable observable = (Observable)super.doInvokeInternal(invocation)
-        observable.switchIfEmpty(Observable.create( { Subscriber s ->
+        observable.switchIfEmpty(Observable.create({ Subscriber s ->
                 Thread.start {
                     Map m = [:]
                     List<MethodExpression> expressions = invocation.getExpressions()
@@ -58,23 +58,23 @@ class FindOrCreateByFinder extends FindByFinder {
                     }
 
                     def newInstance = invocation.javaClass.newInstance(m)
-                    if(shouldSaveOnCreate()) {
+                    if (shouldSaveOnCreate()) {
                         def saveObservable = ((RxEntity) newInstance).save()
                         saveObservable.subscribe(new Subscriber() {
-                            @Override
-                            void onCompleted() {
-                                s.onCompleted()
-                            }
+                        @Override
+                        void onCompleted() {
+                            s.onCompleted()
+                        }
 
-                            @Override
-                            void onError(Throwable e) {
-                                s.onCompleted()
-                            }
+                        @Override
+                        void onError(Throwable e) {
+                            s.onCompleted()
+                        }
 
-                            @Override
-                            void onNext(Object o) {
-                                s.onNext o
-                            }
+                        @Override
+                        void onNext(Object o) {
+                            s.onNext o
+                        }
                         })
                     }
                     else {
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindOrSaveByFinder.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindOrSaveByFinder.groovy
index c57aed557c..77df23793f 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindOrSaveByFinder.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindOrSaveByFinder.groovy
@@ -27,6 +27,7 @@ import org.grails.datastore.rx.RxDatastoreClient
  */
 @CompileStatic
 class FindOrSaveByFinder extends FindOrCreateByFinder {
+
     FindOrSaveByFinder(RxDatastoreClient datastoreClient) {
         super(datastoreClient)
         setPattern(org.grails.datastore.gorm.finders.FindOrSaveByFinder.METHOD_PATTERN)
@@ -34,6 +35,6 @@ class FindOrSaveByFinder extends FindOrCreateByFinder {
 
     @Override
     protected boolean shouldSaveOnCreate() {
-        return true;
+        return true
     }
 }
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/ObservableResultAdapter.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/ObservableResultAdapter.groovy
index 58ff61bb72..088f2f7a18 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/ObservableResultAdapter.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/ObservableResultAdapter.groovy
@@ -50,6 +50,7 @@ import static org.grails.gorm.rx.transform.RxAstUtils.isRxEntity
  */
 @CompileStatic
 class ObservableResultAdapter  implements ServiceImplementer, Ordered, AdaptedImplementer {
+
     final PrefixedServiceImplementer adapted
     final Class returnType
     final boolean isDomainReturnType
@@ -63,36 +64,36 @@ class ObservableResultAdapter  implements ServiceImplementer, Ordered, AdaptedIm
     @Override
     boolean doesImplement(ClassNode domainClass, MethodNode methodNode) {
         def alreadyImplemented = methodNode.getNodeMetaData(IMPLEMENTED)
-        if(!alreadyImplemented) {
+        if (!alreadyImplemented) {
             boolean isObservableOfReturnType
 
             ClassNode methodReturnType = methodNode.returnType
-            if(isDomainReturnType) {
+            if (isDomainReturnType) {
                 isObservableOfReturnType = RxAstUtils.isObservableOfDomainClass(methodReturnType)
             }
-            else if(returnType != null) {
+            else if (returnType != null) {
                 isObservableOfReturnType = RxAstUtils.isObservableOf(methodReturnType, returnType)
             }
             else {
                 isObservableOfReturnType = RxAstUtils.isObservableOf(methodReturnType, Object)
             }
 
-            if(!isObservableOfReturnType && (adapted instanceof IterableInterfaceProjectionBuilder) && RxAstUtils.isObservable(methodReturnType)) {
+            if (!isObservableOfReturnType && (adapted instanceof IterableInterfaceProjectionBuilder) && RxAstUtils.isObservable(methodReturnType)) {
                 ClassNode genericType = resolveSingleGenericType(methodReturnType)
-                isObservableOfReturnType =  ((IterableInterfaceProjectionBuilder)adapted).isInterfaceProjection(domainClass, methodNode, genericType )
+                isObservableOfReturnType =  ((IterableInterfaceProjectionBuilder)adapted).isInterfaceProjection(domainClass, methodNode, genericType)
             }
 
-            if(adapted instanceof AnnotatedServiceImplementer) {
+            if (adapted instanceof AnnotatedServiceImplementer) {
                 return ((AnnotatedServiceImplementer)adapted).isAnnotated(domainClass, methodNode) && isObservableOfReturnType
             }
             else {
                 String prefix = adapted.resolvePrefix(methodNode)
-                if(adapted instanceof IterableProjectionServiceImplementer) {
+                if (adapted instanceof IterableProjectionServiceImplementer) {
                     ClassNode genericType = resolveSingleGenericType(methodReturnType)
                     ClassNode iterableType = GenericsUtils.makeClassSafeWithGenerics(Iterable, genericType)
 
-                    if(adapted instanceof IterableInterfaceProjectionBuilder) {
-                        return prefix && ((IterableInterfaceProjectionBuilder)adapted).isInterfaceProjection(domainClass, methodNode, iterableType )
+                    if (adapted instanceof IterableInterfaceProjectionBuilder) {
+                        return prefix && ((IterableInterfaceProjectionBuilder)adapted).isInterfaceProjection(domainClass, methodNode, iterableType)
                     }
                     else {
                         return prefix && ((IterableProjectionServiceImplementer)adapted).isCompatibleReturnType(domainClass, methodNode, iterableType, prefix)
@@ -110,15 +111,15 @@ class ObservableResultAdapter  implements ServiceImplementer, Ordered, AdaptedIm
     @Override
     void implement(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode) {
         ClassNode returnType = resolveSingleGenericType(abstractMethodNode.returnType)
-        if(isDomainReturnType && !(adapted instanceof IterableInterfaceProjectionBuilder)) {
+        if (isDomainReturnType && !(adapted instanceof IterableInterfaceProjectionBuilder)) {
             domainClassNode = returnType
         }
 
         ClassNode iterableType = GenericsUtils.makeClassSafeWithGenerics(Iterable, returnType)
-        newMethodNode.setNodeMetaData(RETURN_TYPE, iterableType )
+        newMethodNode.setNodeMetaData(RETURN_TYPE, iterableType)
         adapted.implement(domainClassNode, abstractMethodNode, newMethodNode, targetClassNode)
 
-        if(!isRxEntity(domainClassNode)) {
+        if (!isRxEntity(domainClassNode)) {
             def ann = addAnnotationOrGetExisting(newMethodNode, RxSchedule)
             ann.setMember(RxScheduleIOTransformation.ANN_SINGLE_RESULT, ConstantExpression.TRUE)
             newMethodNode.addAnnotation(ann)
@@ -127,7 +128,7 @@ class ObservableResultAdapter  implements ServiceImplementer, Ordered, AdaptedIm
 
     @Override
     int getOrder() {
-        if(adapted instanceof Ordered) {
+        if (adapted instanceof Ordered) {
             return ((Ordered)adapted).getOrder()
         }
         return 0
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/ObservableServiceImplementerAdapter.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/ObservableServiceImplementerAdapter.groovy
index 1b6c9ad116..9ba5cad449 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/ObservableServiceImplementerAdapter.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/ObservableServiceImplementerAdapter.groovy
@@ -22,7 +22,6 @@ package org.grails.gorm.rx.services.implementers
 import groovy.transform.CompileStatic
 import org.grails.datastore.gorm.services.ServiceImplementer
 import org.grails.datastore.gorm.services.ServiceImplementerAdapter
-import org.grails.datastore.gorm.services.implementers.AbstractProjectionImplementer
 import org.grails.datastore.gorm.services.implementers.IterableServiceImplementer
 import org.grails.datastore.gorm.services.implementers.SingleResultServiceImplementer
 
@@ -34,12 +33,13 @@ import org.grails.datastore.gorm.services.implementers.SingleResultServiceImplem
  */
 @CompileStatic
 class ObservableServiceImplementerAdapter implements ServiceImplementerAdapter {
+
     @Override
     ServiceImplementer adapt(ServiceImplementer implementer) {
-        if(implementer instanceof SingleResultServiceImplementer) {
+        if (implementer instanceof SingleResultServiceImplementer) {
             return new SingleResultAdapter((SingleResultServiceImplementer)implementer)
         }
-        else if(implementer instanceof IterableServiceImplementer) {
+        else if (implementer instanceof IterableServiceImplementer) {
             return new ObservableResultAdapter((IterableServiceImplementer)implementer)
         }
         return null
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/SingleResultAdapter.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/SingleResultAdapter.groovy
index 275472c448..35eb1aea76 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/SingleResultAdapter.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/SingleResultAdapter.groovy
@@ -63,31 +63,31 @@ class SingleResultAdapter implements ServiceImplementer, Ordered, AdaptedImpleme
     @Override
     boolean doesImplement(ClassNode domainClass, MethodNode methodNode) {
         def alreadyImplemented = methodNode.getNodeMetaData(IMPLEMENTED)
-        if(!alreadyImplemented) {
+        if (!alreadyImplemented) {
             boolean isObservableOfReturnType
 
             ClassNode methodReturnType = methodNode.returnType
-            if(isDomainReturnType) {
+            if (isDomainReturnType) {
                 isObservableOfReturnType = RxAstUtils.isSingleOfDomainClass(methodReturnType) && !methodReturnType.isArray()
             }
-            else if(returnType != null) {
+            else if (returnType != null) {
                 isObservableOfReturnType = RxAstUtils.isSingleOf(methodReturnType, returnType) && !methodReturnType.isArray()
             }
             else {
                 isObservableOfReturnType = RxAstUtils.isSingleOf(methodReturnType, Object) && !methodReturnType.isArray()
             }
 
-            if(!isObservableOfReturnType && (adapted instanceof SingleResultInterfaceProjectionBuilder) && RxAstUtils.isSingle(methodReturnType)) {
+            if (!isObservableOfReturnType && (adapted instanceof SingleResultInterfaceProjectionBuilder) && RxAstUtils.isSingle(methodReturnType)) {
                 ClassNode genericType = resolveSingleGenericType(methodReturnType)
-                isObservableOfReturnType =  ((SingleResultInterfaceProjectionBuilder)adapted).isInterfaceProjection(domainClass, methodNode, genericType )
+                isObservableOfReturnType =  ((SingleResultInterfaceProjectionBuilder)adapted).isInterfaceProjection(domainClass, methodNode, genericType)
             }
 
-            if(adapted instanceof AnnotatedServiceImplementer) {
+            if (adapted instanceof AnnotatedServiceImplementer) {
                 return ((AnnotatedServiceImplementer)adapted).isAnnotated(domainClass, methodNode) && isObservableOfReturnType
             }
             else {
                 String prefix = adapted.resolvePrefix(methodNode)
-                if(adapted instanceof SingleResultProjectionServiceImplementer) {
+                if (adapted instanceof SingleResultProjectionServiceImplementer) {
                     ClassNode genericType = resolveSingleGenericType(methodReturnType)
                     return ((SingleResultProjectionServiceImplementer)adapted).isCompatibleReturnType(domainClass, methodNode, genericType, prefix)
                 }
@@ -103,10 +103,10 @@ class SingleResultAdapter implements ServiceImplementer, Ordered, AdaptedImpleme
     @Override
     void implement(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode) {
         ClassNode returnType = resolveSingleGenericType(abstractMethodNode.returnType)
-        newMethodNode.setNodeMetaData(RETURN_TYPE, returnType )
+        newMethodNode.setNodeMetaData(RETURN_TYPE, returnType)
         adapted.implement(domainClassNode, abstractMethodNode, newMethodNode, targetClassNode)
 
-        if(!isRxEntity(returnType)) {
+        if (!isRxEntity(returnType)) {
             def ann = addAnnotationOrGetExisting(newMethodNode, RxSchedule)
             ann.setMember(RxScheduleIOTransformation.ANN_SINGLE_RESULT, ConstantExpression.TRUE)
             newMethodNode.addAnnotation(ann)
@@ -116,7 +116,7 @@ class SingleResultAdapter implements ServiceImplementer, Ordered, AdaptedImpleme
 
     @Override
     int getOrder() {
-        if(adapted instanceof Ordered) {
+        if (adapted instanceof Ordered) {
             return ((Ordered)adapted).getOrder()
         }
         return 0
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/support/RxServiceSupport.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/support/RxServiceSupport.groovy
index 4435ebf377..d9e1853aff 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/support/RxServiceSupport.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/support/RxServiceSupport.groovy
@@ -25,7 +25,6 @@ import rx.Observer
 import rx.Scheduler
 import rx.Single
 import rx.SingleSubscriber
-import rx.Subscriber
 import rx.observables.SyncOnSubscribe
 import rx.schedulers.Schedulers
 
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/transform/RxAstUtils.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/transform/RxAstUtils.groovy
index 557c57db12..6de00ed67d 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/transform/RxAstUtils.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/transform/RxAstUtils.groovy
@@ -35,6 +35,7 @@ import org.grails.datastore.mapping.reflect.AstUtils
  */
 @CompileStatic
 class RxAstUtils extends AstUtils {
+
     /**
      * The rx entity class node
      */
@@ -57,9 +58,9 @@ class RxAstUtils extends AstUtils {
      * @return True if it is
      */
     static boolean isObservableOfDomainClass(ClassNode cls) {
-        if(isObservable(cls)) {
+        if (isObservable(cls)) {
             GenericsType[] genericsTypes = cls.genericsTypes
-            if(genericsTypes != null && genericsTypes.length == 1) {
+            if (genericsTypes != null && genericsTypes.length == 1) {
                 ClassNode type = genericsTypes[0].type
                 return type != null && isDomainClass(type)
             }
@@ -74,9 +75,9 @@ class RxAstUtils extends AstUtils {
      * @return True if it is
      */
     static boolean isSingleOfDomainClass(ClassNode cls) {
-        if(isSingle(cls)) {
+        if (isSingle(cls)) {
             GenericsType[] genericsTypes = cls.genericsTypes
-            if(genericsTypes != null && genericsTypes.length == 1) {
+            if (genericsTypes != null && genericsTypes.length == 1) {
                 ClassNode type = genericsTypes[0].type
                 return type != null && isDomainClass(type)
             }
@@ -91,9 +92,9 @@ class RxAstUtils extends AstUtils {
      * @return True if it is
      */
     static boolean isObservableOf(ClassNode cls, ClassNode parent) {
-        if(isObservable(cls) || isSingle(cls)) {
+        if (isObservable(cls) || isSingle(cls)) {
             GenericsType[] genericsTypes = cls.genericsTypes
-            if(genericsTypes != null && genericsTypes.length == 1) {
+            if (genericsTypes != null && genericsTypes.length == 1) {
                 ClassNode type = genericsTypes[0].type
                 return type != null && isSubclassOfOrImplementsInterface(type, parent)
             }
@@ -107,9 +108,9 @@ class RxAstUtils extends AstUtils {
      * @return True if it is
      */
     static boolean isSingleOf(ClassNode cls, Class parent) {
-        if(isSingle(cls)) {
+        if (isSingle(cls)) {
             GenericsType[] genericsTypes = cls.genericsTypes
-            if(genericsTypes != null && genericsTypes.length == 1) {
+            if (genericsTypes != null && genericsTypes.length == 1) {
                 ClassNode type = genericsTypes[0].type
                 return type != null && isSubclassOfOrImplementsInterface(type, parent.name)
             }
@@ -123,9 +124,9 @@ class RxAstUtils extends AstUtils {
      * @return True if it is
      */
     static boolean isObservableOf(ClassNode cls, Class parent) {
-        if(isObservable(cls)) {
+        if (isObservable(cls)) {
             GenericsType[] genericsTypes = cls.genericsTypes
-            if(genericsTypes != null && genericsTypes.length == 1) {
+            if (genericsTypes != null && genericsTypes.length == 1) {
                 ClassNode type = genericsTypes[0].type
                 return type != null && isSubclassOfOrImplementsInterface(type, parent.name)
             }
@@ -139,7 +140,7 @@ class RxAstUtils extends AstUtils {
      * @return True if it is
      */
     static boolean isSingle(ClassNode cls) {
-        isSubclassOf(cls, "rx.Single")
+        isSubclassOf(cls, 'rx.Single')
     }
 
     /**
@@ -149,6 +150,6 @@ class RxAstUtils extends AstUtils {
      * @return True if it is
      */
     static boolean isObservable(ClassNode cls) {
-        return isSubclassOf(cls, "rx.Observable")
+        return isSubclassOf(cls, 'rx.Observable')
     }
 }
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/transform/RxScheduleIOTransformation.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/transform/RxScheduleIOTransformation.groovy
index 20257d660e..6caac17e7c 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/transform/RxScheduleIOTransformation.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/transform/RxScheduleIOTransformation.groovy
@@ -24,14 +24,12 @@ import groovy.transform.CompileStatic
 import org.codehaus.groovy.ast.AnnotationNode
 import org.codehaus.groovy.ast.ClassHelper
 import org.codehaus.groovy.ast.ClassNode
-import org.codehaus.groovy.ast.GenericsType
 import org.codehaus.groovy.ast.MethodNode
 import org.codehaus.groovy.ast.VariableScope
 import org.codehaus.groovy.ast.expr.ArgumentListExpression
 import org.codehaus.groovy.ast.expr.CastExpression
 import org.codehaus.groovy.ast.expr.ClosureExpression
 import org.apache.grails.common.compiler.GroovyTransformOrder
-import org.codehaus.groovy.ast.expr.ConstantExpression
 import org.codehaus.groovy.ast.expr.Expression
 import org.codehaus.groovy.ast.expr.MethodCallExpression
 import org.codehaus.groovy.ast.stmt.BlockStatement
@@ -41,10 +39,7 @@ import org.codehaus.groovy.ast.tools.GenericsUtils
 import org.codehaus.groovy.control.CompilePhase
 import org.codehaus.groovy.control.SourceUnit
 import org.codehaus.groovy.transform.GroovyASTTransformation
-import org.grails.datastore.gorm.multitenancy.transform.TenantTransform
-import org.grails.datastore.gorm.transform.AbstractDatastoreMethodDecoratingTransformation
 import org.grails.datastore.gorm.transform.AbstractMethodDecoratingTransformation
-import org.grails.datastore.mapping.core.Ordered
 import org.grails.datastore.mapping.reflect.AstGenericsUtils
 import org.grails.gorm.rx.services.support.RxServiceSupport
 import rx.Scheduler
@@ -65,13 +60,14 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.callX
 @CompileStatic
 @GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION)
 class RxScheduleIOTransformation extends AbstractMethodDecoratingTransformation {
+
     private static final Object APPLIED_MARKER = new Object()
     public static final String RENAMED_METHOD_PREFIX = '$rx__'
 
     public static final ClassNode ANNOTATION_TYPE = ClassHelper.make(RxSchedule)
     public static final AnnotationNode ANNOTATION = new AnnotationNode(ANNOTATION_TYPE)
-    public static final String ANN_SINGLE_RESULT = "singleResult"
-    public static final String ANN_SCHEDULER = "scheduler"
+    public static final String ANN_SINGLE_RESULT = 'singleResult'
+    public static final String ANN_SCHEDULER = 'scheduler'
 
     @Override
     protected ClassNode getAnnotationType() {
@@ -91,21 +87,21 @@ class RxScheduleIOTransformation extends AbstractMethodDecoratingTransformation
     @Override
     protected MethodNode weaveNewMethod(SourceUnit sourceUnit, AnnotationNode annotationNode, ClassNode classNode, MethodNode methodNode, Map<String, ClassNode> genericsSpec) {
         Object appliedMarker = getAppliedMarker()
-        if ( methodNode.getNodeMetaData(appliedMarker) == appliedMarker ) {
+        if (methodNode.getNodeMetaData(appliedMarker) == appliedMarker) {
             return methodNode
         }
-        if(methodNode.isAbstract()) {
+        if (methodNode.isAbstract()) {
             return methodNode
         }
 
         List<MethodNode> decorated = (List<MethodNode>)methodNode.getNodeMetaData(DECORATED_METHODS)
         ClassNode newReturnType = resolveReturnTypeForNewMethod(methodNode)
-        if(RxAstUtils.isObservable(methodNode.returnType)) {
+        if (RxAstUtils.isObservable(methodNode.returnType)) {
             newReturnType = GenericsUtils.makeClassSafeWithGenerics(Iterable, newReturnType)
         }
-        if(decorated != null) {
+        if (decorated != null) {
 
-            for(MethodNode mn in decorated) {
+            for (MethodNode mn in decorated) {
                 mn.setReturnType(newReturnType)
                 alignReturnType(mn, newReturnType)
             }
@@ -120,7 +116,7 @@ class RxScheduleIOTransformation extends AbstractMethodDecoratingTransformation
     protected void alignReturnType(MethodNode newMethod, ClassNode newReturnType) {
         newMethod.setReturnType(newReturnType)
         BlockStatement newMethodBody = (BlockStatement) newMethod.code
-        if(newMethodBody != null) {
+        if (newMethodBody != null) {
 
             ReturnStatement rs = null
             Statement last = newMethodBody.statements[-1]
@@ -138,18 +134,18 @@ class RxScheduleIOTransformation extends AbstractMethodDecoratingTransformation
     protected MethodCallExpression buildDelegatingMethodCall(SourceUnit sourceUnit, AnnotationNode annotationNode, ClassNode classNode, MethodNode methodNode, MethodCallExpression originalMethodCallExpr, BlockStatement newMethodBody) {
         Expression schedulerExpression = annotationNode.getMember(ANN_SCHEDULER)
         ArgumentListExpression args = new ArgumentListExpression()
-        if(schedulerExpression instanceof ClosureExpression) {
+        if (schedulerExpression instanceof ClosureExpression) {
             args.addExpression(
-                castX(ClassHelper.make(Scheduler), callX(schedulerExpression, "call"))
+                castX(ClassHelper.make(Scheduler), callX(schedulerExpression, 'call'))
             )
         }
 
         VariableScope variableScope = methodNode.getVariableScope()
-        if(RxAstUtils.isSingle(methodNode.returnType)) {
-            return makeDelegatingClosureCall( classX(RxServiceSupport), "createSingle", args, ZERO_PARAMETERS, originalMethodCallExpr, variableScope)
+        if (RxAstUtils.isSingle(methodNode.returnType)) {
+            return makeDelegatingClosureCall(classX(RxServiceSupport), 'createSingle', args, ZERO_PARAMETERS, originalMethodCallExpr, variableScope)
         }
         else {
-            return makeDelegatingClosureCall( classX(RxServiceSupport), "create", args, ZERO_PARAMETERS, originalMethodCallExpr, variableScope)
+            return makeDelegatingClosureCall(classX(RxServiceSupport), 'create', args, ZERO_PARAMETERS, originalMethodCallExpr, variableScope)
         }
     }
 
@@ -160,6 +156,6 @@ class RxScheduleIOTransformation extends AbstractMethodDecoratingTransformation
 
     @Override
     int priority() {
-        return GroovyTransformOrder.RX_SCHEDULE_IO_ORDER
+        return GroovyTransformOrder.RX_SCHEDULER_ORDER
     }
 }
diff --git a/settings.gradle b/settings.gradle
index 933c516bcf..b0b5df7293 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -208,8 +208,7 @@ include(
         'grails-datamapping-core-test',
 
         // RX projects
-        // until this can be finished being ported to the current Grails release, we are disabling
-        //'grails-datamapping-rx',
+        'grails-datamapping-rx',
 
         // Spring Security
         // Note: Spring Security documentation is now part of grails-doc (grails-doc/src/en/guide/security).