Query Object 查詢物件模式 下

2021-06-26 15:54:32 字數 4571 閱讀 3250

回顧

不管什麼樣的框架,使用起來不簡單不易用的話,那麼就沒有設計的必要了。

基於表示式的實現

首先從簡單的呼叫方式開始吧,如:

query

.add

<

school

>(

s =>s.

name

=="一中"

);或者

query

.add

<

school

>(

s =>s.

age>

20);

分析以上兩個查詢條件表示式,並且跟原先的criterion來進行對比,依然是可以通過解析表示式來生成criterion物件的,但是由於nhibernate已經支援表示式了,因此需要重構一下query object模式,首先刪除criterion類,並對query**進行修改,**如下:

private

list

<

expression

>

m_criterions

=new

list

<

expression

>();

public

ienumerable

<

expression

>

criterions

}public

void

add<

t>(

expression

<

func

bool

>>

exp)

public

void

add(

expression

exp)

接下來,需要支援and或者or了,由於and和or涉及到子查詢的問題,當父查詢的queryoperator與子查詢的queryoperator不同的情況下,表示式就需要被轉換成乙個子查詢了,因此**改為:

public

void

add(

expression

exp)

private

void

addbyjunctionexpression

(expression

exp)

else

}

到這裡基於表示式的query object就改造完成了,那麼接下來就要根據資料層具體的環境來講query轉化為對應的api來查詢資料了。

使用nhibernate查詢

先上**,然後分析,大致**為:

public

static

nhibernate

.icriterion

tonhibernatequery

<

t>(

query

query

)this.(

junction

);return

junction;}

private

static

void

<

t>(

nhibernate

.junction

junction

,expression

exp)

private

static

parameterexpression

getparameterexpressionby

(expression

exp)

private

static

void

<

t>(

nhibernate

.junction

junction

,ienumerable

<

query

>

subqueries

)}

由於nhibernate內部已經實現了query object模式,因此在轉換的過程當中,只需要將and和or條件轉化為對應的nhibernate類就行了,然後利用nhibernate對於表示式的支援將條件新增進去,最後使用icriteria.list()獲取結果就可以了。

使用beego查詢

go語言出來也有一段時間了,很多大公司也都在使用它,我們也不能落後。由於最近使用beego框架搭建了資料伺服器,query object模式當然也是必須的,因此藉著這篇文章,也順帶講講beego框架上,query object模式的實現。

雖然現在大部分的公司使用的資料庫依然是關係型資料庫,但是仍然擋不住nosql這個新興資料庫的腳步,由於最近一段時間都是是用nodejs來進行web開發的,因此使用nosql資料庫能更好的進行資料庫互動,畢竟可以直接使用json資料結構,但是由於同事對於關係型資料庫比較習慣因此不得不改為關係型資料庫,於是就有了上面提到的go資料伺服器了。

為了使原先查詢資料的方式不用改變,因此引用了mongodb的api結構來實現query object模式,ajax

查詢**為:

$

.ajax(}

}});

以上結構等同於select * from school where name = '一中' or age > 20,按照以前幾次實現query object的經驗,這次要實現這種結構的轉換相對還是比較簡單的,在go語言當中,通用型別是inte***ce{},它相當於c#的object,字典也有一些差別,但是並不妨礙具體的實現,這裡為了簡便(使用go的結構太複雜了),因此直接使用switch來轉換成begoo的介面的,大致**如下:

func 

(this

*repository

)translatetocriterion

(field

string

,criterion map

[string

]inte***ce

{},isand

bool

,isnot

bool)*

orm.

condition

fork,v

:=range criterion

else

ifstartswith

else

break

case

"$gt"

:key

=key

+"__gt"

break

case

"$lt"

:key

=key

+"__lt"

break

case

"$in"

:key

=key

+"__in"

break

case

"$not":if

reflect

.typeof(v

).kind

()==

reflect

.map

),isand

,true)}

else

break

case

"$and"

:value

=this

.translatetocriterion(""

,v.(map

[string

]inte***ce

{}),

true

,isnot

)break

case

"$or"

:value

=this

.translatetocriterion(""

,v.(map

[string

]inte***ce

{}),

false

,isnot

)break

default:if

v !=

nil&&

reflect

.typeof(v

).kind

()==

reflect

.map

),isand

,isnot)}

else

ifv

==nil

else

break

}subcond

,iscond

:=value

.(*orm

.condition)if

isand

else

ifisnot

else

}else

else

ifisnot

else}}

return

cond

}

這樣就實現了beego框架下的query object模式了,如果對go有興趣的話,也可以直接使用beego框架來搭建web應用,那麼前端可以直接使用前面那樣的ajax來實現資料的訪問,這樣還是很方便的。 結尾

query obejct模式雖然可以簡化資料的查詢,雖然對於資料許可權是沒有作用的,但是由於使用query object模式,查詢介面是固定的,因此可以在查詢方法內新增資料許可權模組,這樣可以簡化資料許可權實現的困難。

ceph儲存之查詢物件

物件儲存 而非塊儲存 要把物件存入ceph集群,客戶端必須做到 1 指定物件名 2 指定儲存池 ceph客戶端檢出最新集群執行圖,客戶端用crush演算法動態地計算出如何把物件對映到歸置組 然後計算如何把歸置組分配到osd。要定位物件,只需要物件名和儲存池名字即可。例如 ceph osd map 練...

幫Python找「物件」

引言 你一定會感嘆 python還缺找物件?畢竟 一切皆物件 是人家python的哲學理念。不過,python 允許程式設計師以純粹的面向過程的方式來使用它,所以人們有時會忽視它那顆 找物件 的心。其實無論是面向過程,還是函式式程式設計,都是特殊的物件模擬出的效果。本文選自 從python開始學程式...

幫Python找「物件」

說是要 找物件 我們第乙個看的卻是個叫作 類 的語法結構。這裡的類其實和我們日常生活中的 類 的概念差不多。日常生活中,我們把相近的東西歸為一類,而且給這個類起乙個名字。比如說,鳥類的共同屬性是有羽毛,通過產卵生育後代。任何乙隻特別的鳥都是建立在鳥類的原型基礎上的。下面我們用python 語言來記錄...