I have Spring framework created REST services back-end and now I need to find a way to process complex filters in some requests from the front-end.
I'm using QueryDsl (v3.4.2) framework to do queries construction throughout the back-end.
I think using a FIQL or RSQL parser is the best approach, so I'm trying to integrate jirutka/rsql-parser to my back-end project.
I'm very new to it and also to QueryDsl.
Now I'm confused so here is my request for help:
Has anybody integrated jirutka/rsql-parser and QueryDsl in a rest spring project before? and How?
Jirutka/rsql-parser documentation only says:
Nodes are visitable, so to traverse the parsed AST (and convert it to SQL query maybe), you can implement the provided RSQLVisitor interface or simplified NoArgRSQLVisitorAdapter.
And has the following example on how to do it:
Node rootNode = new RSQLParser().parse("name==RSQL;version=ge=2.0");
rootNode.accept(yourShinyVisitor);
Seems pretty easy, right?
So I crated my visitor like this:
public class RsqlParserVisitor extends NoArgRSQLVisitorAdapter<BooleanExpression> {
Implemented all the methods the interfaces required me to.
Here I add two examples:
@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;
}
and
@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;
}
Now I'm stuck:
a) In order to create a QueryDsl BooleanExpression, I need to know the class I'm processing for example:
QUser qUser = QUser.user;
BooleanExpression filter = qUser.firstName.eq("Bob");
or
PathBuilder<User> user = new PathBuilder<User>(User.class, "user");
BooleanExpression filter = user.getString("firstName").eq("Bob");
b) When I test my code, it only executes the public BooleanExpression visit(OrNode arg0)
method, then nothing. It stops right there.
At that moment I can't do much. Can't create a BooleanExpression yet, since I need to go through some ComparisonNode methods first and then join them with an "or" or "and" boolean expression. Right?
If at least I could go through all the nodes, then I could manage to find a way to pass the class, I'm not worried about it. But don't understand how to traverse all the nodes, and haven't been able to do it.
Any pointers to fix this, will be really appreciated.