@@ -5,13 +5,16 @@ use std::fmt::Display;
55
66use crate :: auth:: NativeSQLAuthContext ;
77use crate :: channel:: { call_raw_js_with_channel_as_callback, NodeSqlGenerator , ValueFromJs } ;
8+ use crate :: node_obj_deserializer:: JsValueDeserializer ;
89use crate :: node_obj_serializer:: NodeObjSerializer ;
910use crate :: orchestrator:: ResultWrapper ;
1011use crate :: {
1112 auth:: TransportRequest , channel:: call_js_with_channel_as_callback,
1213 stream:: call_js_with_stream_as_callback,
1314} ;
1415use async_trait:: async_trait;
16+ use cubeorchestrator:: query_result_transform:: RequestResultData ;
17+ use cubesql:: compile:: arrow:: datatypes:: Schema ;
1518use cubesql:: compile:: engine:: df:: scan:: {
1619 convert_transport_response, transform_response, CacheMode , MemberField , RecordBatch , SchemaRef ,
1720} ;
@@ -26,7 +29,7 @@ use cubesql::{
2629 transport:: { CubeStreamReceiver , LoadRequestMeta , MetaContext , TransportService } ,
2730 CubeError ,
2831} ;
29- use serde:: Serialize ;
32+ use serde:: { Deserialize , Serialize } ;
3033use std:: sync:: Arc ;
3134use uuid:: Uuid ;
3235
@@ -402,14 +405,37 @@ impl TransportService for NodeBridgeTransport {
402405 . to_vec ( cx)
403406 . map_cube_err ( "Can't convert JS result to array" ) ?;
404407
405- let native_wrapped_results = js_res_wrapped_vec
406- . iter ( )
407- . map ( |r| ResultWrapper :: from_js_result_wrapper ( cx, * r) )
408- . collect :: < Result < Vec < _ > , _ > > ( )
408+ let get_root_result_object_method: Handle < JsFunction > =
409+ js_result_wrapped. get ( cx, "getRootResultObject" ) . map_cube_err (
410+ "Can't get getRootResultObject method from JS ResultWrapper object" ,
411+ ) ?;
412+
413+ let result_data_js_array = get_root_result_object_method
414+ . call ( cx, js_result_wrapped. upcast :: < JsValue > ( ) , [ ] )
409415 . map_cube_err (
410- "Can't construct result wrapper from JS ResultWrapper object" ,
416+ "Error calling getRootResultObject() method of JS ResultWrapper object" ,
411417 ) ?;
412418
419+ let result_data_js_vec = result_data_js_array
420+ . downcast :: < JsArray , _ > ( cx)
421+ . map_cube_err ( "Can't downcast getRootResultObject result to array" ) ?
422+ . to_vec ( cx)
423+ . map_cube_err ( "Can't convert getRootResultObject result to array" ) ?;
424+
425+ let mut native_wrapped_results = Vec :: with_capacity ( js_res_wrapped_vec. len ( ) ) ;
426+ for ( js_wrapper, js_result_data) in js_res_wrapped_vec. iter ( ) . zip ( result_data_js_vec. iter ( ) ) {
427+ let mut wrapper = ResultWrapper :: from_js_result_wrapper ( cx, * js_wrapper)
428+ . map_cube_err ( "Can't construct result wrapper from JS ResultWrapper object" ) ?;
429+
430+ let deserializer = JsValueDeserializer :: new ( cx, * js_result_data) ;
431+ let result_data: RequestResultData = Deserialize :: deserialize ( deserializer)
432+ . map_cube_err ( "Can't deserialize RequestResultData from getRootResultObject" ) ?;
433+
434+ wrapper. last_refresh_time = result_data. last_refresh_time ;
435+
436+ native_wrapped_results. push ( wrapper) ;
437+ }
438+
413439 Ok ( ValueFromJs :: ResultWrapper ( native_wrapped_results) )
414440 } else if let Ok ( str) = v. downcast :: < JsString , _ > ( cx) {
415441 Ok ( ValueFromJs :: String ( str. value ( cx) ) )
@@ -482,7 +508,20 @@ impl TransportService for NodeBridgeTransport {
482508 break result_wrappers
483509 . into_iter ( )
484510 . map ( |mut wrapper| {
485- transform_response ( & mut wrapper, schema. clone ( ) , & member_fields)
511+ let updated_schema = if let Some ( last_refresh_time) =
512+ wrapper. last_refresh_time . clone ( )
513+ {
514+ let mut metadata = schema. metadata ( ) . clone ( ) ;
515+ metadata. insert ( "lastRefreshTime" . to_string ( ) , last_refresh_time) ;
516+ Arc :: new ( Schema :: new_with_metadata (
517+ schema. fields ( ) . to_vec ( ) ,
518+ metadata,
519+ ) )
520+ } else {
521+ schema. clone ( )
522+ } ;
523+
524+ transform_response ( & mut wrapper, updated_schema, & member_fields)
486525 } )
487526 . collect :: < Result < Vec < _ > , _ > > ( ) ;
488527 }
0 commit comments