嵌套規(guī)則

規(guī)則嵌套原型

image.png

關(guān)系運(yùn)算符

and or not


image.png

運(yùn)算符

大于 小于 大于或者等于 小于或者等于 match in 。拱礁。。

工具

JsonParser || jsonPath

格式定義

{
    "relation":"and",
    "terms":[
        {
            "field":"severity",
            "operator":"gt",
                        "type":"int",
            "value":"1"
        },
        {
            "field":"alert_class",
            "operator":"range",
                        "type":"int",
            "value":"[1,3]"
        }
    ],
    "childNode": {
        "relation":"or",
        "terms":[
            {
                "field":"alert.pin",
                "operator":"eq",
                                 "type":"string",
                "value":"wangjinsong-1"
            },
            {
                "field":"alert.pin",
                "operator":"eq",
                                "type":"string",
                "value":"wangjinsong-2"
            }
        ],
        "childNode":{
        }
    }
}

code

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONPath;
import com.jayway.jsonpath.JsonPath;

import java.util.List;

public class Main {

    public static void main(String[] args) {
        String info = "{\"relation\":\"and\",\"terms\":[{\"field\":\"severity\",\"operator\":\"gt\",\"type\":\"int\",\"value\":\"1\"},{\"field\":\"alert_class\",\"operator\":\"range\",\"type\":\"int\",\"value\":\"1\"}],\"ruleTree\":{\"relation\":\"or\",\"terms\":[{\"field\":\"alert.pin1\",\"operator\":\"eq\",\"type\":\"string\",\"value\":\"wangjinsong-1\"},{\"field\":\"alert.pin2\",\"operator\":\"eq\",\"type\":\"string\",\"value\":\"wangjinsong-2\"}],\"ruleTree\":{\"relation\":\"and\",\"terms\":[{\"field\":\"alert.pin3\",\"operator\":\"eq\",\"type\":\"string\",\"value\":\"wangjinsong-3\"},{\"field\":\"alert.pin4\",\"operator\":\"eq\",\"type\":\"string\",\"value\":\"wangjinsong-4\"}]}}}";
        String log = "{\"severity\":1,\"alert\":{\"pin\":\"wangjinsong-11\",\"pin1\":\"wangjinsong-11\",\"pin2\":\"wangjinsong-22\",\"pin3\":\"wangjinsong-3\",\"pin4\":\"wangjinsong-14\"},\"alert_class\":1}";
        RuleTree ruleTree = JSON.parseObject(info, RuleTree.class);
        boolean ret = exec(ruleTree, log);
        System.err.println("result is " + ret);
    }

    private static boolean exec(RuleTree ruleTree, String log) {
        if (ruleTree != null) {
            RuleTree childRuleTree = ruleTree.getRuleTree();
            String relation = ruleTree.getRelation();
            List<Term> terms = ruleTree.getTerms();
            boolean execRet = exec(childRuleTree, log);
            boolean execTermRet = execTerms(relation, terms, log);
            if ("and".equals(relation)) {
                return execTermRet && execRet;
            } else {
                return execTermRet || execRet;
            }
        }
        return false;
    }

    private static boolean execTerms(String relation, List<Term> terms, String log) {
        if (terms != null) {
            for (Term term : terms) {
                String filed = term.getField();
                String ret = JsonPath.read(log, "$." + filed).toString();
                String operator = term.getOperator();
                String type = term.getType();
                String value = term.getValue();
                System.err.println(relation + ">>>" + filed + ">>>>" + value + ">>>>" + ret);
                if ("or".equals(relation)) {
                    if (ret != null && ret.equals(value)) {
                        return true;
                    }
                } else if ("and".equals(relation)) {
                    if (ret == null || !ret.equals(value)) {
                         return false;
                     }
                }
            }
        }
        if ("or".equals(relation)) {
            return false;
        } else if ("and".equals(relation)) {
            return true;
        } else {
            return false;
        }
    }
}

class RuleTree {
    private String relation;
    private List<Term> terms;
    private RuleTree ruleTree;

    public void setRelation(String relation) {
        this.relation = relation;
    }

    public void setRuleTree(RuleTree ruleTree) {
        this.ruleTree = ruleTree;
    }

    public void setTerms(List<Term> terms) {
        this.terms = terms;
    }

    public List<Term> getTerms() {
        return terms;
    }

    public RuleTree getRuleTree() {
        return ruleTree;
    }

    public String getRelation() {
        return relation;
    }
}

class Term {
    private String field;
    private String operator;
    private String type;
    private String value;

    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
    }

    public String getOperator() {
        return operator;
    }

    public void setOperator(String operator) {
        this.operator = operator;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末隧期,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仆潮,更是在濱河造成了極大的恐慌,老刑警劉巖拾并,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗅义,死亡現(xiàn)場離奇詭異,居然都是意外死亡之碗,警方通過查閱死者的電腦和手機(jī)季希,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門式塌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人峰尝,你說我怎么就攤上這事∨晌埽” “怎么了链沼?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缆八。 經(jīng)常有香客問我疾捍,道長,這世上最難降的妖魔是什么奖恰? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任瑟啃,我火速辦了婚禮揩尸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘错负。我一直安慰自己勇边,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布油航。 她就那樣靜靜地躺著谊囚,像睡著了一般执赡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沙合,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機(jī)與錄音谨敛,去河邊找鬼。 笑死脸狸,一個(gè)胖子當(dāng)著我的面吹牛藐俺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卿啡,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼菱父,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了揭鳞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤称开,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鳖轰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焰轻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昆雀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辱志。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖狞膘,靈堂內(nèi)的尸體忽然破棺而出揩懒,到底是詐尸還是另有隱情挽封,我是刑警寧澤已球,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響智亮,放射性物質(zhì)發(fā)生泄漏忆某。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一阔蛉、第九天 我趴在偏房一處隱蔽的房頂上張望弃舒。 院中可真熱鬧,春花似錦馍忽、人聲如沸遭笋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稳摄。三九已至,卻和暖如春仗阅,著一層夾襖步出監(jiān)牢的瞬間减噪,已是汗流浹背筹裕。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扎运,地道東北人豪治。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓烦衣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親衅澈。 傳聞我的和親對象是個(gè)殘疾皇子今布,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理傅蹂,服務(wù)發(fā)現(xiàn)份蝴,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,095評論 0 3
  • #前端基礎(chǔ) # ## JavaScript基礎(chǔ) ## ###渲染機(jī)制與變量 ### script代碼為什么放到bo...
    hmg閱讀 235評論 1 1
  • HTML 5 HTML5概述 因特網(wǎng)上的信息是以網(wǎng)頁的形式展示給用戶的,因此網(wǎng)頁是網(wǎng)絡(luò)信息傳遞的載體撒穷。網(wǎng)頁文件是用...
    阿啊阿吖丁閱讀 3,828評論 0 0
  • 久違的晴天端礼,家長會(huì)蛤奥。 家長大會(huì)開好到教室時(shí)蟀伸,離放學(xué)已經(jīng)沒多少時(shí)間了啊掏。班主任說已經(jīng)安排了三個(gè)家長分享經(jīng)驗(yàn)迟蜜。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,493評論 16 22