全部產品
Search
文件中心

:bit_struct

更新時間:Jul 13, 2024

外掛程式功能函數可以用在filter子句作為過濾和篩選條件,而傳回值為數值型的功能函數在sort子句中,用來做排序。其中功能函數參數出現的文檔欄位需根據對應函數文檔提示,建立為索引或屬性。

功能函數項

1.介紹:

bit_struct: 將INT_ARRAY欄位值進行自訂分組並允許對分組值進行指定operation計算。

2.文法:

bit_struct(doc_field,"$struct_definition", operation,...)

3.參數:

  • doc_field: 是一個INT_ARRAY類型的欄位名。

  • $struct_definition:用於把int64的值拆分成多個維度資訊。每一維的分組用int64中的起始bit位置和結束bit位置指定,使用橫線“-”分隔,bit位置從值的高端開始算起,從0開始,最大不能超過63。多個分組用逗號”,”分隔。每個分組有一個編號,編號從1開始算起。舉例:假設使用者需要把int64拆分成3個維度資訊, bit0到bit9代表一個值(用$1表示), bit10到bit48代表一個值(用$2表示), bit49到bit60代表一個值(用$3表示), 則該參數可寫成:”0-9,10-48,49-60”。

  • operation:定義計算過程,最少定義1個,最多定義5個,每個operation會有一個編號,這個編號是接著struct_definition中的編號開始遞增,當需要定義多個operation時,後面的operation要用到前面計算過的operation的傳回值,這時候就可以用到給operation分配的編號了。operation 可以定義的操作有:

    • "equal,$m,$n": 判斷$m代表的值和$n代表的值是否相等,相等返回true,否則返回false。

    • "overlap,$m,$n,$k,$p":判斷($m,$n)和($k,$p)定義的範圍在數軸上是否相交。相交時返回true,否則返回false

    • "and,$m,$n,…":返回$m, $n,..等做and(&&)的結果。【註:上面的這3個操作的參數也可以是整數數字。 例如 “equal,$1,1”】

4.傳回值:

int64,返回最後一個operation第一次為true時對應的doc_field中的數組下標(從0開始)。若doc_field中沒有滿足operation指定的要求的值,則返回-1。

5.注意事項:

  • 函數參數依賴欄位需建立為屬性欄位

情境舉例

查詢給定時間段在營業的店鋪有哪些? 假定使用者文檔中有一個int64_array類型的欄位open_time,每個值表示一段上班時間,將int64的高32位表示起始時間,低32位表示結束時間,如果要查詢下午14點到15:30點營業的店鋪,可以將時間轉換為從當天0點開始,按分鐘為單位的時間段, 則下午14點到15:30表示為(840,930),則查詢中filter子句可以寫為:

filter=bit_struct(open_time, "0-31,32-63","overlap,$1,$2,840,930")!=-1
  • 查詢未來某一天,某個餐點(早,中,晚),可以提供Pmin到Pmax人數就餐的店鋪

假設使用者文檔中有一個int64_array類型的欄位book_info,對於該欄位中的一個值,0-7位表示日期,8-15位餐點,16-41位表示最小人數,42-63位表示最大人數。查詢明天(用1表示)晚上(用3表示)能服務3-5個人的店鋪,則filter子句可以寫為:

filter=bit_struct(book_info,"0-7,8-15,16-41,42-63",
"equal,$1,1","equal,$2,3","overlap,$3,$4,3,5","and,$5,$6,$7")!=-1
//解釋
這裡$1表示book_info中0-7位代表的值,
$2表示book_info中8-15位代表的值
$3表示book_info中16-41位代表的值
$4表示book_info中42-63位代表的值
$5代表operation “equal,$1,1”的傳回值
$6代表 operation”equal,$2,3”的傳回值
$7代表operation “overlap,$3,$4,3,5”的傳回值
返回$5,$6,$7代表的值做and(邏輯與)後第一次為true時候的值 在book_info中對應的數組下標
  • 查詢下午14點到15:30表示為(840,930)之間,庫存>10的店鋪有哪些?因為bit_struct返回的是下標,所以他可以和multi_attr函數一起配合使用,取另外一個array類型欄位對應下標的值。如該例,可以在查詢語句中使用:

filter=multi_attr(store, bit_struct(dispatch_time,"0-31,32-63", "equal,$1,840", "equal,$2,930", "and,$3,$4"))>10
//解釋
dispatch_time是文檔中有一個多值INT64的欄位,用於儲存商戶的配送時間。將時間轉換為從當天0點開始,按分鐘為單位的時間段, 則下午14點到15:30表示為(840,930)
store是一個int64_array欄位,與dispatch_time的時間段分別對應,表示該時間段的庫存量。

int64_array 數組值構建介紹

範例:

這裡以Python為例,構建一個早上8點~18點的int64

#開始時間8:00 以分鐘為單位
start=8*60

#結束時間18:00
end=18*60

#將int64的高32位表示起始時間,低32位表示結束時間
#先構造高32
start=start<<32
print("高32",start)#2061584302080

#最終結果
result=start|end
print("結果",result)#2061584303160

結果1原理圖:二進位:2將480存到高32位上(原理:左移32位):3將構造的高32的結果,在將1080存到這個數的低32位上(原理 |):4得到該數位二級製為:0000000000000000000000011110000000000000000000000000010000111000其結果:5與以上的Python dome的計算結果一致。

這裡簡單舉個例子:

假設,需要判斷數組裡是否有某個值,並且數值的值存在低32位中,filter寫法可以為:

bit_struct(type_arr,"0-31,32-63","equal,$2,40506")!=-1
//解釋:
"0-31,32-63":固定填入
"equal,$2,40506":判斷數組裡有沒有值為40506