すべてのプロダクト
Search
ドキュメントセンター

:bit_struct

最終更新日:Dec 28, 2024

フィルター句に関数機能を使用して、フィルター条件を定義できます。数値を返す関数機能は、ソート句でソートに使用できます。関数機能のパラメーターで参照するフィールドは、各関数の説明に基づいてインデックスフィールドまたは属性フィールドとして構成する必要があります。

関数機能

1. 概要

bit_struct: INT_ARRAY 型のフィールドの各値を複数の部分に分割し、複数の部分に対して特定の操作を実行します。

2. 構文

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

3. パラメーター

  • doc_field: INT_ARRAY 型のフィールド。

  • $struct_definition: 配列内の各64ビット整数を複数の部分に分割するために使用されるビット位置に関する情報。各部分はディメンションを表します。各部分の開始ビット位置と終了ビット位置を指定できます。開始ビット位置と終了ビット位置はハイフン (-) で区切られます。64ビット整数の場合、最左ビットから最右ビットまでのビットには、0から63までの番号が付けられます。部分の終了ビット位置は63を超えることはできません。複数の部分はコンマ (,) で区切ります。部分には1から番号が付けられます。たとえば、64ビット整数を3つの部分に分割し、各部分がディメンションを表すとします。ビット0からビット9は、$1 で表される値を示します。ビット10からビット48は、$2 で表される値を示します。ビット49からビット60は、$3 で表される値を示します。この場合、$struct_definition パラメーターを "0-9,10-48,49-60" に設定できます。

  • operation: 部分に対して実行される操作。1~5個の操作を指定できます。操作には、$struct_definition パラメーターで指定された部分の後に番号が付けられ、操作の番号は増加します。複数の操作を指定し、操作が前の操作の戻り値を参照する場合、前の操作の番号を使用できます。bit_struct 関数は、次の操作をサポートしています。

    • "equal,$m,$n": $m で表される値が $n で表される値と等しいかどうかを判断します。等しい場合は true が返されます。等しくない場合は false が返されます。

    • "overlap,$m,$n,$k,$p": ($m,$n) と ($k,$p) で定義された範囲が交差するかどうかを判断します。交差する場合は true が返されます。交差しない場合は false が返されます。

    • "and,$m,$n,…": 指定された値に対して AND 論理演算を実行します。たとえば、$m and $n です。前の操作の指定された値は整数にすることができることに注意してください。例: "equal,$1,1"。

4. 戻り値

戻り値は、最後の操作が true を返す配列要素の添え字を示す64ビット整数です。配列要素の添え字は0から始まります。doc_field パラメーターで指定されたフィールドに、最後の操作が true を返す配列要素が存在しない場合、bit_struct 関数は -1 を返します。

5. 使用上の注意

  • この関数のパラメーターで参照するフィールドは、属性フィールドとして構成する必要があります。

サンプルシナリオ

  • 特定の期間に営業している店舗を検索します。

たとえば、ドキュメントに INT_ARRAY 型の open_time フィールドがあり、配列内の各64ビット整数が店舗の営業時間帯を示すとします。整数の最初の32ビットは店舗の開店時間を示し、整数の最後の32ビットは店舗の閉店時間を示します。14:00 から 15:30 まで営業している店舗を検索する場合、まず開始時刻と終了時刻をそれぞれ同じ日の00:00からの経過時間(分)に変換します。この例では、14:00 は 840 に変換され、15:30 は 930 に変換されます。次に、次のフィルター句を使用できます。

filter=bit_struct(open_time, "0-31,32-63","overlap,$1,$2,840,930")!=-1
  • 朝食、昼食、または夕食を提供できる店舗を検索します。提供できる顧客数は、最小値と最大値の範囲を使用して指定されます。

たとえば、ドキュメントに INT_ARRAY 型の book_info フィールドがあり、配列内の各64ビット整数が店舗の予約情報を示すとします。ビット0からビット7は日付を示します。ビット8からビット15は朝食、昼食、または夕食を示します。ビット16からビット41は許可される顧客の最小数を示します。ビット42からビット63は許可される顧客の最大数を示します。次のフィルター句を使用して、明日の夕食に3~5人の顧客にサービスを提供できる店舗を検索できます。"equal,$1,1" 操作の整数 1 は明日を表し、"equal,$2,3" 操作の整数 3 は夕食を表します。

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 は、ビット0からビット7で表される値を示します。
$2 は、ビット8からビット15で表される値を示します。
$3 は、ビット16からビット41で表される値を示します。
$4 は、ビット42からビット63で表される値を示します。
$5 は、"equal,$1,1" 操作の戻り値を示します。
$6 は、"equal,$2,3" 操作の戻り値を示します。
$7 は、"overlap,$3,$4,3,5" 操作の戻り値を示します。
"and,$5,$6,$7" は、$5、$6、および $7 で表される値に対して AND 論理演算が実行されることを示します。bit_struct 関数の戻り値は、"and,$5,$6,$7" 操作が true を返す配列要素の添え字を示します。
  • 10個を超える商品を提供し、14:00から15:30まで商品を配達できる店舗を検索します。14:00は840に変換され、15:30は930に変換されます。

このような店舗を検索するには、2つのフィールドに基づいてフィルター条件を設定する必要があります。bit_struct 関数は、1つのフィールドに対してのみ配列添え字を返します。したがって、multi_attr 関数で bit_struct 関数を使用して、配列型の2つのフィールドを参照できます。multi_attr 関数は、他のフィールドの配列添え字を返すことができます。この例では、次のクエリ句を使用できます。

filter=multi_attr(store, bit_struct(dispatch_time,"0-31,32-63", "equal,$1,840", "equal,$2,930", "and,$3,$4"))>10
// 説明:
dispatch_time フィールドは INT_ARRAY 型で、複数の値を持ちます。各値は、店舗の配達時間を示す64ビット整数です。まず、時刻を同じ日の00:00からの経過時間(分)に変換する必要があります。この例では、14:00 は 840 に変換され、15:30 は 930 に変換されます。
store フィールドは INT_ARRAY 型で、複数の値を持ちます。各値は、店舗の在庫を示す64ビット整数です。store フィールドの各値は、dispatch_time フィールドの各値に対応します。

INT_ARRAY 型のフィールドの値を構築する

この例では、Python のドーム電卓を使用して64ビット整数を生成できます。整数は、08:00から18:00までの期間を示します。

# 開始時刻を00:00から08:00までの分数に変換します。
start=8*60

# 終了時刻を00:00から18:00までの分数に変換します。
end=18*60

# 64ビット整数の最初の32ビットを使用して開始時刻を示し、最後の32ビットを使用して終了時刻を示します。
# 最初の32ビットが08:00を示す初期64ビット整数を生成します。
start=start<<32
Print ("最初の32ビット",start)#2061584302080

# 最初の32ビットを使用して08:00を示し、最後の32ビットを使用して18:00を示す最終64ビット整数を生成します。
result=start|end
print("結果",result)#2061584303160

結果

image

原則: 次の図は、480と1080が2進数に変換される方法を示しています。image

左ビットシフトを実行して、最初の32ビットを使用して480を示します。

image

左ビットシフト後に生成された2進数の最後の32ビットを、1080の2進数の最後の32ビットに置き換えます。

image

最終的な2進数を10進数に変換します。最終的な2進数は0000000000000000000000011110000000000000000000000000010000111000です。image

10進数は、Python のドーム電卓を使用して生成された結果と同じです。

例:

配列内の値の最後の32ビットが特定の数を表しているかどうかを確認する場合、次のフィルター句を使用できます。

bit_struct(type_arr,"0-31,32-63","equal,$2,40506")!=-1
// 説明:
"0-31,32-63": 値を2つの部分に分割するために使用されるビット位置に関する情報。
"equal,$2,40506": 値の最後の32ビットが40506を示しているかどうかを確認する操作。