gpt4 book ai didi

java - FoundationDB 中的 getKey 返回意外结果

转载 作者:行者123 更新时间:2023-11-29 04:14:24 25 4
gpt4 key购买 nike

我试图使用 getKey 和 KeySelector 在 FoundationDB 的某个子空间中找到一个键。如果结果存在于子空间中,它会工作得很好。

val key      = new Tuple().add(3)
val subspace = new Subspace(new Tuple().add("test-subspace"))

tr.set(key.pack(), new Tuple().pack())
tr.set(subspace.pack(key), new Tuple().pack())

tr.getKey(KeySelector.firstGreaterOrEqual(subspace.pack(key)))
.thenApply[Tuple] { result =>
println(Tuple.fromBytes(result)) // ("test-subspace", 3)
subspace.unpack(result) // (3)
}

同时,如果目标子空间中不存在键,则返回在默认子空间中找到的键。这不是我所期望的...

val key      = new Tuple().add(3)
val subspace = new Subspace(new Tuple().add("test-subspace"))

tr.set(key.pack(), new Tuple().pack())

tr.getKey(KeySelector.firstGreaterOrEqual(subspace.pack(key)))
.thenApply[Tuple] { result =>
println(Tuple.fromBytes(result)) // (3)
subspace.unpack(result) // Cannot unpack key that is not contained in subspace.
}

此外,如果 db 为空,则 getKey 不会返回 null,而是返回一些无法被 Tuple.fromBytes 解析的奇怪字节数组。

val key = new Tuple().add("my-key")    

tr.getKey(KeySelector.firstGreaterOrEqual(key.pack()))
.thenApply[Tuple] { result =>
println(result == null) // false
Tuple.fromBytes(result) // throws java.lang.IllegalArgumentException: Unknown tuple data type -1 at index 0
}

当目标子空间不包含搜索结果时,我应该如何处理?

最佳答案

补充一下 Guarav 所说的,当键选择器解析为数据库开头之前的键时,它返回空键 ('')。如果 key 解析超过数据库末尾,您将在正常事务中得到 '\xff' 或在您的事务被允许时得到 '\xff\xff'读取系统 key 。在 key 选择器文档的末尾简要提到了这一点 here .

至于不返回子空间之外的结果,这样做可能需要 getKey 接受一个绑定(bind)键参数,该参数限制超出该键的搜索。它目前没有那个参数,但是 getRange 有并且可以用来执行相同的查询,如果你使用 1 的限制。例如,你可以这样做:

tr.getRange(KeySelector.firstGreaterOrEqual(subspace.pack(key)), subspace.range().end, 1)

在这种情况下,如果可以在与您的键选择器匹配的子空间中找到一个键,则结果将有一个键;如果找不到,则结果将为空。当然,您还将在此查询中取回值。

关于java - FoundationDB 中的 getKey 返回意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53284066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com