Groovy 1.8 :: LINQ Applied

ОБНОВЛЕНИЕ 31.08.2011
Гийом Лафорж почти сделал это:
http://gaelyk.appspot.com/tutorial/app-engine-shortcuts#query

Похоже, он выполнение преобразования AST для снятия бита:

alias as Entity

. Классный материал, Groovy 1.8 + преобразование AST = запросы в стиле LINQ на JVM. Насколько я могу судить, решение GL требует дополнительной работы, чтобы реализовать все возможности запросов (например, подзапросы, присоединение с использованием синтаксиса (поля) и т.п.), но для его проекта Gaelyk, очевидно, в этом нет необходимости.

РЕДАКТИРОВАТЬ

В качестве обходного пути для достижения чистого синтаксиса LINQ я решил определить псевдонимы. Ничего особенного и устраняет серьезное препятствие, которое, вероятно, потребовало бы сложных преобразований AST для выполнения.

Итак, вместо:

from   c as Composite
join   t as Teams
...

я теперь определяю псевдонимы (примечание: необходимо выполнить приведение, чтобы получить автоматическое заполнение полей) :

def(Teams t,Composite c,Schools s) = [Teams.new(),Composite.new(),Schools.new()]

и используйте синтаксис карты для from, join и т. Д.

from    c:Composite
join    t:Teams
...

Чтобы решить проблему №2 (см. Исходный текст ниже), добавьте методы getProperty уровня экземпляра к каждому псевдониму pogo (чья область действия ограничена закрытием ORM, в котором это называется, приятно). Мы просто возвращаем строковое имя свойства при построении оператора sql.

[t,c,s].each{Object o-> o.metaClass.getProperty = { String k-> k } }

«Хороший» прогресс; -)

Теперь выяснить, что делать с «=», это сложно, поскольку свойство set имеет значение void . Возможно, придется использовать eq, neq, gt и т. Д., Но я бы предпочел буквальные символы, что делает их более близкими кчитаемость sql.

Если интересно, LINQ довольно много делает за кулисами. У Джона Скита (хвалите его имя) есть хороший ТАК-ответ: Как LINQ работает внутри?

ORIGINAL

Проверяли LINQ, очень впечатлены.

// LINQ example
var games =
    from t in Teams
    from g in t.Games
    where g.gameID = 212
    select new { g.gameDate,g.gameTime };


// Seeking Groovy Nirvana
latest { Integer teamID->
    from   c as Composite
    join   t as Teams
    join   s as Schools on ( schoolID = {
                     from   Teams
                     where  t.schoolID = s.schoolID } )

    where   t.teamID = "$teamID"
    select  c.location, c.gameType, s.schoolName
    group   c.gameID
    order   c.gameDate, c.gameTime
}

Предлагаемая версия Groovy компилируется нормально, и если я определю псевдонимы c, t, s с их соответствующими POGO, я получить строго типизированную автозаполнение IDE по полям, приятно. Однако нигде рядом с LINQ, где нет (видимых) определений переменных, кроме самого запроса, полностью автономных и строго типизированных, ничего себе.

Хорошо, можно ли это сделать в Groovy? Я думаю (надеюсь) да, но я зациклен на двух проблемах:

1) Как неявно заполнить переменную псевдонима без определения? В настоящее время я переопределяю asType () для String, поэтому в «from c as Composite» c будет приведен к Composite. Отлично, но IDE «думает», что в области закрытия undefined c является строкой и, следовательно, нет автозаполнения в полях POGO; - (

2) Поскольку №1 не решен, я определяю псевдонимы, как указано выше, поэтому Я могу получить автозаполнение. Хорошо, взломали (по сравнению с LINQ), но свое дело. Проблема здесь в том, что в "select c.location, c.gameType ..." я бы хотел, чтобы поля не оценивались, а просто возвращали "c.location" методу выбора ORM, а не null (что является его значение по умолчанию). getProperty () должен работать здесь, но мне нужно, чтобы он применялся только к полям pogo при вызове из области ORM (например, методы, специфичные для поля orm, такие как select, order, group и т. д.). Здесь немного потеряно, возможно, есть способ аннотировать методы orm или вызывать только "специальный" pogo getProperty через вызовы метода orm (который является делегатом закрытия в приведенном выше запросе нирваны).

Следует отметить, что я не собираюсь создавать всеобъемлющий LINQ для Groovy, но именно это подмножество LINQ я хотел бы увидеть.

8
задан Community 23 May 2017 в 12:16
поделиться