From 39b1de326cd27d104c4c67a49cddcc67a25273d5 Mon Sep 17 00:00:00 2001 From: Xiliang Chen Date: Wed, 30 Mar 2022 21:17:54 +1300 Subject: [PATCH] implement entriesPaged and keysPages for query at (#4701) * implement entriesPaged and keysPages for query at * remove redudent declaration --- packages/api-base/src/types/storage.ts | 4 ++-- packages/api/src/base/Decorate.ts | 22 +++++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/packages/api-base/src/types/storage.ts b/packages/api-base/src/types/storage.ts index 2d19c875a0..c849b6438d 100644 --- a/packages/api-base/src/types/storage.ts +++ b/packages/api-base/src/types/storage.ts @@ -74,12 +74,10 @@ export interface StorageEntryBase) */ entriesAt: , K extends AnyTuple = A>(hash: Hash | Uint8Array | string, ...args: DropLast>) => PromiseOrObs, T][]>; - entriesPaged: , K extends AnyTuple = A>(opts: PaginationOptions[0]>) => PromiseOrObs, T][]>; /** * @deprecated Use api.at() */ keysAt: (hash: Hash | Uint8Array | string, ...args: DropLast>) => PromiseOrObs[]>; - keysPaged: (opts: PaginationOptions[0]>) => PromiseOrObs[]>; /** * @deprecated The underlying RPC this been marked unsafe and is generally not exposed */ @@ -95,11 +93,13 @@ export interface StorageEntryBase { entries: , K extends AnyTuple = A>(...args: DropLast>) => PromiseOrObs, T][]>; + entriesPaged: , K extends AnyTuple = A>(opts: PaginationOptions[0]>) => PromiseOrObs, T][]>; hash: (...args: Parameters) => PromiseOrObs; is: (key: IStorageKey) => key is IStorageKey; key: (...args: Parameters) => string; keyPrefix: (...args: DropLast>) => string; keys: (...args: DropLast>) => PromiseOrObs[]>; + keysPaged: (opts: PaginationOptions[0]>) => PromiseOrObs[]>; size: (...args: Parameters) => PromiseOrObs; } diff --git a/packages/api/src/base/Decorate.ts b/packages/api/src/base/Decorate.ts index ac1e4662df..d67d46c2b1 100644 --- a/packages/api/src/base/Decorate.ts +++ b/packages/api/src/base/Decorate.ts @@ -543,7 +543,7 @@ export abstract class Decorate extends Events { decorated.entriesPaged = decorateMethod( memo(this.#instanceId, (opts: PaginationOptions): Observable<[StorageKey, Codec][]> => - this._retrieveMapEntriesPaged(creator, opts))); + this._retrieveMapEntriesPaged(creator, undefined, opts))); decorated.keys = decorateMethod( memo(this.#instanceId, (...args: unknown[]): Observable => @@ -556,7 +556,7 @@ export abstract class Decorate extends Events { decorated.keysPaged = decorateMethod( memo(this.#instanceId, (opts: PaginationOptions): Observable => - this._retrieveMapKeysPaged(creator, opts))); + this._retrieveMapKeysPaged(creator, undefined, opts))); } if (this.supportMulti && creator.meta.type.isMap) { @@ -610,9 +610,17 @@ export abstract class Decorate extends Events { memo(this.#instanceId, (...args: unknown[]): Observable<[StorageKey, Codec][]> => this._retrieveMapEntries(creator, blockHash, args))); + decorated.entriesPaged = decorateMethod( + memo(this.#instanceId, (opts: PaginationOptions): Observable<[StorageKey, Codec][]> => + this._retrieveMapEntriesPaged(creator, blockHash, opts))); + decorated.keys = decorateMethod( memo(this.#instanceId, (...args: unknown[]): Observable => this._retrieveMapKeys(creator, blockHash, args))); + + decorated.keysPaged = decorateMethod( + memo(this.#instanceId, (opts: PaginationOptions): Observable => + this._retrieveMapKeysPaged(creator, blockHash, opts))); } if (this.supportMulti && creator.meta.type.isMap) { @@ -703,13 +711,13 @@ export abstract class Decorate extends Events { ); } - private _retrieveMapKeysPaged ({ iterKey, meta, method, section }: StorageEntry, opts: PaginationOptions): Observable { + private _retrieveMapKeysPaged ({ iterKey, meta, method, section }: StorageEntry, at: Hash | Uint8Array | string | undefined, opts: PaginationOptions): Observable { assert(iterKey && meta.type.isMap, 'keys can only be retrieved on maps'); const headKey = iterKey(...opts.args).toHex(); const setMeta = (key: StorageKey) => key.setMeta(meta, section, method); - return this._rpcCore.state.getKeysPaged(headKey, opts.pageSize, opts.startKey || headKey).pipe( + return this._rpcCore.state.getKeysPaged(headKey, opts.pageSize, opts.startKey || headKey, at).pipe( map((keys) => keys.map(setMeta)) ); } @@ -732,11 +740,11 @@ export abstract class Decorate extends Events { ); } - private _retrieveMapEntriesPaged (entry: StorageEntry, opts: PaginationOptions): Observable<[StorageKey, Codec][]> { - return this._retrieveMapKeysPaged(entry, opts).pipe( + private _retrieveMapEntriesPaged (entry: StorageEntry, at: Hash | Uint8Array | string | undefined, opts: PaginationOptions): Observable<[StorageKey, Codec][]> { + return this._retrieveMapKeysPaged(entry, at, opts).pipe( switchMap((keys) => keys.length - ? this._rpcCore.state.queryStorageAt(keys).pipe( + ? this._rpcCore.state.queryStorageAt(keys, at).pipe( map((valsArr) => valsArr.map((value, index): [StorageKey, Codec] => [keys[index], value]) )