query iterator using items is breaks when the DS isn't blocking

This commit is contained in:
Jaremy Creechley 2023-08-29 20:25:47 -07:00
parent 191aa3f558
commit 057493c809
No known key found for this signature in database
GPG Key ID: 4E66FB67B21D3300
2 changed files with 18 additions and 10 deletions

View File

@ -29,11 +29,23 @@ type
next*: GetNext next*: GetNext
dispose*: IterDispose dispose*: IterDispose
proc collectAllQueries*(q: QueryIter) = proc waitForAllQueryResults*(qi: Future[?!QueryIter]): Future[?!seq[QueryResponse]] {.async.} =
var qr: Future[?!QueryResponse] ## for large blocks this would be *expensive*
while not q.finished: var res: seq[QueryResponse]
qr = q.next() without iter =? (await qi), err:
yield qr return failure err
while not iter.finished:
let val = await iter.next()
if val.isOk():
let qr = val.tryGet()
if qr.key.isSome:
res.add qr
else:
return failure val.error()
await iter.dispose()
return success res
proc defaultDispose(): Future[?!void] {.upraises: [], gcsafe, async.} = proc defaultDispose(): Future[?!void] {.upraises: [], gcsafe, async.} =
return success() return success()

View File

@ -68,10 +68,7 @@ template queryTests*(ds: Datastore, extended = true) {.dirty.} =
(await ds.put(key3, val3)).tryGet (await ds.put(key3, val3)).tryGet
let let
iter = (await ds.query(q)).tryGet res = tryGet(await ds.query(q).waitForAllQueryResults())
res = (await allFinished(toSeq(iter)))
.mapIt( it.read.tryGet )
.filterIt( it.key.isSome )
check: check:
res.len == 3 res.len == 3
@ -84,7 +81,6 @@ template queryTests*(ds: Datastore, extended = true) {.dirty.} =
res[2].key.get == key3 res[2].key.get == key3
res[2].data.len == 0 res[2].data.len == 0
(await iter.dispose()).tryGet
test "Key should not query parent": test "Key should not query parent":
let let