@@ -64,42 +64,43 @@ pub async fn _get_all(
64
64
65
65
#[ derive( Debug , Serialize , Queryable ) ]
66
66
pub struct MedianEntry {
67
- pub source : String ,
68
67
pub time : NaiveDateTime ,
69
68
pub median_price : BigDecimal ,
69
+ pub num_sources : i32 ,
70
70
}
71
71
72
72
#[ derive( Serialize , QueryableByName ) ]
73
73
pub struct MedianEntryRaw {
74
- #[ diesel( sql_type = diesel:: sql_types:: Text ) ]
75
- pub source : String ,
76
74
#[ diesel( sql_type = diesel:: sql_types:: Timestamp ) ]
77
75
pub time : NaiveDateTime ,
78
76
#[ diesel( sql_type = diesel:: sql_types:: Numeric ) ]
79
77
pub median_price : BigDecimal ,
78
+ #[ diesel( sql_type = diesel:: sql_types:: Integer ) ]
79
+ pub num_sources : i32 ,
80
80
}
81
81
82
- pub async fn get_median_entries (
82
+ pub async fn get_median_price (
83
83
pool : & deadpool_diesel:: postgres:: Pool ,
84
84
pair_id : String ,
85
- ) -> Result < Vec < MedianEntry > , InfraError > {
85
+ ) -> Result < MedianEntry , InfraError > {
86
86
let conn = pool. get ( ) . await . map_err ( adapt_infra_error) ?;
87
87
88
88
let raw_sql = r#"
89
89
-- query the materialized realtime view
90
90
SELECT
91
- source ,
92
- MAX(bucket) AS time ,
93
- approx_percentile(0.5, percentile_agg) AS median_price
91
+ bucket AS time ,
92
+ median_price ,
93
+ num_sources
94
94
FROM
95
95
price_1_min_agg
96
96
WHERE
97
97
pair_id = $1
98
98
ORDER BY
99
- source;
99
+ time
100
+ LIMIT 1;
100
101
"# ;
101
102
102
- let raw_entries : Vec < MedianEntryRaw > = conn
103
+ let raw_entry = conn
103
104
. interact ( move |conn| {
104
105
diesel:: sql_query ( raw_sql)
105
106
. bind :: < diesel:: sql_types:: Text , _ > ( pair_id)
@@ -109,16 +110,15 @@ pub async fn get_median_entries(
109
110
. map_err ( adapt_infra_error) ?
110
111
. map_err ( adapt_infra_error) ?;
111
112
112
- let entries: Vec < MedianEntry > = raw_entries
113
- . into_iter ( )
114
- . map ( |raw_entry| MedianEntry {
115
- time : raw_entry. time ,
116
- median_price : raw_entry. median_price ,
117
- source : raw_entry. source ,
118
- } )
119
- . collect ( ) ;
113
+ let raw_entry = raw_entry. first ( ) . ok_or ( InfraError :: NotFound ) ?;
120
114
121
- Ok ( entries)
115
+ let entry: MedianEntry = MedianEntry {
116
+ time : raw_entry. time ,
117
+ median_price : raw_entry. median_price . clone ( ) ,
118
+ num_sources : raw_entry. num_sources ,
119
+ } ;
120
+
121
+ Ok ( entry)
122
122
}
123
123
124
124
pub async fn get_entries_between (
@@ -135,14 +135,16 @@ pub async fn get_entries_between(
135
135
136
136
let raw_sql = r#"
137
137
SELECT
138
- source,
139
- "timestamp" AS "time",
140
- PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY price) AS "median_price"
141
- FROM entries
142
- WHERE pair_id = $1
143
- AND "timestamp" BETWEEN $2 AND $3
144
- GROUP BY (timestamp, source)
145
- ORDER BY timestamp ASC;
138
+ bucket AS time,
139
+ median_price,
140
+ num_sources
141
+ FROM price_1_min_agg
142
+ WHERE
143
+ pair_id = $1
144
+ AND
145
+ time BETWEEN $2 AND $3
146
+ ORDER BY
147
+ time DESC;
146
148
"# ;
147
149
148
150
let raw_entries = conn
@@ -162,7 +164,7 @@ pub async fn get_entries_between(
162
164
. map ( |raw_entry| MedianEntry {
163
165
time : raw_entry. time ,
164
166
median_price : raw_entry. median_price ,
165
- source : raw_entry. source ,
167
+ num_sources : raw_entry. num_sources ,
166
168
} )
167
169
. collect ( ) ;
168
170
0 commit comments