七 hugegraph源代碼 條件查詢QueryCondtion

基本框架

  • hugegraph 提供queryCondition對(duì)象,用戶可以指定節(jié)點(diǎn)屬性,屬性的條件蝗砾,比如 name=‘A’ AND age >10
  • 存儲(chǔ)引擎負(fù)責(zé)將一個(gè) queryConditon對(duì)象翻譯成具體 的查詢語(yǔ)句,比如sql
  • 根據(jù)query的meta data 處理 分頁(yè), 排序等問(wèn)題。

學(xué)習(xí)他的建模思想

對(duì)于同一個(gè)功能,不同水平的程序員寫出來(lái)的代碼是完全不一樣的。
在以往的編碼中,我寫嘗試過(guò)使用面向?qū)ο蟮恼Z(yǔ)言,完成模糊條件建模南誊。

當(dāng)時(shí)我的需求是這樣的橄务,我給客戶提供一個(gè) 靈活的 api迫肖, api里面有 n個(gè)屬性玻粪。
用戶可以指定屬性的查詢條件, 我的實(shí)現(xiàn)很簡(jiǎn)單很簡(jiǎn)單

public class PropertyCondition
{
    private String property;
    private CompareOp.CompareType comparator;
    private Object value;

    public PropertyCondition copy()
    {
        return new PropertyCondition(this.property, this.comparator, this.value);
    }
}

存在的問(wèn)題是:

  • 沒有對(duì)query的建模结窘,一個(gè)query 通常是 對(duì)condtion的集合很洋,還有metadata,比如分頁(yè)隧枫,排序
  • 在需要多個(gè)condition時(shí)候喉磁,只能是用list來(lái)hold,且無(wú)法做 and or 等邏輯關(guān)系官脓。
  • 無(wú)法方便的創(chuàng)建和復(fù)用對(duì)象协怒,比如 我創(chuàng)建一個(gè) new PropertyCondition("age",LGT, 10), 這樣的語(yǔ)句將充斥者整個(gè)代碼庫(kù),更好的方法是復(fù)用 靜態(tài)方法而不是新建對(duì)象卑笨。

學(xué)習(xí) huge graph的模型

看完hugegraph的模型孕暇,我以后再實(shí)現(xiàn)condition 的時(shí)候可能會(huì)借鑒很多他的想法。

類關(guān)系如下:

  • QUery對(duì)象赤兴,為基類妖滔, 包含 對(duì)一個(gè)查詢的描述。
  • IDQUery 繼承 query桶良,描述對(duì)于指定ID查詢
  • ConditionQuery, 繼承query座舍,描述基于條件的查詢, 包含了一個(gè) Set<Condition>
  • Condition對(duì)象是對(duì)于各種模糊條件的抽象艺普,下面仔細(xì)講解簸州。
  • 還有一個(gè)flattenCondition對(duì)象,主要是對(duì) In歧譬,NotIn 這樣的條件進(jìn)行 flatten岸浑,配合者 Condition對(duì)象使用。

來(lái)看看Condition對(duì)象是如何實(shí)現(xiàn)的瑰步。

首先是對(duì)關(guān)系類型的建模:

public enum RelationType implements BiPredicate<Object, Object> {

        EQ("==", (v1, v2) -> {return equals(v1, v2); }),
        GT(">", (v1, v2) -> { return compare(v1, v2) > 0; }),
        GTE(">=", (v1, v2) -> { return compare(v1, v2) >= 0; }),
        LT("<", (v1, v2) -> { return compare(v1, v2) < 0; }),
        LTE("<=", (v1, v2) -> { return compare(v1, v2) <= 0; }),
        NEQ("!=", (v1, v2) -> { return compare(v1, v2) != 0; }),
        IN("in", (v1, v2) -> {
            return ((Collection<?>) v2).contains(v1);
        }),
        NOT_IN("notin", (v1, v2) -> {
            return !((Collection<?>) v2).contains(v1);
        }),

利用了java 的函數(shù)功能矢洲,每個(gè)運(yùn)算符是一個(gè)可以 自我test的對(duì)象,
比如EQ.test("A","B"), 一看這代碼就寫的特別專業(yè)缩焦,運(yùn)用lambada表達(dá)是也恰到好處读虏。
另外责静,內(nèi)置了大量的靜態(tài)方法 生成想要的condition對(duì)象。

public static Relation eq(Id key, Object value) {
        return new UserpropRelation(key, RelationType.EQ, value);
    }

    public static Relation gt(Id key, Object value) {
        return new UserpropRelation(key, RelationType.GT, value);
    }

    public static Relation gte(Id key, Object value) {
        return new UserpropRelation(key, RelationType.GTE, value);
    }

    public static Relation lt(Id key, Object value) {
        return new UserpropRelation(key, RelationType.LT, value);
    }

    public static Relation lte(Id key, Object value) {
        return new UserpropRelation(key, RelationType.LTE, value);
    }

    public static Relation neq(Id key, Object value) {
        return new UserpropRelation(key, RelationType.NEQ, value);
    }

在使用condition時(shí)候盖桥,使用 Condition.lt("name","3") 灾螃,可讀性強(qiáng)。

同理對(duì)于queryCondition揩徊,也內(nèi)置了靜態(tài)方法腰鬼,非常方便的加入多個(gè)condition到query語(yǔ)句中。

public ConditionQuery gt(HugeKeys key, Object value) {
        return this.query(Condition.gt(key, value));
    }

    public ConditionQuery gte(HugeKeys key, Object value) {
        return this.query(Condition.gte(key, value));
    }

    public ConditionQuery lt(HugeKeys key, Object value) {
        return this.query(Condition.lt(key, value));
    }

    public ConditionQuery lte(HugeKeys key, Object value) {
        return this.query(Condition.lte(key, value));
    }

本小節(jié)就講到這里了塑荒,代碼的細(xì)節(jié)熄赡,顯示出一個(gè)人編程能力。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末齿税,一起剝皮案震驚了整個(gè)濱河市彼硫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凌箕,老刑警劉巖拧篮,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異陌知,居然都是意外死亡他托,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門仆葡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赏参,“玉大人,你說(shuō)我怎么就攤上這事沿盅“崖ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵腰涧,是天一觀的道長(zhǎng)韧掩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)窖铡,這世上最難降的妖魔是什么疗锐? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮费彼,結(jié)果婚禮上滑臊,老公的妹妹穿的比我還像新娘。我一直安慰自己箍铲,他們只是感情好雇卷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般关划。 火紅的嫁衣襯著肌膚如雪小染。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天贮折,我揣著相機(jī)與錄音裤翩,去河邊找鬼。 笑死脱货,一個(gè)胖子當(dāng)著我的面吹牛岛都,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播振峻,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼择份!你這毒婦竟也來(lái)了扣孟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤荣赶,失蹤者是張志新(化名)和其女友劉穎凤价,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拔创,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡利诺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剩燥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慢逾。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖灭红,靈堂內(nèi)的尸體忽然破棺而出侣滩,到底是詐尸還是另有隱情,我是刑警寧澤变擒,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布君珠,位于F島的核電站,受9級(jí)特大地震影響娇斑,放射性物質(zhì)發(fā)生泄漏策添。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一毫缆、第九天 我趴在偏房一處隱蔽的房頂上張望唯竹。 院中可真熱鬧,春花似錦悔醋、人聲如沸摩窃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)猾愿。三九已至鹦聪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒂秘,已是汗流浹背泽本。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姻僧,地道東北人规丽。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像撇贺,于是被迫代替她去往敵國(guó)和親赌莺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,103評(píng)論 1 32
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,208評(píng)論 0 3
  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,523評(píng)論 0 4
  • 這部分主要是開源Java EE框架方面的內(nèi)容刻恭,包括Hibernate、MyBatis巢音、Spring、Spring ...
    雜貨鋪老板閱讀 1,385評(píng)論 0 2
  • 唐先生今年已經(jīng)35歲了尽超,但卻對(duì)“婚姻”失去了信心官撼。這事還要從一年前他的形婚經(jīng)歷說(shuō)起,那真是一段刻骨銘心似谁,讓他一生都...
    Adonael閱讀 2,335評(píng)論 4 5