Ho il framework Spring creato il back-end dei servizi REST e ora ho bisogno di trovare un modo per elaborare filtri complessi in alcune richieste dal front-end.jirutka/rsql-parser e QueryDSL
Utilizzo il framework QueryDsl (v3.4.2) per eseguire la costruzione di query su tutto il back-end.
Penso che usare un parser FIQL o RSQL sia l'approccio migliore, quindi sto cercando di integrare jirutka/rsql-parser nel mio progetto di back-end.
Sono molto nuovo ad esso e anche a QueryDsl.
Ora sono confusa: ecco la mia richiesta di aiuto:
Qualcuno ha integrato jirutka/rsql-parser e QueryDsl in un progetto di riposo primavera prima? e Come?
Jirutka documentazione/rsql-parser dice soltanto:
I nodi sono visitabili, in modo da attraversare l'AST analizzato (e convertirlo in query SQL forse), è possibile implementare l'interfaccia RSQLVisitor fornito o NoArgRSQLVisitorAdapter semplificato.
E ha il seguente esempio su come farlo:
Node rootNode = new RSQLParser().parse("name==RSQL;version=ge=2.0");
rootNode.accept(yourShinyVisitor);
sembra abbastanza facile, giusto?
Così ho ingabbiati mio visitatore in questo modo:
public class RsqlParserVisitor extends NoArgRSQLVisitorAdapter<BooleanExpression> {
Implementato tutti i metodi le interfacce necessarie me.
Qui aggiungo due esempi:
@Override
public BooleanExpression visit(AndNode arg0) {
// TODO Auto-generated method stub
String methodNameTmp = "AndNode";
logger.debug(methodNameTmp + ". arg0: " + arg0);
logger.debug("operator: " + arg0.getOperator().name());
for (Node node : arg0) {
logger.debug(methodNameTmpp + ". node: " + node);
}
return null; //DO SOMETHING TO CREATE A BooleanExpression;
}
e
@Override
public BooleanExpression visit(EqualNode arg0) {
// TODO Auto-generated method stub
String methodNameTmp = "EqualNode";
logger.debug(methodNameTmp + ". arg0: " + arg0);
logger.debug("operator: " + arg0.getOperator());
for (String arg: arg0.getArguments()) {
logger.debug(methodNameTmp + ". arg: " + arg);
}
return null; //DO SOMETHING TO CREATE A BooleanExpression;
}
Ora mi sono bloccato:
a) Al fine di creare un QueryDsl espressione booleana, ho bisogno di sapere il classe che sto elaborando ad esempio:
QUser qUser = QUser.user;
BooleanExpression filter = qUser.firstName.eq("Bob");
o
PathBuilder<User> user = new PathBuilder<User>(User.class, "user");
BooleanExpression filter = user.getString("firstName").eq("Bob");
b) quando verifico il mio codice, esegue solo il public BooleanExpression visit(OrNode arg0)
metodo, poi più nulla. Si ferma proprio lì.
In quel momento non posso fare molto. Non è ancora possibile creare un'espressione booleana, poiché prima devo passare attraverso alcuni metodi ComparisonNode e quindi unirmi a un'espressione booleana "or" o "e". Destra?
Se almeno potessi passare attraverso tutti i nodi, allora potrei trovare un modo per superare la classe, non sono preoccupato. Ma non capisco come attraversare tutti i nodi, e non sono stato in grado di farlo.
Qualsiasi suggerimento per risolvere questo problema, sarà davvero apprezzato.
Hai mai trovare una soluzione completa per questo? Mi piacerebbe saperlo. –
Ho finito per twittare il mio ... e finora tutto bene: funziona. Ma ogni tanto ho bisogno di aggiustare le cose quando non funziona; So che non è perfetto. Sarei lieto di aiutarti se hai domande specifiche. Spero presto di trovare un po 'di tempo libero (ha ha) e di mettere qui alcuni suggerimenti, ma non posso promettere nulla. :) – elysch