• 概述  

  最近在弄阿里云的sls日志服務(wù),該服務(wù)提供了一個搜索接口,可根據(jù)各種運算、邏輯等表達式搜出想要的內(nèi)容。具體語法可見https://help.aliyun.com/document_detail/29060.html?spm=5176.doc29029.2.2.8PG8RA。

  在開發(fā)中,我們需要用到該接口的查詢需求會不斷擴增,可能一開始只用and,后面加了or和not,再后來又多了key/value pair、數(shù)值比較等等。如果把這些處理邏輯放在業(yè)務(wù)邏輯中,未免太過暴力,而且非常不方便維護和閱讀。尤其是當(dāng)出現(xiàn)了復(fù)雜的復(fù)合邏輯時,比如:"a and b or (c and (d not e))",我們要先自己推算出具體的公式并顯示的寫在業(yè)務(wù)邏輯,顯然這是很不合理的。所以,我要把這類處理邏輯單獨抽離出來,查詢條件當(dāng)成一個個搜索的過濾條件Filter,再通過拼接類Assembler自動拼接成我們想要的邏輯表達式。

  • 設(shè)計單個過濾器

  需要首先想清楚的是,整體的表達式是由一個個單獨的查詢語句(運算表達式)組成的,而連接他們的是邏輯運算(與或非)。所以我的思路是,先將所有單獨的運算表達式創(chuàng)建出來,最后通過邏輯運算將他們拼接在一起。

  下