Posiadam frameworka REST usługi Spring framework back-end i teraz muszę znaleźć sposób na przetwarzanie złożonych filtrów w niektórych żądaniach z poziomu front-end.jirutka/rsql-parser i QueryDSL
Korzystam z frameworka QueryDsl (v3.4.2) do konstruowania zapytań w całym back-end.
Myślę, że najlepszym rozwiązaniem jest użycie parsera FIQL lub RSQL, więc próbuję zintegrować jirutka/rsql-parser z moim projektem back-end.
Jestem bardzo nowy, a także do QueryDsl.
Teraz jestem zdezorientowany więc tutaj jest moja prośba o pomoc:
czy ktoś zintegrowany jirutka/rsql-parser i QueryDsl w spoczynku projektu wiosną przed? i Jak?
Jirutka dokumentacja/rsql-parser tylko mówi:
Węzły są visitable, więc przemierzać analizowany AST (i przekształcić ją w zapytania SQL może), można zaimplementować dostarczonego interfejs RSQLVisitor lub uproszczony NoArgRSQLVisitorAdapter.
i ma następujący przykład o tym, jak to zrobić:
Node rootNode = new RSQLParser().parse("name==RSQL;version=ge=2.0");
rootNode.accept(yourShinyVisitor);
wydaje się dość proste, prawda?
Więc crated mój gość tak:
public class RsqlParserVisitor extends NoArgRSQLVisitorAdapter<BooleanExpression> {
Zaimplementowane wszystkie metody interfejsy wymagane do mnie.
Tu dodam dwa przykłady:
@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;
}
i
@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;
}
Teraz utknąłem:
a) W celu stworzenia QueryDsl BooleanExpression, muszę wiedzieć klasa przetwarzam na przykład:
QUser qUser = QUser.user;
BooleanExpression filter = qUser.firstName.eq("Bob");
lub
PathBuilder<User> user = new PathBuilder<User>(User.class, "user");
BooleanExpression filter = user.getString("firstName").eq("Bob");
b) Kiedy przetestować mojego kodu, to tylko wykonuje public BooleanExpression visit(OrNode arg0)
metoda, nic. Zatrzymuje się właśnie tam.
W tej chwili nie mogę wiele zrobić. Nie można jeszcze utworzyć BooleanExpression, ponieważ najpierw muszę przejść przez niektóre metody ComparisonNode, a następnie połączyć je z wyrażeniem logicznym "lub" lub "i". Dobrze?
Gdybym przynajmniej mógł przejść przez wszystkie węzły, mógłbym znaleźć sposób na przekazanie klasy, nie martwię się tym. Ale nie rozumiem, jak przejść przez wszystkie węzły i nie były w stanie tego zrobić.
Wszelkie wskazówki do rozwiązania tego problemu zostaną docenione.
Czy kiedykolwiek znaleźć kompletne rozwiązanie dla tego? Chciałbym o tym usłyszeć. –
Skończyłem na wyszukiwaniu własnych ... i do tej pory tak dobrze: to działa. Ale od czasu do czasu muszę naprawiać rzeczy, gdy nie działają; Wiem, że to nie jest doskonałe. Z chęcią pomogę, jeśli masz konkretne pytania. Mam nadzieję, że niedługo znajdę trochę wolnego czasu (ha ha) i mogę tu podać kilka wskazówek, ale nie mogę niczego obiecać. :) – elysch