我想為我的系統構建一個查詢,外部系統可以根據條件使用該查詢進行配置。
在后端,我發現很容易有一個JSON子句樹,它將被遞歸計算。
[
"AND",
[
{
"operator": "eq",
"field": "section1.fieldabc",
"value": "value1"
},
[
"OR",
{
"operator": "lt",
"field": "section2.fieldxyz",
"value": 5000
},
{
"operator": "gt",
"field": "section2.fieldxyz",
"value": 1000
}
]
]
]
或者類似的東西(上面我把它描繪成一棵s-expression樹)
問題是,我希望它作為后端的JSON子句樹,但我不希望用戶需要編寫這樣的內容。如果我能創建一個類似JQL(Jira查詢語言)之類的查詢,那就太好了。但是我不想花太多的精力為轉換的語言制作一個完整的證明解析器。
有沒有標準化的方法來實現這一點?可能是一種標準化的查詢語言,使用庫(JS或Java)進行轉換。
從最終用戶的角度來看,我希望上面的查詢是這樣的
section1.fieldabc == value1 AND (section2.fieldxyz<5000 OR section2.fieldxyz>10000)
用TypeScript編寫了一個(相對)簡單的解析器,可以解析二進制運算符(具有正確的操作順序)和常量、處理括號、全局變量和簡單字段訪問:
可以立即運行的JS版本的代碼段
轉換為JSON時的輸出示例:
我一直使用帶有
type
字段的對象,盡管您仍然可以將binop
對象轉換為['AND', expr1, expr2]
之類的對象。而不是簡單地讓二進制操作總是在一個僅僅是a.b.c.etc
字符串的字段上,我的更高級一些。但仍可能增加限制,至少基礎工作已經存在。我處理這個問題是因為我喜歡寫這類東西。實際上,我建議使用Chandan的建議,即使用jQuery QueryBuilder或react-query-builder,以使它對您的用戶更加容易和友好。
如果你更傾向于使用SQL-like語法的“超級用戶”,我的代碼可能會有所幫助。不過,可能有很多更好的庫可以提供幫助,例如在報告語法錯誤或嘗試訪問non-existant變量/字段時,這些庫可能更健壯。再說一次,由于我的代碼只有大約150行(如果包括類型,則為200行),而且編寫得也不太奇怪,因此如果這更適合您的話,根據您的需要調整代碼應該不會太困難。