Skip to content
This repository was archived by the owner on Aug 12, 2023. It is now read-only.

Commit 349cfdf

Browse files
authored
Add percentage changes to relayers endpoint (#393)
1 parent 830f233 commit 349cfdf

File tree

1 file changed

+136
-28
lines changed

1 file changed

+136
-28
lines changed

src/relayers/get-relayers-with-stats-for-dates.js

Lines changed: 136 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
const _ = require('lodash');
2+
const moment = require('moment');
23

34
const elasticsearch = require('../util/elasticsearch');
45
const Relayer = require('../model/relayer');
56

6-
const getRelayersWithStatsForDates = async (dateFrom, dateTo, options) => {
7-
const { page, limit } = _.defaults({}, options, {
8-
page: 1,
9-
limit: 20,
10-
});
7+
const getPreviousPeriod = (dateFrom, dateTo) => {
8+
const diff = moment(dateTo).diff(dateFrom);
9+
const prevDateTo = moment(dateFrom)
10+
.subtract('millisecond', 1)
11+
.toDate();
12+
const prevDateFrom = moment(prevDateTo)
13+
.subtract('millisecond', diff)
14+
.toDate();
1115

12-
const startIndex = (page - 1) * limit;
16+
return { prevDateFrom, prevDateTo };
17+
};
18+
19+
const getStatsForPreviousPeriod = async (relayerIds, dateFrom, dateTo) => {
20+
const { prevDateFrom, prevDateTo } = getPreviousPeriod(dateFrom, dateTo);
1321

1422
const response = await elasticsearch.getClient().search({
1523
index: 'fills',
@@ -19,6 +27,7 @@ const getRelayersWithStatsForDates = async (dateFrom, dateTo, options) => {
1927
terms: {
2028
field: 'relayerId',
2129
missing: -1,
30+
order: { tradeVolume: 'desc' },
2231
size: 500,
2332
},
2433
aggs: {
@@ -28,45 +37,123 @@ const getRelayersWithStatsForDates = async (dateFrom, dateTo, options) => {
2837
traderCount: {
2938
cardinality: { field: 'traders' },
3039
},
31-
rawTradeCount: {
40+
tradeCount: {
3241
sum: {
3342
field: 'tradeCountContribution',
3443
},
3544
},
36-
rawTradeVolume: {
45+
tradeVolume: {
3746
sum: {
3847
field: 'tradeVolume',
3948
},
4049
},
41-
tradeCount: {
42-
bucket_script: {
43-
buckets_path: {
44-
fillCount: '_count',
45-
tradeCount: 'rawTradeCount',
50+
},
51+
},
52+
},
53+
size: 0,
54+
query: {
55+
bool: {
56+
must: {
57+
bool: {
58+
should: [
59+
relayerIds.includes(-1)
60+
? {
61+
bool: {
62+
must_not: {
63+
exists: {
64+
field: 'relayerId',
65+
},
66+
},
67+
},
68+
}
69+
: undefined,
70+
{
71+
terms: {
72+
relayerId: relayerIds,
73+
},
74+
},
75+
].filter(s => s !== undefined),
76+
},
77+
},
78+
filter: [
79+
{
80+
range: {
81+
date: {
82+
gte: prevDateFrom,
83+
lte: prevDateTo,
4684
},
47-
script:
48-
'if (params.tradeCount == 0) { params.fillCount } else { params.tradeCount }',
85+
},
86+
},
87+
],
88+
},
89+
},
90+
},
91+
});
92+
93+
const { buckets } = response.body.aggregations.relayers;
94+
95+
return relayerIds.map(relayerId => {
96+
const bucket = buckets.find(b => b.key === relayerId);
97+
98+
return {
99+
fillCount: _.get(bucket, 'doc_count', 0),
100+
fillVolume: _.get(bucket, 'fillVolume.value', 0),
101+
tradeCount: _.get(bucket, 'tradeCount.value', 0),
102+
tradeVolume: _.get(bucket, 'tradeVolume.value', 0),
103+
traderCount: _.get(bucket, 'traderCount.value', 0),
104+
relayerId,
105+
};
106+
});
107+
};
108+
109+
const getPercentageChange = (valueA, valueB) => {
110+
if (valueA === 0) {
111+
return null;
112+
}
113+
114+
return ((valueB - valueA) / valueA) * 100;
115+
};
116+
117+
const getRelayersWithStatsForDates = async (dateFrom, dateTo, options) => {
118+
const { page, limit } = _.defaults({}, options, {
119+
page: 1,
120+
limit: 20,
121+
});
122+
123+
const startIndex = (page - 1) * limit;
124+
125+
const response = await elasticsearch.getClient().search({
126+
index: 'fills',
127+
body: {
128+
aggs: {
129+
relayers: {
130+
terms: {
131+
field: 'relayerId',
132+
missing: -1,
133+
order: { tradeVolume: 'desc' },
134+
size: 500,
135+
},
136+
aggs: {
137+
fillVolume: {
138+
sum: { field: 'value' },
139+
},
140+
traderCount: {
141+
cardinality: { field: 'traders' },
142+
},
143+
tradeCount: {
144+
sum: {
145+
field: 'tradeCountContribution',
49146
},
50147
},
51148
tradeVolume: {
52-
bucket_script: {
53-
buckets_path: {
54-
fillVolume: 'fillVolume',
55-
tradeVolume: 'rawTradeVolume',
56-
},
57-
script:
58-
'if (params.tradeVolume == 0) { params.fillVolume } else { params.tradeVolume }',
149+
sum: {
150+
field: 'tradeVolume',
59151
},
60152
},
61153
bucket_truncate: {
62154
bucket_sort: {
63155
size: limit,
64156
from: startIndex,
65-
sort: [
66-
{
67-
tradeVolume: { order: 'desc' },
68-
},
69-
],
70157
},
71158
},
72159
},
@@ -92,10 +179,14 @@ const getRelayersWithStatsForDates = async (dateFrom, dateTo, options) => {
92179
const relayerCount = response.body.aggregations.relayerCount.value;
93180
const relayerBuckets = response.body.aggregations.relayers.buckets;
94181
const relayerIds = relayerBuckets.map(bucket => bucket.key);
95-
const relayers = await Relayer.find({ lookupId: { $in: relayerIds } }).lean();
182+
const [relayers, previousStats] = await Promise.all([
183+
Relayer.find({ lookupId: { $in: relayerIds } }).lean(),
184+
getStatsForPreviousPeriod(relayerIds, dateFrom, dateTo),
185+
]);
96186

97187
const relayersWithStats = relayerBuckets.map(bucket => {
98188
const relayer = relayers.find(r => r.lookupId === bucket.key);
189+
const prev = previousStats.find(s => s.relayerId === bucket.key);
99190

100191
return {
101192
id: _.get(relayer, 'id', 'unknown'),
@@ -104,10 +195,27 @@ const getRelayersWithStatsForDates = async (dateFrom, dateTo, options) => {
104195
slug: _.get(relayer, 'slug', 'unknown'),
105196
stats: {
106197
fillCount: bucket.doc_count,
198+
fillCountChange: getPercentageChange(prev.fillCount, bucket.doc_count),
107199
fillVolume: bucket.fillVolume.value,
200+
fillVolumeChange: getPercentageChange(
201+
prev.fillVolume,
202+
bucket.fillVolume.value,
203+
),
108204
tradeCount: bucket.tradeCount.value,
205+
tradeCountChange: getPercentageChange(
206+
prev.tradeCount,
207+
bucket.tradeCount.value,
208+
),
109209
tradeVolume: bucket.tradeVolume.value,
210+
tradeVolumeChange: getPercentageChange(
211+
prev.tradeVolume,
212+
bucket.tradeVolume.value,
213+
),
110214
traderCount: bucket.traderCount.value,
215+
traderCountChange: getPercentageChange(
216+
prev.traderCount,
217+
bucket.traderCount.value,
218+
),
111219
},
112220
url: _.get(relayer, 'url', null),
113221
};

0 commit comments

Comments
 (0)