From 22baf4186e04c221634aa1ba0d28b4dcb0995d3f Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 19 Jun 2023 12:46:10 -0400 Subject: [PATCH] Add 'all time' option for mempool graph --- backend/src/api/statistics/statistics-api.ts | 15 +++++++++++++-- backend/src/api/statistics/statistics.routes.ts | 12 +++++++----- .../statistics/statistics.component.html | 3 +++ .../components/statistics/statistics.component.ts | 11 +++++++++-- frontend/src/app/services/api.service.ts | 4 ++++ 5 files changed, 36 insertions(+), 9 deletions(-) diff --git a/backend/src/api/statistics/statistics-api.ts b/backend/src/api/statistics/statistics-api.ts index 1e8b0b7bb..77bf66a2c 100644 --- a/backend/src/api/statistics/statistics-api.ts +++ b/backend/src/api/statistics/statistics-api.ts @@ -211,7 +211,7 @@ class StatisticsApi { CAST(avg(vsize_1800) as DOUBLE) as vsize_1800, CAST(avg(vsize_2000) as DOUBLE) as vsize_2000 \ FROM statistics \ - WHERE added BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW() \ + ${interval === 'ALL TIME' ? '' : `WHERE added BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW()`} \ GROUP BY UNIX_TIMESTAMP(added) DIV ${div} \ ORDER BY statistics.added DESC;`; } @@ -259,7 +259,7 @@ class StatisticsApi { vsize_1800, vsize_2000 \ FROM statistics \ - WHERE added BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW() \ + ${interval === 'ALL TIME' ? '' : `WHERE added BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW()`} \ GROUP BY UNIX_TIMESTAMP(added) DIV ${div} \ ORDER BY statistics.added DESC;`; } @@ -386,6 +386,17 @@ class StatisticsApi { } } + public async $listAll(): Promise { + try { + const query = this.getQueryForDays(43200, 'ALL TIME'); // 12h interval + const [rows] = await DB.query({ sql: query, timeout: this.queryTimeout }); + return this.mapStatisticToOptimizedStatistic(rows as Statistic[]); + } catch (e) { + logger.err('$listAll() error' + (e instanceof Error ? e.message : e)); + return []; + } + } + private mapStatisticToOptimizedStatistic(statistic: Statistic[]): OptimizedStatistic[] { return statistic.map((s) => { return { diff --git a/backend/src/api/statistics/statistics.routes.ts b/backend/src/api/statistics/statistics.routes.ts index 2a5871dd6..31db5198c 100644 --- a/backend/src/api/statistics/statistics.routes.ts +++ b/backend/src/api/statistics/statistics.routes.ts @@ -15,10 +15,11 @@ class StatisticsRoutes { .get(config.MEMPOOL.API_URL_PREFIX + 'statistics/2y', this.$getStatisticsByTime.bind(this, '2y')) .get(config.MEMPOOL.API_URL_PREFIX + 'statistics/3y', this.$getStatisticsByTime.bind(this, '3y')) .get(config.MEMPOOL.API_URL_PREFIX + 'statistics/4y', this.$getStatisticsByTime.bind(this, '4y')) + .get(config.MEMPOOL.API_URL_PREFIX + 'statistics/all', this.$getStatisticsByTime.bind(this, 'all')) ; } - private async $getStatisticsByTime(time: '2h' | '24h' | '1w' | '1m' | '3m' | '6m' | '1y' | '2y' | '3y' | '4y', req: Request, res: Response) { + private async $getStatisticsByTime(time: '2h' | '24h' | '1w' | '1m' | '3m' | '6m' | '1y' | '2y' | '3y' | '4y' | 'all', req: Request, res: Response) { res.header('Pragma', 'public'); res.header('Cache-control', 'public'); res.setHeader('Expires', new Date(Date.now() + 1000 * 300).toUTCString()); @@ -26,10 +27,6 @@ class StatisticsRoutes { try { let result; switch (time as string) { - case '2h': - result = await statisticsApi.$list2H(); - res.setHeader('Expires', new Date(Date.now() + 1000 * 30).toUTCString()); - break; case '24h': result = await statisticsApi.$list24H(); res.setHeader('Expires', new Date(Date.now() + 1000 * 60).toUTCString()); @@ -58,8 +55,13 @@ class StatisticsRoutes { case '4y': result = await statisticsApi.$list4Y(); break; + case 'all': + result = await statisticsApi.$listAll(); + break; default: result = await statisticsApi.$list2H(); + res.setHeader('Expires', new Date(Date.now() + 1000 * 30).toUTCString()); + break; } res.json(result); } catch (e) { diff --git a/frontend/src/app/components/statistics/statistics.component.html b/frontend/src/app/components/statistics/statistics.component.html index 1b291e978..f36d74963 100644 --- a/frontend/src/app/components/statistics/statistics.component.html +++ b/frontend/src/app/components/statistics/statistics.component.html @@ -53,6 +53,9 @@ +
diff --git a/frontend/src/app/components/statistics/statistics.component.ts b/frontend/src/app/components/statistics/statistics.component.ts index 35137bff1..eebee5bce 100644 --- a/frontend/src/app/components/statistics/statistics.component.ts +++ b/frontend/src/app/components/statistics/statistics.component.ts @@ -72,8 +72,10 @@ export class StatisticsComponent implements OnInit { this.route .fragment .subscribe((fragment) => { - if (['2h', '24h', '1w', '1m', '3m', '6m', '1y', '2y', '3y', '4y'].indexOf(fragment) > -1) { + if (['2h', '24h', '1w', '1m', '3m', '6m', '1y', '2y', '3y', '4y', 'all'].indexOf(fragment) > -1) { this.radioGroupForm.controls.dateSpan.setValue(fragment, { emitEvent: false }); + } else { + this.radioGroupForm.controls.dateSpan.setValue('2h', { emitEvent: false }); } }); @@ -114,7 +116,12 @@ export class StatisticsComponent implements OnInit { if (this.radioGroupForm.controls.dateSpan.value === '3y') { return this.apiService.list3YStatistics$(); } - return this.apiService.list4YStatistics$(); + if (this.radioGroupForm.controls.dateSpan.value === '4y') { + return this.apiService.list4YStatistics$(); + } + if (this.radioGroupForm.controls.dateSpan.value === 'all') { + return this.apiService.listAllTimeStatistics$(); + } }) ) .subscribe((mempoolStats: any) => { diff --git a/frontend/src/app/services/api.service.ts b/frontend/src/app/services/api.service.ts index 8521ddc83..029d2183c 100644 --- a/frontend/src/app/services/api.service.ts +++ b/frontend/src/app/services/api.service.ts @@ -72,6 +72,10 @@ export class ApiService { return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/statistics/4y'); } + listAllTimeStatistics$(): Observable { + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/statistics/all'); + } + getTransactionTimes$(txIds: string[]): Observable { let params = new HttpParams(); txIds.forEach((txId: string) => {