fix compiler issue -- wasn't detecting discard on result correctly

This commit is contained in:
Jaremy Creechley 2023-08-29 20:49:43 -07:00 committed by Dmitriy Ryajov
parent 2d2b663516
commit 1f0012530d
No known key found for this signature in database
GPG Key ID: DA8C680CE7C657A4
2 changed files with 117 additions and 112 deletions

View File

@ -29,12 +29,11 @@ type
next*: GetNext next*: GetNext
dispose*: IterDispose dispose*: IterDispose
proc waitForAllQueryResults*(iter: QueryIter): Future[?!seq[QueryResponse]] {.async.} = proc waitForAllQueryResults*(qi: ?!QueryIter): Future[?!seq[QueryResponse]] {.async.} =
## for large blocks this would be *expensive* ## for large blocks this would be *expensive*
var res: seq[QueryResponse] var res: seq[QueryResponse]
# if qi.isErr(): without iter =? qi, err:
# return failure qi.error() return failure err
# let iter = qi.get()
while not iter.finished: while not iter.finished:
let val = await iter.next() let val = await iter.next()
@ -45,9 +44,15 @@ proc waitForAllQueryResults*(iter: QueryIter): Future[?!seq[QueryResponse]] {.as
else: else:
return failure val.error() return failure val.error()
await iter.dispose() let rd = await iter.dispose()
if rd.isErr():
return failure(rd.error())
return success res return success res
proc waitForAllQueryResults*(iter: Future[?!QueryIter]): Future[?!seq[QueryResponse]] {.async.} =
let res = await iter
await waitForAllQueryResults(res)
proc defaultDispose(): Future[?!void] {.upraises: [], gcsafe, async.} = proc defaultDispose(): Future[?!void] {.upraises: [], gcsafe, async.} =
return success() return success()

View File

@ -67,7 +67,7 @@ template queryTests*(ds: Datastore, extended = true) {.dirty.} =
(await ds.put(key3, val3)).tryGet (await ds.put(key3, val3)).tryGet
let let
all = waitForAllQueryResults(tryGet(await ds.query(q))) all = waitForAllQueryResults(await ds.query(q))
res = tryGet(await all) res = tryGet(await all)
check: check:
@ -82,146 +82,146 @@ template queryTests*(ds: Datastore, extended = true) {.dirty.} =
res[2].data.len == 0 res[2].data.len == 0
# test "Key should not query parent": test "Key should not query parent":
# let let
# q = Query.init(key2) q = Query.init(key2)
# (await ds.put(key1, val1)).tryGet (await ds.put(key1, val1)).tryGet
# (await ds.put(key2, val2)).tryGet (await ds.put(key2, val2)).tryGet
# (await ds.put(key3, val3)).tryGet (await ds.put(key3, val3)).tryGet
# let let
# res = tryGet(await ds.query(q).waitForAllQueryResults()) res = tryGet(await ds.query(q).waitForAllQueryResults())
# check: check:
# res.len == 2 res.len == 2
# res[0].key.get == key2 res[0].key.get == key2
# res[0].data == val2 res[0].data == val2
# res[1].key.get == key3 res[1].key.get == key3
# res[1].data == val3 res[1].data == val3
# test "Key should all list all keys at the same level": test "Key should all list all keys at the same level":
# let let
# queryKey = Key.init("/a").tryGet queryKey = Key.init("/a").tryGet
# q = Query.init(queryKey) q = Query.init(queryKey)
# (await ds.put(key1, val1)).tryGet (await ds.put(key1, val1)).tryGet
# (await ds.put(key2, val2)).tryGet (await ds.put(key2, val2)).tryGet
# (await ds.put(key3, val3)).tryGet (await ds.put(key3, val3)).tryGet
# let let
# iter = (await ds.query(q)).tryGet iter = (await ds.query(q)).tryGet
# var var
# res = tryGet(await ds.query(q).waitForAllQueryResults()) res = tryGet(await ds.query(q).waitForAllQueryResults())
# res.sort do (a, b: QueryResponse) -> int: res.sort do (a, b: QueryResponse) -> int:
# cmp(a.key.get.id, b.key.get.id) cmp(a.key.get.id, b.key.get.id)
# check: check:
# res.len == 3 res.len == 3
# res[0].key.get == key1 res[0].key.get == key1
# res[0].data == val1 res[0].data == val1
# res[1].key.get == key2 res[1].key.get == key2
# res[1].data == val2 res[1].data == val2
# res[2].key.get == key3 res[2].key.get == key3
# res[2].data == val3 res[2].data == val3
# (await iter.dispose()).tryGet (await iter.dispose()).tryGet
# if extended: if extended:
# test "Should apply limit": test "Should apply limit":
# let let
# key = Key.init("/a").tryGet key = Key.init("/a").tryGet
# q = Query.init(key, limit = 10) q = Query.init(key, limit = 10)
# for i in 0..<100: for i in 0..<100:
# let let
# key = Key.init(key, Key.init("/" & $i).tryGet).tryGet key = Key.init(key, Key.init("/" & $i).tryGet).tryGet
# val = ("val " & $i).toBytes val = ("val " & $i).toBytes
# (await ds.put(key, val)).tryGet (await ds.put(key, val)).tryGet
# let let
# res = tryGet(await ds.query(q).waitForAllQueryResults()) res = tryGet(await ds.query(q).waitForAllQueryResults())
# check: check:
# res.len == 10 res.len == 10
# test "Should not apply offset": test "Should not apply offset":
# let let
# key = Key.init("/a").tryGet key = Key.init("/a").tryGet
# q = Query.init(key, offset = 90) q = Query.init(key, offset = 90)
# for i in 0..<100: for i in 0..<100:
# let let
# key = Key.init(key, Key.init("/" & $i).tryGet).tryGet key = Key.init(key, Key.init("/" & $i).tryGet).tryGet
# val = ("val " & $i).toBytes val = ("val " & $i).toBytes
# (await ds.put(key, val)).tryGet (await ds.put(key, val)).tryGet
# let let
# res = tryGet(await ds.query(q).waitForAllQueryResults()) res = tryGet(await ds.query(q).waitForAllQueryResults())
# check: check:
# res.len == 10 res.len == 10
# test "Should not apply offset and limit": test "Should not apply offset and limit":
# let let
# key = Key.init("/a").tryGet key = Key.init("/a").tryGet
# q = Query.init(key, offset = 95, limit = 5) q = Query.init(key, offset = 95, limit = 5)
# for i in 0..<100: for i in 0..<100:
# let let
# key = Key.init(key, Key.init("/" & $i).tryGet).tryGet key = Key.init(key, Key.init("/" & $i).tryGet).tryGet
# val = ("val " & $i).toBytes val = ("val " & $i).toBytes
# (await ds.put(key, val)).tryGet (await ds.put(key, val)).tryGet
# let let
# res = tryGet(await ds.query(q).waitForAllQueryResults()) res = tryGet(await ds.query(q).waitForAllQueryResults())
# check: check:
# res.len == 5 res.len == 5
# for i in 0..<res.high: for i in 0..<res.high:
# let let
# val = ("val " & $(i + 95)).toBytes val = ("val " & $(i + 95)).toBytes
# key = Key.init(key, Key.init("/" & $(i + 95)).tryGet).tryGet key = Key.init(key, Key.init("/" & $(i + 95)).tryGet).tryGet
# check: check:
# res[i].key.get == key res[i].key.get == key
# res[i].data == val res[i].data == val
# test "Should apply sort order - descending": test "Should apply sort order - descending":
# let let
# key = Key.init("/a").tryGet key = Key.init("/a").tryGet
# q = Query.init(key, sort = SortOrder.Descending) q = Query.init(key, sort = SortOrder.Descending)
# var kvs: seq[QueryResponse] var kvs: seq[QueryResponse]
# for i in 0..<100: for i in 0..<100:
# let let
# k = Key.init(key, Key.init("/" & $i).tryGet).tryGet k = Key.init(key, Key.init("/" & $i).tryGet).tryGet
# val = ("val " & $i).toBytes val = ("val " & $i).toBytes
# kvs.add((k.some, val)) kvs.add((k.some, val))
# (await ds.put(k, val)).tryGet (await ds.put(k, val)).tryGet
# # lexicographic sort, as it comes from the backend # lexicographic sort, as it comes from the backend
# kvs.sort do (a, b: QueryResponse) -> int: kvs.sort do (a, b: QueryResponse) -> int:
# cmp(a.key.get.id, b.key.get.id) cmp(a.key.get.id, b.key.get.id)
# kvs = kvs.reversed kvs = kvs.reversed
# let let
# res = tryGet(await ds.query(q).waitForAllQueryResults()) res = tryGet(await ds.query(q).waitForAllQueryResults())
# check: check:
# res.len == 100 res.len == 100
# for i, r in res[1..^1]: for i, r in res[1..^1]:
# check: check:
# res[i].key.get == kvs[i].key.get res[i].key.get == kvs[i].key.get
# res[i].data == kvs[i].data res[i].data == kvs[i].data