Повторное использование части закрытия критериев Grails

У меня довольно большое закрытие критериев в приложении Grails, и я хотел бы повторно использовать его в нескольких местах в моем приложении. Вместо того, чтобы дублировать раздел, мне нужно повторное использование, я хотел бы определить это как отдельное закрытие и ссылаться на него везде, где это необходимо, но я немного борюсь с синтаксисом.

Это упрощенная/вырезанная версия, но по существу мои критерии выглядят примерно так:

def criteriaClosure = {
    and {
        // filtering criteria that I'd like to reuse in lots of places
        or {
            names.each { name ->
                sqlRestriction(getFilteringSql(name), [someId])
            }
        }

        if (isOrganisationChild(childDefaultGrailsDomainClass)) {
            sqlRestriction(getFilteringSql(domain), [someArg])
        }

        // filtering criteria that specific to this particular method
        sqlRestriction(getSomeOtherSql(), [someOtherArg])
    }
}

def criteria = domain.createCriteria()
def paginatedList = criteria.list([offset: offset, max: max], criteriaClosure)

Я попытался определить часть закрытия, которую я хочу повторно использовать в качестве переменной, и ссылаясь на нее в моем закрытии критериев, однако ограничения, которые она определяет, похоже, не применяются.

def reusableClosure = {
    and {
        or {
            names.each { name ->
                sqlRestriction(getFilteringSql(name), [someId])
            }
        }

        if (isOrganisationChild(childDefaultGrailsDomainClass)) {
            sqlRestriction(getFilteringSql(domain), [someArg])
        }
    }
}

def criteriaClosure = {
    and {
        reusableClosure() //this doesn't seem to work
        sqlRestriction(getSomeOtherSql(), [someOtherArg])
    }
}

Я уверен, что это должно быть довольно простой задачей, поэтому извиняйтесь, если это глупый вопрос. Любые идеи?

Ответ 1

Я думаю, вам нужно передать делегат до reusableClosure, то есть:

def criteriaClosure = {
    and {
        reusableClosure.delegate = delegate
        reusableClosure()
        sqlRestriction(getSomeOtherSql(), [someOtherArg])
    }
}