11const elasticsearch = require ( '../util/elasticsearch' ) ;
22const getDatesForMetrics = require ( '../util/get-dates-for-metrics' ) ;
33
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+ } ;
636
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 ) => {
770 const results = await elasticsearch . getClient ( ) . search ( {
871 index : 'fills' ,
972 body : {
@@ -27,43 +90,11 @@ const getRelayerMetrics = async (relayerId, period, granularity) => {
2790 tradeVolume : {
2891 sum : { field : 'tradeVolume' } ,
2992 } ,
30- traderCount : {
31- cardinality : { field : 'traders' } ,
32- } ,
3393 } ,
3494 } ,
3595 } ,
3696 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 ) ,
6798 } ,
6899 } ) ;
69100
@@ -73,8 +104,29 @@ const getRelayerMetrics = async (relayerId, period, granularity) => {
73104 fillVolume : x . fillVolume . value ,
74105 tradeCount : relayerId === null ? x . doc_count : x . tradeCount . value ,
75106 tradeVolume : relayerId === null ? x . fillVolume . value : x . tradeVolume . value ,
76- traderCount : x . traderCount . value ,
77107 } ) ) ;
78108} ;
79109
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+
80132module . exports = getRelayerMetrics ;
0 commit comments