I have a Spring framework created by the back-end of REST services, and now I need to find a way to handle complex filters in some front-end requests.
I use the QueryDsl structure (v3.4.2) to create queries across all internal content.
I think using a FIQL or RSQL parser is the best approach, so I'm trying to integrate jirutka / rsql-parser into my back-end project.
I am very familiar with this, as well as QueryDsl.
Now I'm confused, so here is my request for help:
Has anyone integrated jirutka / rsql-parser and QueryDsl in Spring's vacation project before? and how?
The Jirutka / rsql-parser documentation only says:
Nodes are available for visiting, therefore, to go through the analyzed AST (and convert it to a SQL query, perhaps), you can implement the provided RSQLVisitor interface or the simplified NoArgRSQLVisitor adapter.
And has the following example on how to do this:
Node rootNode = new RSQLParser().parse("name==RSQL;version=ge=2.0"); rootNode.accept(yourShinyVisitor);
Seems pretty easy, right?
So, I broke my visitor like this:
public class RsqlParserVisitor extends NoArgRSQLVisitorAdapter<BooleanExpression> {
All methods with which I need interfaces are implemented.
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) To create a BooleanExpression QueryDsl, 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 check my code, it only executes the public BooleanExpression visit(OrNode arg0) , and then nothing. He stops right there.
At this moment I canβt do much. So far, I have not been able to create a BooleanExpression, since I need to go through some ComparisonNode methods first and then join them using the expressions "either" or "and" boolean. Right?
If I could go through all the nodes, then I managed to find a way to pass the class, I'm not worried about that. But do not understand how to get through all the nodes and could not do it.
Any pointers to fix this would be really appreciated.