Xodus 可以通过键前缀获取集合吗?
can Xodus get collection by key prefix?
我需要像MapDB的prefixSubMap这样的函数。
Xodus有这样的功能吗?我找不到接口。
https://jankotek.gitbooks.io/mapdb/content/btreemap/composite-keys.html
prefixSubMap
我发现了 store.openCursor() 和 cursor.getSearchKey()。
没有这样的功能,但您可以使用环境 API 来完成这项工作。鉴于您有 Transaction txn
、Store store
和 ByteIterable keyPrefix
,枚举其键以 keyPrefix 开头的 key/value 对将如下所示:
int prefixLen = keyPrefix.getLength();
try (Cursor cursor = store.openCursor(txn)) {
if (cursor.getSearchKeyRange(keyPrefix) != null) {
do {
ByteIterable key = cursor.getKey();
// check if the key starts with keyPrefix
int keyLen = key.getLength();
if (keyLen < prefixLen ||
ByteIterableUtil.compare(keyPrefix, key.subIterable(0, prefixLen)) != 0) {
break;
}
// wanted key/value pair is here
ByteIterable value = cursor.getValue();
...
} while(cursor.getNext());
}
}
我需要像MapDB的prefixSubMap这样的函数。 Xodus有这样的功能吗?我找不到接口。
https://jankotek.gitbooks.io/mapdb/content/btreemap/composite-keys.html
prefixSubMap
我发现了 store.openCursor() 和 cursor.getSearchKey()。
没有这样的功能,但您可以使用环境 API 来完成这项工作。鉴于您有 Transaction txn
、Store store
和 ByteIterable keyPrefix
,枚举其键以 keyPrefix 开头的 key/value 对将如下所示:
int prefixLen = keyPrefix.getLength();
try (Cursor cursor = store.openCursor(txn)) {
if (cursor.getSearchKeyRange(keyPrefix) != null) {
do {
ByteIterable key = cursor.getKey();
// check if the key starts with keyPrefix
int keyLen = key.getLength();
if (keyLen < prefixLen ||
ByteIterableUtil.compare(keyPrefix, key.subIterable(0, prefixLen)) != 0) {
break;
}
// wanted key/value pair is here
ByteIterable value = cursor.getValue();
...
} while(cursor.getNext());
}
}