2012-11-05 16 views
6

Lambdaj (i kilka innych podobnych bibliotek) zapewnia having funkcję, która pozwala mi określić predykaty jak tak (przykład bezpośrednio ze strony lambdaj Features):Czy istnieje biblioteka Java do definiowania predykatów jako łańcuchów podobnych do SQL?

List<Person> oldFriends = 
    filter(having(on(Person.class).getAge(), greaterThan(30)), meAndMyFriends); 

ja bardzo lubię być w stanie określić mój Java orzecznik obiekt za pomocą prostego składni ciąg, "age > 30" - podobny do SQL gdzie klauzuli - tak filtr powyżej staje się czymś w rodzaju:

List<Person> oldFriends = 
    filter(having(Person.class, "age > 30"), meAndMyFriends); 

istnieje taka biblioteka, czy ktoś może polecić jakieś cegiełki dla zapytania parsowania strony i co użyjesz go do samodzielnego zbudowania? Nie mam nic przeciwko temu, jaki rodzaj orzeczenia (hamcrest, guava itp.) Tworzy.

Z góry mojej głowy mogę pomyśleć o wielu rzeczach, które wspaniale byłoby wspierać: równości i nierówności, o niestandardowych i pierwotnych typach, i/lub/nie, nawiasy, LIKE (dla ciągów znaków) , in(...), interpretacja nazw wyliczeniowych, właściwości właściwości.

Oto przykład bardziej złożonych predykatu:

"salesCount > 10 and (country='UK' or city='New York') 
and attitude not in (MENACING, RUDE) 
and product.name <> 'Widget' " 

(W tym przykładzie zakłada się, że klasa orzeczenie stosuje się (powiedzmy SalesPerson klasa) posiada metody getSalesCount() getCountry() i getCity(), a także getAttitude() (która zwraca element wyliczeniowy), a także właściwość getProduct, która zwraca typ z metodą getName).

Motywacja: mamy system klient-serwer, który ma wiele interfejsów API języka (obecnie Java & C#); Szukam agnostycznego języka dla użytkownika, aby określić predykat, który filtruje na zbiorze obiektów, których dokładna zawartość jest znana tylko procesowi serwera (który jest napisany w Javie).

+1

Dochodzenie w sprawie tworzenia DSL, szczególnie wewnętrznych w twoim przypadku. –

+0

Ten wątek może pomóc http://stackoverflow.com/questions/5620985/is-there-any-good-dynamic-sql-builder-library-in-java –

+0

Wygląda na to, że szukasz czegoś podobnego do LINQ, które nie wydaje się istnieje (jeszcze). Może znajdziesz coś tutaj: http: //stackoverflow.com/questions/1217228/what-is-the-java-equivalent-for-linq –

Odpowiedz

2

Chciałbym rzucić okiem na MVEL. Obsługuje wyrażeń takich jak:

(user.name == 'John Doe') && ((x * 2) - 1) > 20

używali go raz na projekt, aby wyrazić kilka podstawowych zasad biznesowych z klientem.

+0

Dzięki! Teraz, gdy wiem, że szukam "języka ekspresji", znalazłem kilka innych rzeczy na http://java-source.net/open-source/expression-languages ​​ – bacar

+0

Obsługuje również tzw. Projekcje/fałdy i filtrowanie, które mogą być przydatne w twoim przypadku: 'familyMembers = (nazwa w (familyMembers in users));' '($ in fooList jeśli $ .name zawiera 'foobie');' –

+0

Link jest uszkodzony. – thee

0

Nie wiem, czy taka biblioteka już istnieje, ale można użyć groovy do kompilacji/oceny takich wyrażeń w locie.

Powiązane problemy