[英]Berkeley DB C++ query on floating index
我在OSX上使用Berkeley DB C ++ API 6.0。 我的應用程序創建具有下列表格數據庫:
主表:(INT,MYSTRUCT) - > MYSTRUCT是一個緩沖區。
次級指數:(浮點,MYSTRUCT) - >浮關鍵是我與以下回調MYSTRUCT緩沖器檢索的信息。
int meanExtractor(Db *sdbp,
const Dbt *pkey,
const Dbt *pdata,
Dbt *skey)
{
Dbt data = *pdata;
feature<float> f;
restoreDescriptor(f, data);
void* mean = malloc( sizeof(float) );
memcpy( mean, &f.mean, sizeof(float) );
skey->set_data(mean);
skey->set_size(sizeof(float));
skey->set_flags( DB_DBT_APPMALLOC );
return 0;
}
當我遍歷二級索引和打印鍵/數據對時,浮子密鑰是公存儲。 我的問題是我無法查詢該表。 我想執行這個SQL查詢,例如:
SELECT * FROM secondary index WHERE keys > 1.5 && keys < 3.4
我的表由0.001和49.999之間的50000個鍵填充。 問題是,當我用這個方法,例如:
I assume the Db and the table are already opened
float i = 0.05;
Dbt key = Dbt(&i, sizeof(float));
Dbc* dbc;
db->cursor( txn, &dbc, 0 );
int ret;
ret = dbc->get( key, &vald, DB_SET_RANGE));
它的檢索此項:0.275。 應該找回0.05(因為它存在),或至少0.051。 而對於在DBT關鍵任何其他浮點值,它給了我一些愚蠢的值。 如果我把DB_SET標志,它只是沒有找到任何按鍵。 我的想法是,將光標到最小鍵大於或等於設置為我的鑰匙,然后直到我達到我的范圍的結束旗DB_NEXT進行迭代。 這必須來自的BerkeleyDB的搜索算法,但我看到了一些(有用的,但還不夠)的例子是做的正是我需要的,但與Java API,這樣就證明是可以做到的...
我與這個漂亮stucked,所以如果有人之前就已經有這個問題,THX對我的幫助。 如有必要,我可以將代碼的其他部分放入。
我在二級索引上使用了自定義bt_compare函數,現在可以正常使用了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.