[英]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.