2014-10-21 6 views
5

मेरे पास स्प्रिंग फ्रेमवर्क ने आरईएसटी सेवाओं को बैक-एंड बनाया है और अब मुझे फ्रंट एंड से कुछ अनुरोधों में जटिल फ़िल्टर को संसाधित करने का एक तरीका ढूंढना होगा।jirutka/rsql-parser और QueryDSL

मैं बैक एंड के दौरान क्वेरी निर्माण करने के लिए QueryDsl (v3.4.2) ढांचे का उपयोग कर रहा हूं।

मुझे लगता है कि एक FIQL या RSQL पार्सर का उपयोग करना सबसे अच्छा तरीका है, इसलिए मैं अपने बैक-एंड प्रोजेक्ट में jirutka/rsql-parser को एकीकृत करने की कोशिश कर रहा हूं।

मैं इसके लिए बहुत नया हूं और QueryDsl भी हूं।

अब मैं इसलिए यहाँ संदेह में हूँ मदद के लिए मेरे अनुरोध है:
किसी को भी एकीकृत jirutka/rsql-पार्सर और इससे पहले कि एक आराम वसंत परियोजना में QueryDsl है? और कैसे?

Jirutka/rsql-पार्सर प्रलेखन केवल कहते हैं:

नोड्स, दर्शनीय हैं तो पार्स एएसटी पार (और यह SQL क्वेरी शायद में कनवर्ट करें) करने के लिए, आपके द्वारा दी RSQLVisitor इंटरफ़ेस को लागू कर सकते हैं या सरलीकृत NoArgRSQLVisitorAdapter।

और यह कैसे करना है पर निम्न उदाहरण है:

Node rootNode = new RSQLParser().parse("name==RSQL;version=ge=2.0"); 
rootNode.accept(yourShinyVisitor); 

बहुत आसान है, है ना लगता है?

तो मैं crated इस तरह अपने आगंतुक:

public class RsqlParserVisitor extends NoArgRSQLVisitorAdapter<BooleanExpression> { 

सभी तरीकों इंटरफेस मुझे करने के लिए आवश्यक लागू।

@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; 
} 

और

@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; 
} 

अब मैं अटक कर रहा हूँ:

यहाँ मैं दो उदाहरण जोड़ने

क) आदेश में एक QueryDsl BooleanExpression बनाने के लिए, मैं पता करने की जरूरत कक्षा मैं उदाहरण के लिए प्रसंस्करण कर रहा हूं:

QUser qUser = QUser.user; 
    BooleanExpression filter = qUser.firstName.eq("Bob"); 

या

PathBuilder<User> user = new PathBuilder<User>(User.class, "user"); 
    BooleanExpression filter = user.getString("firstName").eq("Bob"); 

ख) जब मैं अपने कोड का परीक्षण, यह केवल public BooleanExpression visit(OrNode arg0) विधि है, तो कुछ भी नहीं निष्पादित करता है। यह वहीं बंद हो जाता है।

उस पल में मैं ज्यादा कुछ नहीं कर सकता। अभी तक एक BooleanExpression नहीं बना सकता है, क्योंकि मुझे पहले कुछ तुलनानोड तरीकों से गुजरना है और फिर उन्हें "या" या "और" बूलियन अभिव्यक्ति के साथ शामिल होना चाहिए। सही?

यदि कम से कम मैं सभी नोड्स के माध्यम से जा सकता हूं, तो मैं कक्षा को पारित करने का एक तरीका ढूंढ सकता हूं, मैं इसके बारे में चिंतित नहीं हूं। लेकिन समझ में नहीं आता कि सभी नोड्स को कैसे पार किया जाए, और ऐसा करने में सक्षम नहीं हैं।

इसे ठीक करने के लिए कोई भी पॉइंटर्स, वास्तव में सराहना की जाएगी।

+0

आप कभी भी इस के लिए एक पूर्ण समाधान मिला? मुझे इसके बारे में सुनना अच्छा लगेगा। –

+0

मैंने अपना खुद का tweeking समाप्त हो गया ... और अब तक इतना अच्छा: यह काम कर रहा है। लेकिन हर समय और फिर मुझे काम नहीं करते समय चीजों को ठीक करने की ज़रूरत है; मुझे पता है कि यह सही नहीं है। यदि आपके पास विशिष्ट प्रश्न हैं तो मैं खुशी से मदद करूंगा। मुझे उम्मीद है कि कुछ समय जल्द ही मुझे कुछ खाली समय मिलेगा (हा हा) और यहां कुछ पॉइंटर्स डाल सकते हैं, लेकिन कुछ भी वादा नहीं कर सकते। :) – elysch

उत्तर

0

हमेशा पूछे जाने पर, प्रश्न पूछने के बाद (मुझे लगता है) प्रगति हुई।

सभी नोड्स को पार करने के लिए एक रास्ता मिला और QueryDsl PathBuilder<?> विज़िटर को ऑब्जेक्ट पास करने का एक तरीका मिला।

PathBuilder<?> QueryDsl द्वारा बनाई गई सभी QSomething कक्षाओं का मूल वर्ग है।

अब मैं फिर से बूलियनएक्सप्रेस बनाने के लिए एक रास्ता तलाश रहा हूं।

किसी भी मदद की सराहना की जाएगी।

अब मैं अपने सेवा में निम्नलिखित है:

@Override 
public Page<User> getUsers(Emisor pEmisor, int pPage, int pSize, Sort pSort, String pRSQLFilters) { 

    Pageable pageable = new PageRequest(pPage, pSize, pSort); 

    BooleanExpression filters = null; 

    Node queryTree; 
    try { 
     logger.debug("Parsing query: {}", pRSQLFilters); 
     queryTree = new RSQLParser().parse(pRSQLFilters); 

     RsqlParserVisitor<BooleanExpression, QUser> rsqlParserVisitor = new RsqlParserVisitor<BooleanExpression, QUser>(); 
     filters = queryTree.accept(rsqlParserVisitor, QUser.user); 

    } catch (TokenMgrError e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (RSQLParserException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


    Page<User> lista = userRepository.findAll(filtros, pageable); 

    return lista; 

}  

और यह आगंतुक में:

public class RsqlParserVisitor<BooleanExpression, A> implements RSQLVisitor<BooleanExpression, EntityPathBase<?>> { 
... 
    @Override 
    public BooleanExpression visit(OrNode node, EntityPathBase<?> param) { 
     // TODO Auto-generated method stub 

     String nombreTmp = "OrNode"; 
     printLogicalNode(nombreTmp, node, param); 

     return null; 
    } 

    @Override 
    public BooleanExpression visit(EqualNode node, EntityPathBase<?> param) { 
     // TODO Auto-generated method stub 

     String nombreTmp = "EqualNode"; 
     printComparisonNode(nombreTmp, node, param); 

     return null; 
    } 

... 

    public void printLogicalNode(String pNombreNodo, LogicalNode pNode, 
      EntityPathBase<?> pParam) { 
     logger.debug(pNombreNodo + ". node: " + pNode + ". param: " + pParam); 

     logger.debug("operator: " + pNode.getOperator().name()); 

     for (Node subNode : pNode) { 
      logger.debug(pNombreNodo + ". subNode: " + subNode); 
      subNode.accept(this, pParam); <=========== this was the key to be able to traverse every node 
     } 
    } 

    public void printComparisonNode(String pNombreNodo, ComparisonNode pNode, 
      EntityPathBase<?> pParam) { 
     logger.debug(pNombreNodo + ". node: " + pNode + ". param: " + pParam); 

     logger.debug("Selector: " + pNode.getSelector()); 
     logger.debug("operator: " + pNode.getOperator()); 

     for (String argTmp : pNode.getArguments()) { 
      logger.debug(pNombreNodo + ". argTmp: " + argTmp); 
     } 

    } 

} 
+0

हाय, मेरे पास एक साधारण ओपन-सोर्स प्रोजेक्ट है जो rsql-parser v2.x.x और querydsl-core v3.x.x को जोड़ता है, यह अभी भी प्रगति पर है। मैंने इसे अपने कार्य अनुभव से आरएसक्यूएल-पार्सर v1.x.x और querydsl संयोजन से लिया है। इस बार मैं इसे जिथूब में बेनकाब करना चाहता हूं, आप इसे यहां पा सकते हैं। https://github.com/vineey/rsql-querydsl वर्तमान में, मैं इस शाखा https://github.com/vineey/rsql-querydsl/tree/feature/filter-api – vine

+0

पर FYI करें काम कर रहा हूँ, मैं अक्टूबर 2015 के अंत में या उससे पहले इस पुस्तकालय को खत्म करने की योजना बना रहा हूं। – vine

+0

एफवाईआई, मुझे 1.0.0.RELEASE https://github.com/vineey/archelix-rsql/ – vine

संबंधित मुद्दे