Anda dapat menggunakan fungsi fungsionalitas dalam klausa filter untuk menentukan kondisi filter. Fungsi yang mengembalikan nilai numerik dapat digunakan dalam klausa sortir untuk pengurutan. Bidang yang direferensikan dalam parameter fungsi harus dikonfigurasi sebagai bidang indeks atau atribut sesuai dengan deskripsi setiap fungsi.
Fungsi fungsionalitas
1. Ikhtisar
bit_struct: Membagi setiap nilai menjadi beberapa bagian untuk bidang tipe INT_ARRAY dan melakukan operasi tertentu pada bagian-bagian tersebut.
2. Sintaksis
bit_struct(doc_field,"$struct_definition", operation,...)3. Parameter
doc_field: Bidang bertipe INT_ARRAY.
$struct_definition: Informasi tentang posisi bit yang digunakan untuk membagi setiap bilangan bulat 64-bit dalam array menjadi beberapa bagian. Setiap bagian mewakili dimensi. Anda dapat menentukan posisi bit awal dan akhir dari setiap bagian, dipisahkan oleh tanda hubung (-). Untuk bilangan bulat 64-bit, bit dari paling kiri hingga paling kanan diberi nomor dari 0 hingga 63. Posisi bit akhir dari suatu bagian tidak boleh melebihi 63. Pisahkan beberapa bagian dengan koma (,). Bagian-bagian dinomori mulai dari 1. Sebagai contoh, jika ingin membagi bilangan bulat 64-bit menjadi tiga bagian, dengan setiap bagian mewakili dimensi, bit dari Bit 0 hingga Bit 9 menunjukkan nilai yang diwakili oleh $1, bit dari Bit 10 hingga Bit 48 menunjukkan nilai yang diwakili oleh $2, dan bit dari Bit 49 hingga Bit 60 menunjukkan nilai yang diwakili oleh $3. Anda dapat mengatur parameter $struct_definition menjadi "0-9,10-48,49-60".
operation: Operasi yang akan dilakukan pada bagian-bagian tersebut. Anda dapat menentukan satu hingga lima operasi. Operasi dinomori setelah bagian-bagian yang ditentukan oleh parameter $struct_definition, dan nomor operasi meningkat. Saat menentukan beberapa operasi, operasi berikutnya dapat merujuk pada hasil operasi sebelumnya menggunakan nomor operasi sebelumnya. Fungsi bit_struct mendukung operasi berikut:
"equal,$m,$n": Menentukan apakah nilai yang diwakili oleh $m sama dengan nilai yang diwakili oleh $n. Jika ya, true dikembalikan; jika tidak, false dikembalikan.
"overlap,$m,$n,$k,$p": Menentukan apakah rentang yang didefinisikan oleh ($m,$n) dan ($k,$p) berpotongan. Jika ya, true dikembalikan; jika tidak, false dikembalikan.
"and,$m,$n,…": melakukan operasi logika AND pada nilai-nilai yang ditentukan, seperti $m dan &n. Perhatikan bahwa nilai-nilai dari operasi sebelumnya bisa berupa bilangan bulat. Contoh: "equal,$1,1".
4. Nilai Kembali
Nilai kembali adalah bilangan bulat 64-bit yang menunjukkan subskrip elemen array untuk mana operasi terakhir mengembalikan true. Subskrip elemen array dimulai dari 0. Jika tidak ada elemen array untuk mana operasi terakhir mengembalikan true dalam bidang yang ditentukan oleh parameter doc_field, fungsi bit_struct mengembalikan -1.
5. Catatan Penggunaan
Bidang yang direferensikan dalam parameter fungsi ini harus dikonfigurasi sebagai bidang atribut.
Skenario Contoh
Mencari toko yang buka pada periode waktu tertentu.
Sebagai contoh, dokumen Anda memiliki bidang open_time bertipe INT_ARRAY, dan setiap bilangan bulat 64-bit dalam array menunjukkan jam operasional sebuah toko. 32 bit pertama dari integer menunjukkan waktu buka toko, dan 32 bit terakhir menunjukkan waktu tutup toko. Jika Anda ingin mencari toko yang buka dari pukul 14:00 hingga 15:30, Anda dapat terlebih dahulu mengonversi setiap waktu mulai dan waktu akhir ke jumlah menit yang telah berlalu dari pukul 00:00 pada hari yang sama. Dalam contoh ini, 14:00 dikonversi menjadi 840, dan 15:30 dikonversi menjadi 930. Kemudian, Anda dapat menggunakan klausa filter berikut:
filter=bit_struct(open_time, "0-31,32-63","overlap,$1,$2,840,930")!=-1Mencari toko yang dapat melayani pelanggan untuk sarapan, makan siang, atau makan malam. Jumlah pelanggan yang dapat dilayani ditentukan dengan menggunakan rentang dengan nilai minimum dan maksimum.
Sebagai contoh, dokumen Anda memiliki bidang book_info bertipe INT_ARRAY, dan setiap bilangan bulat 64-bit dalam array menunjukkan informasi pemesanan sebuah toko. Bit dari Bit 0 hingga Bit 7 menunjukkan tanggal. Bit dari Bit 8 hingga Bit 15 menunjukkan sarapan, makan siang, atau makan malam. Bit dari Bit 16 hingga Bit 41 menunjukkan jumlah minimum pelanggan yang diizinkan. Bit dari Bit 42 hingga Bit 63 menunjukkan jumlah maksimum pelanggan yang diizinkan. Anda dapat menggunakan klausa filter berikut untuk mencari toko yang dapat melayani tiga hingga lima pelanggan untuk makan malam besok. Bilangan bulat 1 dalam operasi "equal,$1,1" mewakili besok, dan bilangan bulat 3 dalam operasi "equal,$2,3" mewakili makan malam:
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
// Deskripsi:
$1 menunjukkan nilai yang diwakili oleh bit dari Bit 0 hingga Bit 7.
$2 menunjukkan nilai yang diwakili oleh bit dari Bit 8 hingga Bit 15.
$3 menunjukkan nilai yang diwakili oleh bit dari Bit 16 hingga Bit 41.
$4 menunjukkan nilai yang diwakili oleh bit dari Bit 42 hingga Bit 63.
$5 menunjukkan nilai hasil dari operasi "equal,$1,1".
$6 menunjukkan nilai hasil dari operasi "equal,$2,3".
$7 menunjukkan nilai hasil dari operasi "overlap,$3,$4,3,5".
"and,$5,$6,$7" menunjukkan bahwa operasi logika AND dilakukan pada nilai-nilai yang diwakili oleh $5, $6, dan $7. Nilai hasil dari fungsi bit_struct menunjukkan subskrip elemen array untuk mana operasi "and,$5,$6,$7" mengembalikan true.Mencari toko yang dapat menyediakan lebih dari 10 komoditas dan mengirimkan komoditas dari pukul 14:00 hingga 15:30. 14:00 dikonversi menjadi 840, dan 15:30 dikonversi menjadi 930.
Untuk mencari toko semacam itu, Anda harus menetapkan kondisi filter berdasarkan dua bidang. Fungsi bit_struct mengembalikan subskrip array hanya untuk satu bidang. Oleh karena itu, Anda dapat menggunakan fungsi bit_struct dalam fungsi multi_attr untuk mereferensikan dua bidang bertipe array. Fungsi multi_attr dapat mengembalikan subskrip array untuk bidang lainnya. Dalam contoh ini, Anda dapat menggunakan klausa query berikut:
filter=multi_attr(store, bit_struct(dispatch_time,"0-31,32-63", "equal,$1,840", "equal,$2,930", "and,$3,$4"))>10
// Deskripsi:
Bidang dispatch_time bertipe INT_ARRAY dan memiliki beberapa nilai. Setiap nilai adalah bilangan bulat 64-bit yang menunjukkan waktu pengiriman sebuah toko. Anda harus terlebih dahulu mengonversi waktu ke jumlah menit yang telah berlalu dari pukul 00:00 pada hari yang sama. Dalam contoh ini, 14:00 dikonversi menjadi 840, dan 15:30 dikonversi menjadi 930.
Bidang store bertipe INT_ARRAY dan memiliki beberapa nilai. Setiap nilai adalah bilangan bulat 64-bit yang menunjukkan inventaris sebuah toko. Setiap nilai dari bidang store sesuai dengan setiap nilai dari bidang dispatch_time.
Membuat nilai untuk bidang bertipe INT_ARRAY
Contoh
Dalam contoh ini, Anda dapat menghasilkan bilangan bulat 64-bit dengan menggunakan kalkulator dome di Python. Bilangan bulat tersebut menunjukkan periode waktu dari pukul 08:00 hingga 18:00.
# Konversi waktu mulai ke jumlah menit antara 00:00 dan 08:00.
start=8*60
# Konversi waktu akhir ke jumlah menit antara 00:00 dan 18:00.
end=18*60
# Gunakan 32 bit pertama dari bilangan bulat 64-bit untuk menunjukkan waktu mulai dan 32 bit terakhir untuk menunjukkan waktu akhir.
# Hasilkan bilangan bulat 64-bit awal yang 32 bit pertamanya menunjukkan 08:00.
start=start<<32
Print ("32 bit pertama",start)#2061584302080
# Hasilkan bilangan bulat 64-bit akhir yang menggunakan 32 bit pertama untuk menunjukkan 08:00 dan 32 bit terakhir untuk menunjukkan 18:00.
result=start|end
print("Hasil",result)#2061584303160Hasil

Prinsip: Gambar berikut menunjukkan cara 480 dan 1080 dikonversi menjadi bilangan biner.
Gunakan 32 bit pertama untuk menunjukkan 480 dengan melakukan pergeseran bit ke kiri.

Ganti 32 bit terakhir dalam bilangan biner yang dihasilkan setelah pergeseran bit ke kiri dengan 32 bit terakhir dalam bilangan biner 1080.

Konversikan bilangan biner akhir menjadi bilangan desimal. Bilangan biner akhir adalah 0000000000000000000000011110000000000000000000000000010000111000.
Bilangan desimal tersebut sama dengan hasil yang dihasilkan dengan menggunakan kalkulator dome di Python.
Contoh:
Jika Anda ingin memeriksa apakah 32 bit terakhir dari nilai dalam array mewakili angka tertentu, Anda dapat menggunakan klausa filter berikut:
bit_struct(type_arr,"0-31,32-63","equal,$2,40506")!=-1
// Deskripsi:
"0-31,32-63": informasi tentang posisi bit yang digunakan untuk membagi nilai menjadi dua bagian.
"equal,$2,40506": operasi yang memeriksa apakah 32 bit terakhir dari nilai menunjukkan 40506.