11const _ = require ( 'lodash' ) ;
2+ const moment = require ( 'moment' ) ;
23
34const elasticsearch = require ( '../util/elasticsearch' ) ;
45const 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