Berkeley DB C ++查询浮点索引

时间:2014-03-20 13:44:20

标签: c++ macos berkeley-db secondary-indexes

我在OSX上使用Berkeley DB C ++ API 6.0。 我的应用程序使用以下表创建数据库:

主表:(int,myStruct) - > myStruct是一个缓冲区。

二级索引:(float,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,所以它证明了可以做到...

我非常喜欢这个,所以如果有人之前已经遇到过这个问题,那就是帮助我。如有必要,我可以将代码的其他部分放在其中。

1 个答案:

答案 0 :(得分:0)

我在二级索引上使用了自定义bt_compare函数,现在效果很好。