1
1
const elasticsearch = require ( '../util/elasticsearch' ) ;
2
2
const getDatesForMetrics = require ( '../util/get-dates-for-metrics' ) ;
3
3
4
- const getRelayerMetrics = async ( relayerId , period , granularity ) => {
5
- const { dateFrom, dateTo } = getDatesForMetrics ( period , granularity ) ;
4
+ const getQuery = ( relayerId , dateFrom , dateTo ) => {
5
+ return {
6
+ bool : {
7
+ filter : [
8
+ {
9
+ range : {
10
+ date : {
11
+ gte : dateFrom ,
12
+ lte : dateTo ,
13
+ } ,
14
+ } ,
15
+ } ,
16
+ relayerId !== null
17
+ ? {
18
+ term : {
19
+ relayerId,
20
+ } ,
21
+ }
22
+ : undefined ,
23
+ ] . filter ( x => x !== undefined ) ,
24
+ must_not : [
25
+ relayerId === null
26
+ ? {
27
+ exists : {
28
+ field : 'relayerId' ,
29
+ } ,
30
+ }
31
+ : undefined ,
32
+ ] . filter ( x => x !== undefined ) ,
33
+ } ,
34
+ } ;
35
+ } ;
6
36
37
+ const getTraderMetrics = async ( relayerId , dateFrom , dateTo , granularity ) => {
38
+ const results = await elasticsearch . getClient ( ) . search ( {
39
+ index : 'trader_fills' ,
40
+ body : {
41
+ aggs : {
42
+ metrics_by_date : {
43
+ date_histogram : {
44
+ field : 'date' ,
45
+ calendar_interval : granularity ,
46
+ extended_bounds : {
47
+ min : dateFrom ,
48
+ max : dateTo ,
49
+ } ,
50
+ } ,
51
+ aggs : {
52
+ traderCount : {
53
+ cardinality : { field : 'address' } ,
54
+ } ,
55
+ } ,
56
+ } ,
57
+ } ,
58
+ size : 0 ,
59
+ query : getQuery ( relayerId , dateFrom , dateTo ) ,
60
+ } ,
61
+ } ) ;
62
+
63
+ return results . body . aggregations . metrics_by_date . buckets . map ( x => ( {
64
+ date : new Date ( x . key_as_string ) ,
65
+ traderCount : x . traderCount . value ,
66
+ } ) ) ;
67
+ } ;
68
+
69
+ const getBasicMetrics = async ( relayerId , dateFrom , dateTo , granularity ) => {
7
70
const results = await elasticsearch . getClient ( ) . search ( {
8
71
index : 'fills' ,
9
72
body : {
@@ -27,43 +90,11 @@ const getRelayerMetrics = async (relayerId, period, granularity) => {
27
90
tradeVolume : {
28
91
sum : { field : 'tradeVolume' } ,
29
92
} ,
30
- traderCount : {
31
- cardinality : { field : 'traders' } ,
32
- } ,
33
93
} ,
34
94
} ,
35
95
} ,
36
96
size : 0 ,
37
- query : {
38
- bool : {
39
- filter : [
40
- {
41
- range : {
42
- date : {
43
- gte : dateFrom ,
44
- lte : dateTo ,
45
- } ,
46
- } ,
47
- } ,
48
- relayerId !== null
49
- ? {
50
- term : {
51
- relayerId,
52
- } ,
53
- }
54
- : undefined ,
55
- ] . filter ( x => x !== undefined ) ,
56
- must_not : [
57
- relayerId === null
58
- ? {
59
- exists : {
60
- field : 'relayerId' ,
61
- } ,
62
- }
63
- : undefined ,
64
- ] . filter ( x => x !== undefined ) ,
65
- } ,
66
- } ,
97
+ query : getQuery ( relayerId , dateFrom , dateTo ) ,
67
98
} ,
68
99
} ) ;
69
100
@@ -73,8 +104,29 @@ const getRelayerMetrics = async (relayerId, period, granularity) => {
73
104
fillVolume : x . fillVolume . value ,
74
105
tradeCount : relayerId === null ? x . doc_count : x . tradeCount . value ,
75
106
tradeVolume : relayerId === null ? x . fillVolume . value : x . tradeVolume . value ,
76
- traderCount : x . traderCount . value ,
77
107
} ) ) ;
78
108
} ;
79
109
110
+ const getRelayerMetrics = async ( relayerId , period , granularity ) => {
111
+ const { dateFrom, dateTo } = getDatesForMetrics ( period , granularity ) ;
112
+
113
+ const [ basicMetrics , traderMetrics ] = await Promise . all ( [
114
+ getBasicMetrics ( relayerId , dateFrom , dateTo , granularity ) ,
115
+ getTraderMetrics ( relayerId , dateFrom , dateTo , granularity ) ,
116
+ ] ) ;
117
+
118
+ const combinedMetrics = basicMetrics . map ( basicMetric => {
119
+ const traderMetric = traderMetrics . find (
120
+ tm => tm . date . toISOString ( ) === basicMetric . date . toISOString ( ) ,
121
+ ) ;
122
+
123
+ return {
124
+ ...basicMetric ,
125
+ traderCount : traderMetric . traderCount ,
126
+ } ;
127
+ } ) ;
128
+
129
+ return combinedMetrics ;
130
+ } ;
131
+
80
132
module . exports = getRelayerMetrics ;
0 commit comments