簡體   English   中英

表達式過濾器解析器

[英]Parser for Expression Filter

我有應用了表達式過濾器的表列。 是否有任何現有的解析器可以讓我解析此列? 該列可以包含簡單的條件,例如

PROPERTY = 'name' AND PROPERTY2 = 'something else'

或更高級的

(PROPERTY IN ('foo', 'bar') 
  AND (PROPERTY IN ('foo1', 'bar2') OR OTHER_PROPERTY IN ('etc'))

如果它返回表達式中的屬性列表和值(在 = 運算符的情況下)或所有值的列表(即使一個屬性在表達式中出現多次),這完全足夠了。 有這樣的解析器可用還是我必須自己寫?

我不知道您是如何開發項目的。 但是,如果您使用的是休眠模式,則可以使用條件查詢。 Cirteria查詢

你可以使用jOOQ 的 parser 鑒於此要求:

如果它返回表達式中的屬性列表和值(在 = 運算符的情況下)或所有值的列表(即使一個屬性在表達式中出現多次),這完全足夠了

你可以運行這段代碼:

Map<Field<?>, List<QueryPart>> result =
DSL.using(SQLDialect.DEFAULT)
   .parser()
   // Parse the SQL string to a jOOQ expression tree
   .parseCondition(
       """
       (PROPERTY IN ('foo', 'bar')
           AND (PROPERTY IN ('foo1', 'bar2') OR OTHER_PROPERTY IN ('etc')))
       """)
   // Traverse the jOOQ expression tree using Traversers and Collectors
   // You can also traverse the tree using imperative APIs, of course
   .$traverse(Traversers.collecting(
       Collectors.filtering(p -> p instanceof InList 
                              || p instanceof CompareCondition,
           Collectors.groupingBy(p ->
                 p instanceof InList<?> i
               ? i.$arg1()
               : p instanceof CompareCondition<?> c
               ? c.$arg1()
               : null,
               Collectors.mapping(p ->
                     p instanceof InList<?> i
                   ? i.$arg2()
                   : p instanceof CompareCondition<?> c
                   ? c.$arg2()
                   : null,
                   Collectors.toList()
               )
           )
       )
   ));
System.out.println(result);

它產生這個 output:

{PROPERTY=['foo', 'bar', 'foo1', 'bar2'], OTHER_PROPERTY=['etc']}

不確定這是否完全符合您的要求,但相應地調整代碼應該很簡單

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM