Groovy 1.8 :: LINQ Angewandt

8

UPDATE 8/31/2011
Guillaume Laforge hat es fast geschafft:
Ссылка

Sieht so aus, als würde er eine AST-Transformation machen, um das zu ziehen:

%Vor%

bit. Coole Sachen, Groovy 1.8 + AST transform = LINQ-artige Abfragen auf der JVM. Die Lösung von GL benötigt, soweit ich sehen kann, mehr Arbeit, um vollständige Abfragemöglichkeiten (wie Unterabfragen, Join-Verwendung mit (Feld-) Syntax und dergleichen) zu erhalten, aber für sein Gaelyk-Projekt offensichtlich nicht notwendig.

BEARBEITEN

Als Workaround zum Erreichen der reinen LINQ-Syntax habe ich beschlossen, die Aliase zu definieren. Keine große Sache, und beseitigt eine große Hürde, die wahrscheinlich komplexe AST-Transformationen erfordern würde.

Also statt:

%Vor%

Ich definiere jetzt die Aliase (Hinweis: Sie müssen eine Umwandlung durchführen, um die Felder automatisch zu vervollständigen):

%Vor%

und verwenden Sie die Kartensyntax für from, join, etc.

%Vor%

Um Problem Nr. 2 zu lösen (siehe Original unten), fügen Sie getProperty-Methoden auf Instanzebene zu jedem Pogo-Alias ​​hinzu (dessen Umfang auf den ORM-Abschluss beschränkt ist, in dem er aufgerufen wird, nice). Wir geben nur den String-Eigenschaftsnamen zurück, während wir eine SQL-Anweisung erstellen.

%Vor%

"guten" Fortschritt machen; -)

Um herauszufinden, was mit "=" zu tun ist, ist das schwierig, da die Eigenschaft set leer ist. Müssen mit eq, neq, gt etc. gehen, aber würden die Literalsymbole wirklich vorziehen, sorgt für näher zu-sql Lesbarkeit.

Bei Interesse macht LINQ einiges hinter den Kulissen. Jon Skeet (loben Sie seinen Namen) hat eine schöne Antwort: Wie funktioniert LINQ intern?

ORIGINAL

Ich habe LINQ sehr beeindruckt.

%Vor%

Die vorgeschlagene Groovy-Version kompiliert gut und wenn ich die Aliase c, t, s mit ihrem entsprechenden POGO definiere, bekomme ich stark typisierte IDE-Auocomplete auf Felder, nett. Allerdings nirgendwo in der Nähe von LINQ, wo es keine (sichtbaren) Variablen-Definitionen gibt, die anders sind als die Abfrage selbst, völlig unabhängig und stark typisiert, wow.

OK, kann es in Groovy gemacht werden? Ich denke (hoffe) ja, bin aber auf 2 Fragen aufgelegt:

1) Wie implizit Popup-Alias-Variable ohne def'ing? Momentan überschreibe ich asType () in String, also in "from c as Composite", c wird in Composite umgewandelt. Großartig, aber die IDE "denkt", dass im Closing-Bereich undefined c eine Zeichenkette ist und somit keine Autovervollständigung auf POGO-Feldern; - (

2) Da # 1 nicht gelöst ist, definiere ich die Aliase wie oben beschrieben, damit ich automatisch vervollständigen kann. Fein, gehackt (im Vergleich zu LINQ), tut aber den Trick. Das Problem hier ist, dass ich in "c.location, c.gameType auswählen ..." möchte, dass die Felder nicht ausgewertet werden, sondern einfach "c.location" an die ORM select-Methode und nicht null zurückgeben (was das ist Standardwert). getProperty () sollte hier funktionieren, aber ich brauche es nur auf Pogo-Felder anzuwenden, wenn es aus dem ORM-Bereich aufgerufen wird (z. B. orm-Feld-spezifische Methoden wie Auswahl, Reihenfolge, Gruppe usw.). Bit verloren dort, vielleicht gibt es eine Möglichkeit, orm-Methoden zu kommentieren, oder rufen Sie nur "spezielle" pogo getProperty über Orm-Methodenaufrufe auf (was der Delegat des Abschlusses in der obigen Nirvana-Abfrage ist).

Ich sollte darauf hinweisen, dass ich keine umfassende LINQ für Groovy erstellen möchte, aber diese eine bestimmte Teilmenge von LINQ würde ich gerne sehen.

    
virtualeyes 06.06.2011, 13:53
quelle

1 Antwort

0

Einer der Hauptgründe für Guillaume, eine AST-Transformation zu verwenden, ist das Problem mit "=". Selbst wenn Sie == für den Vergleich verwenden, wie es normalerweise in Groovy gemacht wird, können Sie aus der compareTo-Methode, die dafür aufgerufen wird, keinen Unterschied zwischen ==,! =, & Lt; =, & gt; =, & lt ;, & gt machen . In späteren Versionen von Groovy gibt es dafür zwei mögliche Wege. Einer ist es, für jeden dieser Vergleiche eine andere Methode zu verwenden, der andere ist, einen minimalen AST zu speichern, auf den Sie zur Laufzeit zugreifen können. Dies geht in Richtung C # und ist ein ziemlich mächtiges Werkzeug. Das Problem besteht eher darin, dies effizient zu tun.

    
blackdrag 05.10.2011 12:51
quelle

Tags und Links