0

OSXでBerkeley DB C++ API 6.0を使用しています。私のアプリケーションは、次のテーブルでデータベースを作成します。

プライマリ テーブル: (int, myStruct) -> myStruct はバッファーです。

セカンダリ インデックス: (float, myStruct) -> float キーは、次のコールバックを使用して 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 を使用して必要なことを正確に実行する (有用ではあるが十分ではない) 例をいくつか見たので、それが可能であることを証明しています...

私はこれでかなり行き詰まっているので、誰かが以前にこの問題を抱えていた場合は、助けてくれてありがとう. 必要に応じて、コードの他の部分を配置できます。

4

1 に答える 1

0

セカンダリ インデックスでカスタム bt_compare 関数を使用したところ、完全に機能するようになりました。

于 2014-03-21T11:11:07.270 に答える