Перевод sql-запросов интеллектуального анализа данных в эквиваленты Grails?

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

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

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

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 для подобных вещей?


person oligofren    schedule 03.04.2011    source источник


Ответы (2)


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

Во-вторых, я рекомендую вам ознакомиться с Критериями. Grails DSL для функциональности 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
    }
}
person Derek Slife    schedule 03.04.2011
comment
Хорошая мысль о критериях. Я не считаю, что они хорошо подходят моему мозгу лично, но некоторым людям они нравятся немного больше, чем HQL. Я пришел из SQL, поэтому я считаю, что эквивалентный HQL мне легче писать/читать/обслуживать. Вот для справки OP: Log.executeQuery("select avg(duration) from Log l join l.user u where u.firstName = :firstName", [firstName: 'user1']) - person Ted Naleid; 04.04.2011
comment
Внезапно в час ночи я наткнулся на Criterias в своей книге Grails в действии, и я думаю, что они идеально подходят для этого. Приятно видеть и хороший пример использования :) - person oligofren; 04.04.2011

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

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

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

person Ted Naleid    schedule 03.04.2011