Как объединить два результата запроса в карту в Grails? - PullRequest
0 голосов
/ 19 декабря 2011

Я новичок в разработке Grails.

У меня есть класс домена, подобный этому:

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

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

  • Мне нужно выбрать каждый task (который хранится в bootstrap.groovy), принадлежащий определенному Todaysdate.

Например, если у меня есть эти утверждения в моем 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)

Теперь ясно, что task, ReaD git... принадлежит одному дню (который сегодня является тем, как я ввел в него new Date()).

Чтобы найти их, я нашел частичное решение, подобное этому:

        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 
        }

У меня проблема с этим кодом. Я не смог использовать метод collectEntries для dates и tasks, чтобы преобразовать его в карту определенной даты (например, dates) со значениями tasks. (что я и пытался!)

Теперь я остался один. Я не смог найти способ угадать, к чему dates принадлежит tasks.

Какие-нибудь другие решения для этого?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

Я думаю, что у вас где-то есть проблема с дизайном ... было бы проще иметь что-то вроде:

class Task {
    Date startTime;  
    Date endTime;
    String description
    int priority 
    boolean completed
    static belongsTo = [ schedule : Schedule ]

    String toString() {
        return "${description} : from ${startTime} to ${endTime}"
    }

}

Затем вы можете перечислить все даты, на которые у вас есть задачи, например:

java.text.DateFormat df = java.text.DateFormat.getDateInstance(DateFormat.LONG, Locale.US);

def days = Task.list().collect {
      df.format(it.startTime);
}.unique()

Таким образом, теперь переменная days содержит массив строк уникальных дней в вашей базе данных со связанными задачами.

Если вы хотите перечислить задачи по дням, вы можете сделать:

days.each { dayString ->
    def date = df.parse(dayString)
    def dayTasks = Task.findAllByStartTimeBetween(date, date+1)
    println "Tasks for ${dayString}"
    dayTasks.each {
        println "    - ${it}"
    }
}
1 голос
/ 19 декабря 2011

Похоже, вы пытаетесь получить карту с ключом даты и значением имени задачи для всех объектов домена DaySchedule.Вы можете попробовать Collection.groupBy.Например:

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
    }
)
...