概述
最近在弄阿里云的sls日志服務(wù),該服務(wù)提供了一個(gè)搜索接口,可根據(jù)各種運(yùn)算、邏輯等表達(dá)式搜出想要的內(nèi)容。具體語法可見https://help.aliyun.com/document_detail/29060.html?spm=5176.doc29029.2.2.8PG8RA。
在開發(fā)中,我們需要用到該接口的查詢需求會不斷擴(kuò)增,可能一開始只用and,后面加了or和not,再后來又多了key/value pair、數(shù)值比較等等。如果把這些處理邏輯放在業(yè)務(wù)邏輯中,未免太過暴力,而且非常不方便維護(hù)和閱讀。尤其是當(dāng)出現(xiàn)了復(fù)雜的復(fù)合邏輯時(shí),比如:"a and b or (c and (d not e))",我們要先自己推算出具體的公式并顯示的寫在業(yè)務(wù)邏輯,顯然這是很不合理的。所以,我要把這類處理邏輯單獨(dú)抽離出來,查詢條件當(dāng)成一個(gè)個(gè)搜索的過濾條件Filter,再通過拼接類Assembler自動(dòng)拼接成我們想要的邏輯表達(dá)式。
設(shè)計(jì)單個(gè)過濾器
需要首先想清楚的是,整體的表達(dá)式是由一個(gè)個(gè)單獨(dú)的查詢語句(運(yùn)算表達(dá)式)組成的,而連接他們的是邏輯運(yùn)算(與或非)。所以我的思路是,先將所有單獨(dú)的運(yùn)算表達(dá)式創(chuàng)建出來,最后通過邏輯運(yùn)算將他們拼接在一起。
下