From 028f04e47fefad96c3baba7e32093dd7e5eeddfb Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 20 Mar 2021 18:18:49 +0100 Subject: [PATCH] Optimize society multi-derive (#3342) * Optimize society multi-derive * isVoting flag * isDefenderVoter --- packages/api-derive/src/society/member.ts | 23 ++---------- packages/api-derive/src/society/members.ts | 43 +++++++++++++++++----- packages/api-derive/src/types.ts | 1 + 3 files changed, 37 insertions(+), 30 deletions(-) diff --git a/packages/api-derive/src/society/member.ts b/packages/api-derive/src/society/member.ts index 00bddfa92f..af6c60e9d0 100644 --- a/packages/api-derive/src/society/member.ts +++ b/packages/api-derive/src/society/member.ts @@ -2,9 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import type { ApiInterfaceRx } from '@polkadot/api/types'; -import type { bool, Option, Vec } from '@polkadot/types'; -import type { AccountId, Balance, BlockNumber, SocietyVote, StrikeCount, VouchingStatus } from '@polkadot/types/interfaces'; -import type { ITuple } from '@polkadot/types/types'; +import type { AccountId } from '@polkadot/types/interfaces'; import type { Observable } from '@polkadot/x-rxjs'; import type { DeriveSocietyMember } from '../types'; @@ -12,28 +10,13 @@ import { map } from '@polkadot/x-rxjs/operators'; import { memo } from '../util'; -type Result = [Vec>, StrikeCount, Option, bool, Option]; - /** * @description Get the member info for a society */ export function member (instanceId: string, api: ApiInterfaceRx): (accountId: AccountId) => Observable { return memo(instanceId, (accountId: AccountId): Observable => - api.queryMulti([ - [api.query.society.payouts, accountId], - [api.query.society.strikes, accountId], - [api.query.society.defenderVotes, accountId], - [api.query.society.suspendedMembers, accountId], - [api.query.society.vouching, accountId] - ]).pipe( - map(([payouts, strikes, defenderVotes, suspended, vouching]: Result): DeriveSocietyMember => ({ - accountId, - isSuspended: suspended.isTrue, - payouts, - strikes, - vote: defenderVotes.unwrapOr(undefined), - vouching: vouching.unwrapOr(undefined) - })) + api.derive.society._members([accountId]).pipe( + map(([result]) => result) ) ); } diff --git a/packages/api-derive/src/society/members.ts b/packages/api-derive/src/society/members.ts index 61896c9d9f..81b7960a40 100644 --- a/packages/api-derive/src/society/members.ts +++ b/packages/api-derive/src/society/members.ts @@ -2,28 +2,51 @@ // SPDX-License-Identifier: Apache-2.0 import type { ApiInterfaceRx } from '@polkadot/api/types'; -import type { AccountId } from '@polkadot/types/interfaces'; +import type { bool, Option, Vec } from '@polkadot/types'; +import type { AccountId, Balance, BlockNumber, SocietyVote, StrikeCount, VouchingStatus } from '@polkadot/types/interfaces'; +import type { ITuple } from '@polkadot/types/types'; import type { Observable } from '@polkadot/x-rxjs'; import type { DeriveSocietyMember } from '../types'; -import { combineLatest } from '@polkadot/x-rxjs'; -import { switchMap } from '@polkadot/x-rxjs/operators'; +import { combineLatest, of } from '@polkadot/x-rxjs'; +import { map, switchMap } from '@polkadot/x-rxjs/operators'; import { memo } from '../util'; +type Result = [AccountId[], Vec>[], StrikeCount[], Option[], bool[], Option[]]; + +export function _members (instanceId: string, api: ApiInterfaceRx): (accountIds: AccountId[]) => Observable { + return memo(instanceId, (accountIds: AccountId[]): Observable => + combineLatest([ + of(accountIds), + api.query.society.payouts.multi(accountIds), + api.query.society.strikes.multi(accountIds), + api.query.society.defenderVotes.multi(accountIds), + api.query.society.suspendedMembers.multi(accountIds), + api.query.society.vouching.multi(accountIds) + ]).pipe( + map(([accountIds, payouts, strikes, defenderVotes, suspended, vouching]) => + accountIds.map((accountId, index) => ({ + accountId, + isDefenderVoter: defenderVotes[index].isSome, + isSuspended: suspended[index].isTrue, + payouts: payouts[index], + strikes: strikes[index], + vote: defenderVotes[index].unwrapOr(undefined), + vouching: vouching[index].unwrapOr(undefined) + })) + ) + ) + ); +} + /** * @description Get the member info for a society */ export function members (instanceId: string, api: ApiInterfaceRx): () => Observable { return memo(instanceId, (): Observable => api.query.society.members().pipe( - switchMap((members): Observable => - combineLatest( - members.map((accountId): Observable => - api.derive.society.member(accountId) - ) - ) - ) + switchMap((members) => api.derive.society._members(members)) ) ); } diff --git a/packages/api-derive/src/types.ts b/packages/api-derive/src/types.ts index 31710bd225..df21af0181 100644 --- a/packages/api-derive/src/types.ts +++ b/packages/api-derive/src/types.ts @@ -108,6 +108,7 @@ export interface DeriveSocietyCandidate { export interface DeriveSocietyMember { accountId: AccountId; + isDefenderVoter: boolean; isSuspended: boolean; payouts: [BlockNumber, Balance][]; strikes: StrikeCount;