Parser for Expression Filter
I have table column with expression filter applied. Is there any existing parser that would allow me to parse this column? the column can contain simple conditions such as
PROPERTY = 'name' AND PROPERTY2 = 'something else'
or more advanced like
(PROPERTY IN ('foo', 'bar')
AND (PROPERTY IN ('foo1', 'bar2') OR OTHER_PROPERTY IN ('etc'))
It would totally suffice if it would return list of properties in expression and eit开发者_StackOverflow社区her value (in case of = operator) or list of all values (even if one property appears more than once in expression). Is there such parser available or do I have to write it myself?
You could use jOOQ's parser. Given this requirement:
It would totally suffice if it would return list of properties in expression and either value (in case of = operator) or list of all values (even if one property appears more than once in expression)
You could run this piece of code:
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);
It produces this output:
{PROPERTY=['foo', 'bar', 'foo1', 'bar2'], OTHER_PROPERTY=['etc']}
Not sure if this exactly matches your requirements, but it should be straightforward to tweak the code accordingly
Disclaimer: I work for the company behind jOOQ
I don't know how you are developing your project. But if your are using hibernate you can use criteria queries. Cirteria queries
精彩评论