1
- use crate :: databases :: models :: DatabasesParameters ;
1
+ use crate :: OrderDirection ;
2
2
use crate :: state:: AppState ;
3
3
use crate :: {
4
+ SearchParameters ,
4
5
databases:: error:: { DatabasesAPIError , DatabasesResult } ,
5
6
databases:: models:: {
6
7
Database , DatabaseCreatePayload , DatabaseCreateResponse , DatabaseResponse ,
7
8
DatabaseUpdatePayload , DatabaseUpdateResponse , DatabasesResponse ,
8
9
} ,
10
+ downcast_string_column,
9
11
error:: ErrorResponse ,
10
12
} ;
13
+ use api_sessions:: DFSessionId ;
11
14
use axum:: {
12
15
Json ,
13
16
extract:: { Path , Query , State } ,
14
17
} ;
18
+ use core_executor:: models:: QueryResultData ;
19
+ use core_executor:: query:: QueryContext ;
15
20
use core_metastore:: Database as MetastoreDatabase ;
16
21
use core_metastore:: error:: MetastoreError ;
17
- use core_utils:: scan_iterator:: ScanIterator ;
18
22
use utoipa:: OpenApi ;
19
23
use validator:: Validate ;
20
24
@@ -81,11 +85,7 @@ pub async fn create_database(
81
85
. create_database ( & database. ident . clone ( ) , database)
82
86
. await
83
87
. map_err ( |e| DatabasesAPIError :: Create { source : e } )
84
- . map ( |o| {
85
- Json ( DatabaseCreateResponse {
86
- data : o. data . into ( ) ,
87
- } )
88
- } )
88
+ . map ( |o| Json ( DatabaseCreateResponse { data : o. into ( ) } ) )
89
89
}
90
90
91
91
#[ utoipa:: path(
@@ -113,9 +113,7 @@ pub async fn get_database(
113
113
Path ( database_name) : Path < String > ,
114
114
) -> DatabasesResult < Json < DatabaseResponse > > {
115
115
match state. metastore . get_database ( & database_name) . await {
116
- Ok ( Some ( db) ) => Ok ( Json ( DatabaseResponse {
117
- data : db. data . into ( ) ,
118
- } ) ) ,
116
+ Ok ( Some ( db) ) => Ok ( Json ( DatabaseResponse { data : db. into ( ) } ) ) ,
119
117
Ok ( None ) => Err ( DatabasesAPIError :: Get {
120
118
source : MetastoreError :: DatabaseNotFound {
121
119
db : database_name. clone ( ) ,
@@ -194,20 +192,18 @@ pub async fn update_database(
194
192
. update_database ( & database_name, database)
195
193
. await
196
194
. map_err ( |e| DatabasesAPIError :: Update { source : e } )
197
- . map ( |o| {
198
- Json ( DatabaseUpdateResponse {
199
- data : o. data . into ( ) ,
200
- } )
201
- } )
195
+ . map ( |o| Json ( DatabaseUpdateResponse { data : o. into ( ) } ) )
202
196
}
203
197
204
198
#[ utoipa:: path(
205
199
get,
206
200
operation_id = "getDatabases" ,
207
201
params(
208
- ( "cursor " = Option <String >, Query , description = "Databases cursor " ) ,
202
+ ( "offset " = Option <usize >, Query , description = "Databases offset " ) ,
209
203
( "limit" = Option <usize >, Query , description = "Databases limit" ) ,
210
- ( "search" = Option <String >, Query , description = "Databases search (start with)" ) ,
204
+ ( "search" = Option <String >, Query , description = "Databases search" ) ,
205
+ ( "order_by" = Option <String >, Query , description = "Order by: database_name (default), volume_name, created_at, updated_at" ) ,
206
+ ( "order_direction" = Option <OrderDirection >, Query , description = "Order direction: ASC, DESC (default)" ) ,
211
207
) ,
212
208
tags = [ "databases" ] ,
213
209
path = "/ui/databases" ,
@@ -223,30 +219,56 @@ pub async fn update_database(
223
219
)
224
220
) ]
225
221
#[ tracing:: instrument( level = "debug" , skip( state) , err, ret( level = tracing:: Level :: TRACE ) ) ]
222
+ #[ allow( clippy:: unwrap_used) ]
226
223
pub async fn list_databases (
227
- Query ( parameters) : Query < DatabasesParameters > ,
224
+ DFSessionId ( session_id) : DFSessionId ,
225
+ Query ( parameters) : Query < SearchParameters > ,
228
226
State ( state) : State < AppState > ,
229
227
) -> DatabasesResult < Json < DatabasesResponse > > {
230
- state
231
- . metastore
232
- . iter_databases ( )
233
- . cursor ( parameters. cursor . clone ( ) )
234
- . limit ( parameters. limit )
235
- . token ( parameters. search )
236
- . collect ( )
228
+ let context = QueryContext :: default ( ) ;
229
+ let sql_string = "SELECT * FROM slatedb.public.databases" . to_string ( ) ;
230
+ let sql_string = parameters. search . map_or_else ( || sql_string. clone ( ) , |search|
231
+ format ! ( "{sql_string} WHERE (database_name ILIKE '%{search}%' OR volume_name ILIKE '%{search}%')" )
232
+ ) ;
233
+ let sql_string = parameters. order_by . map_or_else (
234
+ || format ! ( "{sql_string} ORDER BY database_name" ) ,
235
+ |order_by| format ! ( "{sql_string} ORDER BY {order_by}" ) ,
236
+ ) ;
237
+ let sql_string = parameters. order_direction . map_or_else (
238
+ || format ! ( "{sql_string} DESC" ) ,
239
+ |order_direction| format ! ( "{sql_string} {order_direction}" ) ,
240
+ ) ;
241
+ let sql_string = parameters. offset . map_or_else (
242
+ || sql_string. clone ( ) ,
243
+ |offset| format ! ( "{sql_string} OFFSET {offset}" ) ,
244
+ ) ;
245
+ let sql_string = parameters. limit . map_or_else (
246
+ || sql_string. clone ( ) ,
247
+ |limit| format ! ( "{sql_string} LIMIT {limit}" ) ,
248
+ ) ;
249
+ let QueryResultData { records, .. } = state
250
+ . execution_svc
251
+ . query ( & session_id, sql_string. as_str ( ) , context)
237
252
. await
238
- . map_err ( |e| DatabasesAPIError :: List {
239
- source : MetastoreError :: UtilSlateDB { source : e } ,
240
- } )
241
- . map ( |o| {
242
- let next_cursor = o
243
- . iter ( )
244
- . last ( )
245
- . map_or ( String :: new ( ) , |rw_object| rw_object. ident . clone ( ) ) ;
246
- Json ( DatabasesResponse {
247
- items : o. into_iter ( ) . map ( |x| x. data . into ( ) ) . collect ( ) ,
248
- current_cursor : parameters. cursor ,
249
- next_cursor,
250
- } )
251
- } )
253
+ . map_err ( |e| DatabasesAPIError :: List { source : e } ) ?;
254
+ let mut items = Vec :: new ( ) ;
255
+ for record in records {
256
+ let database_names = downcast_string_column ( & record, "database_name" )
257
+ . map_err ( |e| DatabasesAPIError :: List { source : e } ) ?;
258
+ let volume_names = downcast_string_column ( & record, "volume_name" )
259
+ . map_err ( |e| DatabasesAPIError :: List { source : e } ) ?;
260
+ let created_at_timestamps = downcast_string_column ( & record, "created_at" )
261
+ . map_err ( |e| DatabasesAPIError :: List { source : e } ) ?;
262
+ let updated_at_timestamps = downcast_string_column ( & record, "updated_at" )
263
+ . map_err ( |e| DatabasesAPIError :: List { source : e } ) ?;
264
+ for i in 0 ..record. num_rows ( ) {
265
+ items. push ( Database {
266
+ name : database_names. value ( i) . to_string ( ) ,
267
+ volume : volume_names. value ( i) . to_string ( ) ,
268
+ created_at : created_at_timestamps. value ( i) . to_string ( ) ,
269
+ updated_at : updated_at_timestamps. value ( i) . to_string ( ) ,
270
+ } ) ;
271
+ }
272
+ }
273
+ Ok ( Json ( DatabasesResponse { items } ) )
252
274
}
0 commit comments