Search code examples
grailsgroovygrails-controller

How Do I Combine Two Query Results In To A Map, In Grails?


I'm new to Grails development.

I have a domain class like this :

class DaySchedule {
    Date Todaysdate
    String startTime;
    String endTime;
    String task
    int priority 
    boolean completed
    static belongsTo = [ schedule : Schedule ]
}

I have bootstrapped with some test data's. Now I want to do a query, with following condition :

  • I need to pick each task (which are stored in bootstrap.groovy) which are belongs to a particularTodaysdate.

For example if I have these statements in my BootStrap.groovy :

//other codes
def daySchedule3 = new DaySchedule(Todaysdate:new Date(),
                startTime:"6pm",endTime:"10pm",
                task:"ReaD git...",completed:false)
def daySchedule4 = new DaySchedule(Todaysdate:new Date()+1,
                startTime:"10am",endTime:"12pm",
                task:"Read MySQL....",completed:false)

Now clearly the task, ReaD git... belongs to a day (which is today as I have passed new Date() into it).

To find these I came up with a partial solution like this:

        def allTasks = DaySchedule.findAllByTaskIsNotNull()
        def dates  = allTasks.collect { it.Todaysdate }
        def tasks = dates.collect { 
                    def queryParameter = new DaySchedule(Todaysdate:it)
                    def todaysWork = DaySchedule.findAll(queryParameter)
                    todaysWork.task 
        }

I have a problem with this code. I couldn't use collectEntries method on the dates and tasks so that I convert it into map of a particular date(i.e dates) with values as tasks. (which is what I tried for!)

Now I'm left lone. I couldn't not able to find a way to guess for which dates the tasks belongs to.

Any other solutions for it?

Thanks in advance.


Solution

  • It sounds like you're trying to get a map with a key of the date, and a value of the task name, for all of the domain objects DaySchedule. You may want to try Collection.groupBy. For example:

    def allTasks = DaySchedule.findAllByTaskIsNotNull()
    
    def tasksByDate = [:] // start with empty map
    
    tasksByDate.putAll(
        allTasks.groupBy { task ->
            // group by just the date portion, ignoring time
            // clone since clearTime modifies original
            task.todaysDate.clone().clearTime()
        }.collect { date, daySchedule ->
            // change from map of date -> daySchedule to map of date -> task
            [date, daySchedule.task] as MapEntry
        }
    )