Skip to content

Commit 48093bf

Browse files
authored
Merge pull request #15 from scalableminds/getMultipleKeys-paginated
Add optional limit for getMultipleKeys
2 parents 15d6f14 + 30bab1d commit 48093bf

File tree

4 files changed

+19
-3
lines changed

4 files changed

+19
-3
lines changed

src/main/protobuf/fossildbapi.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ message GetMultipleKeysRequest {
6464
required string key = 2;
6565
optional string prefix = 3;
6666
optional uint64 version = 4;
67+
optional uint32 limit = 5;
6768
}
6869

6970
message GetMultipleKeysReply {

src/main/scala/com/scalableminds/fossildb/FossilDBGrpcImpl.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class FossilDBGrpcImpl(storeManager: StoreManager) extends FossilDBGrpc.FossilDB
5353

5454
override def getMultipleKeys(req: GetMultipleKeysRequest) = withExceptionHandler(req) {
5555
val store = storeManager.getStore(req.collection)
56-
val (keys, values) = store.getMultipleKeys(req.key, req.prefix, req.version)
56+
val (keys, values) = store.getMultipleKeys(req.key, req.prefix, req.version, req.limit)
5757
GetMultipleKeysReply(true, None, keys, values.map(ByteString.copyFrom(_)))
5858
} {errorMsg => GetMultipleKeysReply(false, errorMsg)}
5959

src/main/scala/com/scalableminds/fossildb/db/VersionedKeyValueStore.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,11 @@ class VersionedKeyValueStore(underlying: RocksDBStore) {
112112
}
113113
}
114114

115-
def getMultipleKeys(key: String, prefix: Option[String] = None, version: Option[Long] = None): (Seq[String], Seq[Array[Byte]]) = {
115+
def getMultipleKeys(key: String, prefix: Option[String] = None, version: Option[Long] = None, limit: Option[Int]): (Seq[String], Seq[Array[Byte]]) = {
116116
requireValidKey(key)
117117
prefix.map{p => requireValidKey(p)}
118118
val iterator: Iterator[VersionedKeyValuePair[Array[Byte]]] = scanKeys(key, prefix, version)
119-
val asSequence = iterator.toSeq
119+
val asSequence = iterator.take(limit.getOrElse(Int.MaxValue)).toSeq
120120
val keys = asSequence.map(_.key)
121121
val values = asSequence.map(_.value)
122122
(keys, values)

src/test/scala/com/scalableminds/fossildb/FossilDBSuite.scala

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,21 @@ class FossilDBSuite extends FlatSpec with BeforeAndAfterEach {
237237
assert(reply.values.contains(testData2))
238238
}
239239

240+
it should "with limit return only the first n keys of matching version " in {
241+
client.put(PutRequest(collectionA, aKey, Some(0), testData1))
242+
client.put(PutRequest(collectionA, anotherKey, Some(0), testData1))
243+
client.put(PutRequest(collectionA, aThirdKey, Some(0), testData1))
244+
client.put(PutRequest(collectionA, aKey, Some(1), testData2))
245+
client.put(PutRequest(collectionA, anotherKey, Some(1), testData2))
246+
client.put(PutRequest(collectionA, aThirdKey, Some(1), testData2))
247+
client.put(PutRequest(collectionA, aKey, Some(2), testData3))
248+
client.put(PutRequest(collectionA, anotherKey, Some(2), testData3))
249+
client.put(PutRequest(collectionA, aThirdKey, Some(2), testData3))
250+
val reply = client.getMultipleKeys(GetMultipleKeysRequest(collectionA, aKey, None, Some(1), Some(2)))
251+
assert(reply.keys.length == 2)
252+
assert(reply.values.contains(testData2))
253+
}
254+
240255
"Backup" should "create non-empty backup directory" in {
241256
client.put(PutRequest(collectionA, aKey, Some(0), testData1))
242257
client.backup(BackupRequest())

0 commit comments

Comments
 (0)