Mam problemy z utworzeniem SQL DSL dla Scala. DSL jest rozszerzeniem do Querydsl, która jest popularną warstwą abstrakcji zapytania dla Javy.SQL DSL dla Scala
walczę teraz z bardzo prostych wyrażeń jak na poniższym
user.firstName == "Bob" || user.firstName == "Ann"
Jak Querydsl obsługuje już model ekspresji, który może być używany tutaj postanowiłem zapewnić konwersje z Proxy sprzeciwia się Querydsl wyrażeń. W celu korzystania z serwerów proxy utworzyć instancję jak ten
import com.mysema.query.alias.Alias._
var user = alias(classOf[User])
z następującymi niejawnych konwersji można przekonwertować przypadki proxy i proxy łańcuchy połączeń nieruchomość do Querydsl wyrażeń
import com.mysema.query.alias.Alias._
import com.mysema.query.types.expr._
import com.mysema.query.types.path._
object Conversions {
def not(b: EBoolean): EBoolean = b.not()
implicit def booleanPath(b: Boolean): PBoolean = $(b);
implicit def stringPath(s: String): PString = $(s);
implicit def datePath(d: java.sql.Date): PDate[java.sql.Date] = $(d);
implicit def dateTimePath(d: java.util.Date): PDateTime[java.util.Date] = $(d);
implicit def timePath(t: java.sql.Time): PTime[java.sql.Time] = $(t);
implicit def comparablePath(c: Comparable[_]): PComparable[_] = $(c);
implicit def simplePath(s: Object): PSimple[_] = $(s);
}
Teraz mogę zbudować wyrażenia jak to
import com.mysema.query.alias.Alias._
import com.mysema.query.scala.Conversions._
var user = alias(classOf[User])
var predicate = (user.firstName like "Bob") or (user.firstName like "Ann")
Mam problem z następującym problemem.
eq
i ne
są już dostępne jako metod w Scala, więc konwersje nie są wyzwalane, gdy są one wykorzystywane
Problem ten można uogólnić jak poniżej. Podczas używania nazw metod, które są już dostępne w typach Scala, takich jak eq, ne, startsWith itp., Należy użyć pewnego rodzaju escaping, aby wyzwolić niejawne konwersje.
Zastanawiam następujące
UPPERCASE
var predicate = (user.firstName LIKE "Bob") OR (user.firstName LIKE "Ann")
to jest na przykład w Circumflex ORM podejście, bardzo potężny framework ORM dla Scala z podobnym DSL ma. Ale takie podejście byłoby niespójne ze słowami kluczowymi zapytania (select, from, where itp.), Które są pisane małymi literami w Querydsl.
Niektóre prefiks
var predicate = (user.firstName :like "Bob") :or (user.firstName :like "Ann")
Kontekst użycia kwantyfikatorów jest coś takiego
var user = alias(classOf[User])
query().from(user)
.where(
(user.firstName like "Bob") or (user.firstName like "Ann"))
.orderBy(user.firstName asc)
.list(user);
Czy widzisz lepsze opcje lub inne podejście do budowy SQL DSL dla Scala?
Więc pytanie w zasadzie sprowadza się do dwóch przypadków
Czy jest możliwe aby wywołać niejawna konwersja typu przy użyciu metody, która istnieje w super klasy (np
eq
)jeśli to nie jest możliwe, jaka byłaby najbardziej scalaesowa składnia do zastosowania dla metod takich jak
eq
,ne
.
EDIT
Mamy wsparcie Scala w Querydsl pracy za pomocą wystąpień alias i składni ucieczki oparciu $ -prefix. Oto blog na temat wyników: http://blog.mysema.com/2010/09/querying-with-scala.html
Więc pytanie w zasadzie sprowadza się do dwóch przypadków a) Czy jest możliwe wyzwolenie niejawnej konwersji typu, gdy używa się metody, która istnieje w super klasie (np. 'Eq') i b) Jeśli nie jest możliwe, co by było być najbardziej scalaeskową składnią do użycia w takich metodach jak 'eq',' ne'. Czy rozumiem poprawnie? – ponzao
@ponzo, czytasz mój umysł! Wziąłem wolność, aby zakończyć moje pytanie z waszym "sprowadzonym". –
Jeśli nie budujesz tego dla samej rzeczy, sprawdź ScalaQuery, bezpieczny dla bazy danych interfejs API zapytania dla Scala: http://github.com/szeiger/scala-query –