Переводить SQL-запросы для интеллектуального анализа данных в эквиваленты Grails? - PullRequest
2 голосов
/ 03 апреля 2011

Я хотел бы создать веб-интерфейс для представления логданных. Это должна быть хорошая возможность попытаться создать небольшое веб-приложение с использованием Grails, которое я давно хотел опробовать, но у меня возникли некоторые проблемы с пониманием того, как я могу «перевести» сегодняшние ручные SQL-запросы в что-то пригодное для Грааля.

Я не нашел слишком много информации о переоборудовании существующих таблиц данных в классы домена в книге Grails In Action. Поэтому я привожу это здесь для некоторых разъяснений:)

Это в основном схема для таблицы журнала, в которую я веду журнал сегодня:

LOG(id,method,timestamp,millis_used,username,hostname,...etc)

Я вижу, как я делаю что-то вроде создания классов домена User и Host с сопоставлениями вроде hasMany = { logs: Log } и класса Log с belongsTo = { user: User }, но не то, как я могу эффективно использовать это для запроса моих данных, особенно если с сотнями тысяч строк журнала. Я обычно делаю запросы к данным типа "find the average time used for method='fooBar' and user='john_doe' the last 30 days" или "count the number of rows where method='fooBaz' and host='localhost' from May to December".

Как вы собираетесь получать информацию, подобную этой? Не могли бы вы просто забыть о сопоставлении записей в журнале и просто использовать какие-то прямые запросы SQL (HQL?) К таблицам или можно использовать этот (неизвестный мне) зверь GORM для подобных вещей?

Ответы [ 2 ]

4 голосов
/ 04 апреля 2011

Во-первых, я согласен с ответом Теда. Проверьте презентацию Берта перед настройкой доменов GORM.

Во-вторых, я рекомендую вам взглянуть на Критерии . DSL Grails для функциональности Hibernate Criteria обеспечивает очень чистую и поддерживаемую кодовую базу. Вот несколько примеров:

Пример Критерии:

def avg = Log.createCriteria().get {
    projections {
        avg 'duration'
    }
    user {
        eq 'userName', 'user1'
    }
}
println("Average = ${avg}")

Примеры объектов домена:

class User {

    String userName
    String firstName
    String lastName

    static constraints = {
        userName nullable:false, maxSize:32
        firstName nullable:false, maxSize:50
        lastName nullable:false, maxSize:50
    }

}

class Host {

    String hostname

    static mapping = {
        version false
    }

    static constraints = {
        hostname nullable:false, maxSize:64
    }
}

class Log {

    Host host
    User user
    String method
    String logMessage
    Date dateCreated
    long duration

    static mapping = {
        autoTimestamp true  //Note: this will automatically update dateCreated and lastUpdate
        version false
    }

    static constraints = {
        host nullable:false
        user nullable:false
        method nullable:false, maxSize:50
        logMessage nullable:false, maxSize:255
        duration nullable:false
    }
}
2 голосов
/ 03 апреля 2011

С таким количеством записей, сколько у вас может быть для регистрации на пользователя или хост, я бы не использовал отношение hasMany.Ведение журналов, как правило, требует большого объема записи, и поддержание набора / списка журналов для каждого участника обходится дорого.

HQL - это, вероятно, ваш лучший выбор.Вы можете сделать его похожим на нативный SQL.

Берт Беквит (Burt Beckwith) представляет отличную презентацию, в которой рассказывается о некоторых показателях производительности в Grails с GORM, которые стоит потратить ваше время на просмотр: http://www.infoq.com/presentations/GORM-Performance

...