我试图使用getKey和KeySelector在FoundationDB的某些子空间中找到一个键。如果结果存在于Subspace中,则效果很好。
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
}
当目标子空间不包含搜索结果时,应如何处理?
这是预期的行为。Keyselector返回符合条件的键-在这种情况下,第一个键大于或等于所传递的byte []。您需要根据子空间要求检查返回的键是否有效-通过使用subspace.contains()或对返回的键进行任何其他验证。
对于第二个问题的解释相同-返回的键可能是db中某些特殊的预先存在的行,而不是使用元组层创建的。因此,它不能使用元组层进行解析。您需要使用subspace.contains或一些类似的检查来检查密钥的有效性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句