@@ -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