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

Commit 4bd1912

Browse files
authored
Implement fixes for unknown relayer ordering (#370)
1 parent 3ec58f8 commit 4bd1912

2 files changed

Lines changed: 151 additions & 133 deletions

File tree

src/relayers/get-relayers-for-token-in-period.js

Lines changed: 66 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const elasticsearch = require('../util/elasticsearch');
44
const getDatesForPeriod = require('../util/get-dates-for-time-period');
55
const Relayer = require('../model/relayer');
66

7-
const getOrderByKey = sortBy => {
7+
const getElasticsearchOrderByKey = sortBy => {
88
if (sortBy === 'fillCount') {
99
return '_count';
1010
}
@@ -44,11 +44,8 @@ const getRelayersForTokenInPeriod = async (tokenAddress, period, options) => {
4444
stats_by_relayer: {
4545
terms: {
4646
field: 'relayerId',
47-
size: limit * page,
4847
missing: -1,
49-
order: {
50-
[getOrderByKey(sortBy)]: 'desc',
51-
},
48+
size: limit * page,
5249
},
5350
aggs: {
5451
fillVolume: {
@@ -61,25 +58,60 @@ const getRelayersForTokenInPeriod = async (tokenAddress, period, options) => {
6158
field: 'filledAmountUSD',
6259
},
6360
},
64-
tradeCount: {
61+
rawTradeCount: {
6562
sum: {
6663
field: 'tradeCountContribution',
6764
},
6865
},
69-
tradeVolume: {
66+
rawTradeVolume: {
7067
sum: {
7168
field: 'tradedAmount',
7269
},
7370
},
74-
tradeVolumeUSD: {
71+
rawTradeVolumeUSD: {
7572
sum: {
7673
field: 'tradedAmountUSD',
7774
},
7875
},
76+
tradeCount: {
77+
bucket_script: {
78+
buckets_path: {
79+
fillCount: '_count',
80+
tradeCount: 'rawTradeCount',
81+
},
82+
script:
83+
'if (params.tradeCount == 0) { params.fillCount } else { params.tradeCount }',
84+
},
85+
},
86+
tradeVolume: {
87+
bucket_script: {
88+
buckets_path: {
89+
fillVolume: 'fillVolume',
90+
tradeVolume: 'rawTradeVolume',
91+
},
92+
script:
93+
'if (params.tradeVolume == 0) { params.fillVolume } else { params.tradeVolume }',
94+
},
95+
},
96+
tradeVolumeUSD: {
97+
bucket_script: {
98+
buckets_path: {
99+
fillVolumeUSD: 'fillVolumeUSD',
100+
tradeVolumeUSD: 'rawTradeVolumeUSD',
101+
},
102+
script:
103+
'if (params.tradeVolumeUSD == 0) { params.fillVolumeUSD } else { params.tradeVolumeUSD }',
104+
},
105+
},
79106
bucket_truncate: {
80107
bucket_sort: {
81108
size: limit,
82109
from: startIndex,
110+
sort: [
111+
{
112+
[getElasticsearchOrderByKey(sortBy)]: { order: 'desc' },
113+
},
114+
],
83115
},
84116
},
85117
},
@@ -98,38 +130,35 @@ const getRelayersForTokenInPeriod = async (tokenAddress, period, options) => {
98130
);
99131

100132
const relayers = await Relayer.find({ lookupId: { $in: relayerIds } }).lean();
101-
102133
const relayerCount = response.body.aggregations.relayerCount.value;
134+
const relayersWithStats = response.body.aggregations.stats_by_relayer.buckets.map(
135+
bucket => {
136+
const relayer = relayers.find(r => r.lookupId === bucket.key);
103137

104-
return {
105-
relayers: response.body.aggregations.stats_by_relayer.buckets.map(
106-
bucket => {
107-
const relayer =
108-
bucket.key === -1
109-
? { id: 'unknown', name: 'Unknown', slug: 'unknown' }
110-
: relayers.find(r => r.lookupId === bucket.key);
111-
112-
return {
113-
id: _.get(relayer, 'id', null),
114-
imageUrl: _.get(relayer, 'imageUrl', null),
115-
name: _.get(relayer, 'name', null),
116-
slug: _.get(relayer, 'slug', null),
117-
stats: {
118-
fillCount: bucket.doc_count,
119-
fillVolume: {
120-
token: bucket.fillVolume.value,
121-
USD: bucket.fillVolumeUSD.value,
122-
},
123-
tradeCount: bucket.tradeCount.value,
124-
tradeVolume: {
125-
token: bucket.tradeVolume.value,
126-
USD: bucket.tradeVolumeUSD.value,
127-
},
138+
return {
139+
id: _.get(relayer, 'id', 'unknown'),
140+
imageUrl: _.get(relayer, 'imageUrl', null),
141+
name: _.get(relayer, 'name', 'Unknown'),
142+
slug: _.get(relayer, 'slug', 'unknown'),
143+
stats: {
144+
fillCount: bucket.doc_count,
145+
fillVolume: {
146+
token: bucket.fillVolume.value,
147+
USD: bucket.fillVolumeUSD.value,
128148
},
129-
url: _.get(relayer, 'url', null),
130-
};
131-
},
132-
),
149+
tradeCount: bucket.tradeCount.value,
150+
tradeVolume: {
151+
token: bucket.tradeVolume.value,
152+
USD: bucket.tradeVolumeUSD.value,
153+
},
154+
},
155+
url: _.get(relayer, 'url', null),
156+
};
157+
},
158+
);
159+
160+
return {
161+
relayers: relayersWithStats,
133162
resultCount: relayerCount,
134163
};
135164
};

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

Lines changed: 85 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -9,124 +9,113 @@ const getRelayersWithStatsForDates = async (dateFrom, dateTo, options) => {
99
limit: 20,
1010
});
1111

12-
const [unknownResults, knownResults] = await Promise.all([
13-
elasticsearch.getClient().search({
14-
index: 'fills',
15-
body: {
16-
aggs: {
17-
fillCount: {
18-
value_count: { field: '_id' },
19-
},
20-
fillVolume: {
21-
sum: { field: 'value' },
22-
},
23-
traderCount: {
24-
cardinality: { field: 'traders' },
12+
const startIndex = (page - 1) * limit;
13+
14+
const response = await elasticsearch.getClient().search({
15+
index: 'fills',
16+
body: {
17+
aggs: {
18+
relayers: {
19+
terms: {
20+
field: 'relayerId',
21+
missing: -1,
22+
size: limit * page,
2523
},
26-
},
27-
size: 0,
28-
query: {
29-
bool: {
30-
filter: [
31-
{
32-
range: {
33-
date: {
34-
gte: dateFrom,
35-
lte: dateTo,
36-
},
37-
},
24+
aggs: {
25+
fillVolume: {
26+
sum: { field: 'value' },
27+
},
28+
traderCount: {
29+
cardinality: { field: 'traders' },
30+
},
31+
rawTradeCount: {
32+
sum: {
33+
field: 'tradeCountContribution',
3834
},
39-
],
40-
must_not: [{ exists: { field: 'relayerId' } }],
41-
},
42-
},
43-
},
44-
}),
45-
elasticsearch.getClient().search({
46-
index: 'fills',
47-
body: {
48-
aggs: {
49-
stats_by_relayer: {
50-
terms: {
51-
field: 'relayerId',
52-
order: { tradeVolume: 'desc' },
53-
size: 500,
5435
},
55-
aggs: {
56-
fillVolume: {
57-
sum: { field: 'value' },
36+
rawTradeVolume: {
37+
sum: {
38+
field: 'tradeVolume',
5839
},
59-
tradeCount: {
60-
sum: { field: 'tradeCountContribution' },
40+
},
41+
tradeCount: {
42+
bucket_script: {
43+
buckets_path: {
44+
fillCount: '_count',
45+
tradeCount: 'rawTradeCount',
46+
},
47+
script:
48+
'if (params.tradeCount == 0) { params.fillCount } else { params.tradeCount }',
6149
},
62-
tradeVolume: {
63-
sum: { field: 'tradeVolume' },
50+
},
51+
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 }',
6459
},
65-
traderCount: {
66-
cardinality: { field: 'traders' },
60+
},
61+
bucket_truncate: {
62+
bucket_sort: {
63+
size: limit,
64+
from: startIndex,
65+
sort: [
66+
{
67+
tradeVolume: { order: 'desc' },
68+
},
69+
],
6770
},
6871
},
6972
},
7073
},
71-
size: 0,
72-
query: {
73-
range: {
74-
date: {
75-
gte: dateFrom,
76-
lte: dateTo,
77-
},
74+
relayerCount: {
75+
cardinality: {
76+
field: 'relayerId',
7877
},
7978
},
8079
},
81-
}),
82-
]);
83-
84-
const stats = _(knownResults.body.aggregations.stats_by_relayer.buckets)
85-
.map(x => ({
86-
fillCount: x.doc_count,
87-
fillVolume: x.fillVolume.value,
88-
relayerId: x.key,
89-
tradeCount: x.tradeCount.value,
90-
tradeVolume: x.tradeVolume.value,
91-
traderCount: x.traderCount.value,
92-
}))
93-
.concat({
94-
fillCount: unknownResults.body.aggregations.fillCount.value,
95-
fillVolume: unknownResults.body.aggregations.fillVolume.value,
96-
tradeCount: unknownResults.body.aggregations.fillCount.value,
97-
tradeVolume: unknownResults.body.aggregations.fillVolume.value,
98-
traderCount: unknownResults.body.aggregations.traderCount.value,
99-
})
100-
.orderBy('tradeVolume', 'desc')
101-
.drop((page - 1) * limit)
102-
.take(limit)
103-
.value();
80+
size: 0,
81+
query: {
82+
range: {
83+
date: {
84+
gte: dateFrom,
85+
lte: dateTo,
86+
},
87+
},
88+
},
89+
},
90+
});
10491

105-
const relayerIds = stats.map(x => x.relayerId);
92+
const relayerCount = response.body.aggregations.relayerCount.value;
93+
const relayerBuckets = response.body.aggregations.relayers.buckets;
94+
const relayerIds = relayerBuckets.map(bucket => bucket.key);
10695
const relayers = await Relayer.find({ lookupId: { $in: relayerIds } }).lean();
10796

108-
const results = stats.map(x => {
109-
if (x.relayerId === undefined) {
110-
return {
111-
id: 'unknown',
112-
name: 'Unknown',
113-
slug: 'unknown',
114-
stats: _.omit(x, 'relayerId'),
115-
};
116-
}
117-
118-
const relayer = relayers.find(r => r.lookupId === x.relayerId);
97+
const relayersWithStats = relayerBuckets.map(bucket => {
98+
const relayer = relayers.find(r => r.lookupId === bucket.key);
11999

120100
return {
121-
..._.pick(relayer, 'name', 'id', 'url', 'imageUrl', 'slug'),
122-
stats: _.omit(x, 'relayerId'),
101+
id: _.get(relayer, 'id', 'unknown'),
102+
imageUrl: _.get(relayer, 'imageUrl', null),
103+
name: _.get(relayer, 'name', 'Unknown'),
104+
slug: _.get(relayer, 'slug', 'unknown'),
105+
stats: {
106+
fillCount: bucket.doc_count,
107+
fillVolume: bucket.fillVolume.value,
108+
tradeCount: bucket.tradeCount.value,
109+
tradeVolume: bucket.tradeVolume.value,
110+
traderCount: bucket.traderCount.value,
111+
},
112+
url: _.get(relayer, 'url', null),
123113
};
124114
});
125115

126116
return {
127-
relayers: results,
128-
resultCount:
129-
knownResults.body.aggregations.stats_by_relayer.buckets.length + 1,
117+
relayers: relayersWithStats,
118+
resultCount: relayerCount,
130119
};
131120
};
132121

0 commit comments

Comments
 (0)