From eb8c70134fef6722c010179b332c2e58df64bc4e Mon Sep 17 00:00:00 2001 From: Arunan Balasubramaniam Date: Fri, 3 Aug 2018 16:42:29 +0100 Subject: [PATCH] Issue #24 - add any sort columns to the distinct 'id' if no distinct columns were specified This allows H2 to perform the sort as it will not do so without the sort column in the results. This does not affect the case where the user has explicitly specified 'distinct' as that is the user asking for an impossible combination. --- .../plugin/quickSearch/QuickSearchService.groovy | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/grails-app/services/grails/plugin/quickSearch/QuickSearchService.groovy b/grails-app/services/grails/plugin/quickSearch/QuickSearchService.groovy index 7e3d967..82e3f2c 100644 --- a/grails-app/services/grails/plugin/quickSearch/QuickSearchService.groovy +++ b/grails-app/services/grails/plugin/quickSearch/QuickSearchService.groovy @@ -71,9 +71,11 @@ class QuickSearchService { aliasBuilder.delegate = delegate propertyQueryBuilder.delegate = delegate + def sortAliases = [] + // sorting if (searchParams?.sort && searchParams?.order) { - def sortAliases = ((String) searchParams.sort).split(",").collect {aliasBuilder(domainClass, it.trim(), aliasesList)} + sortAliases = ((String) searchParams.sort).split(",").collect {aliasBuilder(domainClass, it.trim(), aliasesList)} def sortOrders = ((String) searchParams.order).split(",") and { sortAliases.each { @@ -87,6 +89,8 @@ class QuickSearchService { if (searchParams?.distinct) { def distinctAlias = aliasBuilder(domainClass, searchParams.distinct, aliasesList) distinct(distinctAlias) + } else if (sortAliases) { + distinct(['id'] + sortAliases) } else { distinct('id') } @@ -120,9 +124,12 @@ class QuickSearchService { if (result) { def pagedResult = domainClass.createCriteria().list([:]) { aliasBuilder.delegate = delegate + + def sortAliases = [] + // sorting if (searchParams?.sort && searchParams?.order) { - def sortAliases = ((String) searchParams.sort).split(",").collect {aliasBuilder(domainClass, it.trim(), aliasesList)} + sortAliases = ((String) searchParams.sort).split(",").collect {aliasBuilder(domainClass, it.trim(), aliasesList)} def sortOrders = ((String) searchParams.order).split(",") and { sortAliases.each { @@ -131,7 +138,9 @@ class QuickSearchService { } } // get by ids - 'in'("id", result) + def ids = sortAliases ? result.collect { it[0] } : result + + 'in'("id", ids) } pagedResult.totalCount = result.totalCount // fake total count return pagedResult