From 68417614600e90c889514636ae1b12f80dca2fa1 Mon Sep 17 00:00:00 2001 From: Claudiu Lataretu Date: Thu, 30 Jan 2025 18:13:17 +0200 Subject: [PATCH] MEX-662: add filtering by pair address in token trading activity ES query Signed-off-by: Claudiu Lataretu --- .../services/analytics.compute.service.ts | 56 +++++++------------ .../services/analytics.setter.service.ts | 8 +-- .../elastic-search/entities/terms.query.ts | 15 +++++ .../services/es.events.service.ts | 12 ++-- 4 files changed, 46 insertions(+), 45 deletions(-) create mode 100644 src/services/elastic-search/entities/terms.query.ts diff --git a/src/modules/analytics/services/analytics.compute.service.ts b/src/modules/analytics/services/analytics.compute.service.ts index fb13222e0..0f1170db7 100644 --- a/src/modules/analytics/services/analytics.compute.service.ts +++ b/src/modules/analytics/services/analytics.compute.service.ts @@ -283,8 +283,8 @@ export class AnalyticsComputeService { @ErrorLoggerAsync() @GetOrSetCache({ baseKey: 'analytics', - remoteTtl: Constants.oneMinute() * 2, - localTtl: Constants.oneMinute(), + remoteTtl: Constants.oneMinute() * 5, + localTtl: Constants.oneMinute() * 3, }) async pairTradingActivity( pairAddress: string, @@ -295,8 +295,8 @@ export class AnalyticsComputeService { @ErrorLoggerAsync() @GetOrSetCache({ baseKey: 'analytics', - remoteTtl: Constants.oneMinute() * 2, - localTtl: Constants.oneMinute(), + remoteTtl: Constants.oneMinute() * 5, + localTtl: Constants.oneMinute() * 3, }) async tokenTradingActivity( tokenID: string, @@ -385,40 +385,24 @@ export class AnalyticsComputeService { async computeTokenTradingActivity( tokenID: string, ): Promise { - const filteredEvents: RawElasticEventType[] = []; - const pairsAddresses = await this.routerAbi.pairsAddress(); - let latestTimestamp = Math.floor(Date.now() / 1000); - const size = 50; + let filteredEvents: RawElasticEventType[] = []; + const pairsMetadata = await this.routerAbi.pairsMetadata(); - const createUniqueIdentifier = (event: RawElasticEventType) => { - return `${event.txHash}-${event.shardID}-${event.order}`; - }; + const pairsAddresses = pairsMetadata + .filter( + (pair) => + pair.firstTokenID === tokenID || + pair.secondTokenID === tokenID, + ) + .map((pair) => pair.address); + + filteredEvents = await this.elasticEventsService.getTokenTradingEvents( + tokenID, + pairsAddresses, + 10, + ); - while (filteredEvents.length < 10) { - const events = - await this.elasticEventsService.getTokenTradingEvents( - tokenID, - latestTimestamp, - size, - ); - filteredEvents.push( - ...events - .filter((event) => pairsAddresses.includes(event.address)) - .reduce((unique, event) => { - const eventId = createUniqueIdentifier(event); - return unique.some( - (e) => createUniqueIdentifier(e) === eventId, - ) - ? unique - : [...unique, event]; - }, [] as RawElasticEventType[]) - .slice(0, 10), - ); - if (events.length < size) { - break; - } - latestTimestamp = filteredEvents[0].timestamp; - } + filteredEvents = filteredEvents.slice(0, 10); return filteredEvents.map((event) => { const eventConverted = convertEventTopicsAndDataToBase64(event); diff --git a/src/modules/analytics/services/analytics.setter.service.ts b/src/modules/analytics/services/analytics.setter.service.ts index 5487a0a91..7db02cfd1 100644 --- a/src/modules/analytics/services/analytics.setter.service.ts +++ b/src/modules/analytics/services/analytics.setter.service.ts @@ -80,8 +80,8 @@ export class AnalyticsSetterService extends GenericSetterService { return await this.setData( this.getCacheKey('pairTradingActivity', pairAddress), value, - Constants.oneMinute() * 2, - Constants.oneMinute(), + Constants.oneMinute() * 5, + Constants.oneMinute() * 3, ); } @@ -92,8 +92,8 @@ export class AnalyticsSetterService extends GenericSetterService { return await this.setData( this.getCacheKey('tokenTradingActivity', tokenID), value, - Constants.oneMinute() * 2, - Constants.oneMinute(), + Constants.oneMinute() * 5, + Constants.oneMinute() * 3, ); } diff --git a/src/services/elastic-search/entities/terms.query.ts b/src/services/elastic-search/entities/terms.query.ts new file mode 100644 index 000000000..f7904245d --- /dev/null +++ b/src/services/elastic-search/entities/terms.query.ts @@ -0,0 +1,15 @@ +import { AbstractQuery } from '@multiversx/sdk-nestjs-elastic'; + +export class CustomTermsQuery extends AbstractQuery { + constructor(private readonly key: string, private readonly values: any) { + super(); + } + + getQuery(): any { + return { + terms: { + [this.key]: this.values, + }, + }; + } +} diff --git a/src/services/elastic-search/services/es.events.service.ts b/src/services/elastic-search/services/es.events.service.ts index 3d02142bf..2307c993f 100644 --- a/src/services/elastic-search/services/es.events.service.ts +++ b/src/services/elastic-search/services/es.events.service.ts @@ -12,6 +12,7 @@ import { Logger } from 'winston'; import { RawElasticEventType } from '../entities/raw.elastic.event'; import { SwapEvent } from '@multiversx/sdk-exchange'; import { convertEventTopicsAndDataToBase64 } from 'src/utils/elastic.search.utils'; +import { CustomTermsQuery } from '../entities/terms.query'; @Injectable() export class ElasticSearchEventsService { @@ -227,7 +228,7 @@ export class ElasticSearchEventsService { async getTokenTradingEvents( tokenID: string, - timestamp: number, + pairsAddresses: string[], size: number, ): Promise { const pagination = new ElasticPagination(); @@ -248,11 +249,12 @@ export class ElasticSearchEventsService { SWAP_IDENTIFIER.SWAP_FIXED_OUTPUT, ), ]), - QueryType.Range('timestamp', { - key: 'lte', - value: timestamp, - }), ]; + + elasticQueryAdapter.filter = [ + new CustomTermsQuery('address', pairsAddresses), + ]; + elasticQueryAdapter.sort = [ { name: 'timestamp', order: ElasticSortOrder.descending }, ];