2012-11-05 12 views
6

Lambdaj (e alcune altre biblioteche simili) fornisce una funzione having, che mi permette di definire predicati in questo modo (ad esempio direttamente dalla pagina lambdaj Features):Esiste una libreria Java per la definizione dei predicati come stringhe SQL-like?

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

avevo abbastanza piace essere in grado di definire la mia Java oggetto predicato utilizzando una sintassi semplice stringa, "age > 30" - simile ad una clausola SQL where - così il filtro sopra diventa qualcosa di simile:

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

fa un tale libreria esiste, o chiunque può raccomandare alcuni blocchi di costruzione per la parte di query parsing Io co usarlo per costruirne uno io stesso? In realtà non mi interessa che tipo di predicato (hamcrest, guava, ecc.) Crei.

Dalla parte superiore della mia testa, posso pensare a un numero di cose che sarebbe fantastico poter supportare: uguaglianze e disuguaglianze, su tipi personalizzati e primitivi, e/o/non, parentesi, LIKE (per stringhe) , in(...), interpretazione dei nomi enum, proprietà delle proprietà.

Ecco un esempio di un predicato più complesso:

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

(Questo esempio presuppone che la classe il predicato viene applicato a (per esempio una classe SalesPerson) ha metodi getSalesCount(), getCountry(), e getCity(), così come getAttitude() (che restituisce un enum). Ha anche una proprietà getProduct che restituisce un tipo con metodo getName).

motivazione: disponiamo di un sistema client-server con più API di lingua (attualmente Java & C#); Sto cercando un modo indipendente dal linguaggio per un utente per specificare un predicato che filtra su un insieme di oggetti i cui contenuti esatti sono noti solo al processo del server (che è scritto in Java).

+1

Indagare sulla creazione di DSL in particolare interno nel tuo caso. –

+0

Questa discussione potrebbe aiutare http://stackoverflow.com/questions/5620985/is-there-any-good-dynamic-sql-builder-library-in-java –

+0

Sembra che tu stia cercando qualcosa come LINQ che non sembra esiste (ancora). Forse troverai qualcosa qui: http: //stackoverflow.com/questions/1217228/what-is-the-java-equivalent-for-linq –

risposta

2

Vorrei dare un'occhiata a MVEL. Esso supporta le espressioni del tipo:

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

usato una volta su un progetto per esprimere alcune regole di business di base da un client.

+0

Grazie! Ora che so che sto cercando un "linguaggio di espressione" ho trovato un sacco di altre cose su http://java-source.net/open-source/expression-languages ​​ – bacar

+0

Supporta anche le cosiddette proiezioni/pieghe e filtri che potrebbero essere utili nel tuo caso: 'familyMembers = (nome in (familyMembers negli utenti))' '($ in fooList se $ .name contiene 'foobie');' –

+0

Il collegamento è interrotto. – thee

0

Non so se tale libreria esiste già, ma è possibile utilizzare groovy per compilare/valutare tali espressioni al volo.