@@ -36,10 +36,12 @@ use cubeorchestrator::cubestore_message_parser::CubeStoreResult;
3636
3737use cubesql:: { telemetry:: ReportingLogger , CubeError } ;
3838
39+ use cubeorchestrator:: cubestore_result_transform:: {
40+ get_final_cubestore_result, get_final_cubestore_result_multi, transform_data,
41+ } ;
42+ use cubeorchestrator:: types:: { RequestResultData , RequestResultDataMulti , TransformDataRequest } ;
3943use neon:: prelude:: * ;
4044use neon:: types:: buffer:: TypedArray ;
41- use cubeorchestrator:: cubestore_result_transform:: transform_data;
42- use cubeorchestrator:: types:: { TransformDataRequest } ;
4345
4446struct SQLInterface {
4547 services : Arc < NodeCubeServices > ,
@@ -546,9 +548,7 @@ fn get_cubestore_result(mut cx: FunctionContext) -> JsResult<JsValue> {
546548}
547549
548550fn transform_query_data ( mut cx : FunctionContext ) -> JsResult < JsObject > {
549- let json_str = cx
550- . argument :: < JsString > ( 0 ) ?
551- . value ( & mut cx) ;
551+ let json_str = cx. argument :: < JsString > ( 0 ) ?. value ( & mut cx) ;
552552 let request_data = match serde_json:: from_str :: < TransformDataRequest > ( & json_str) {
553553 Ok ( data) => data,
554554 Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
@@ -571,7 +571,7 @@ fn transform_query_data(mut cx: FunctionContext) -> JsResult<JsObject> {
571571 res_type. clone ( ) ,
572572 ) {
573573 Ok ( data) => data,
574- Err ( err) => return cx. throw_error ( err. to_string ( ) )
574+ Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
575575 } ;
576576
577577 let json_data = match serde_json:: to_string ( & transformed) {
@@ -587,6 +587,98 @@ fn transform_query_data(mut cx: FunctionContext) -> JsResult<JsObject> {
587587 Ok ( js_result)
588588}
589589
590+ fn final_cubestore_result ( mut cx : FunctionContext ) -> JsResult < JsArrayBuffer > {
591+ let transform_data_str = cx. argument :: < JsString > ( 0 ) ?. value ( & mut cx) ;
592+ let transform_request_data =
593+ match serde_json:: from_str :: < TransformDataRequest > ( & transform_data_str) {
594+ Ok ( data) => data,
595+ Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
596+ } ;
597+ let cube_store_result = cx. argument :: < JsBox < CubeStoreResult > > ( 1 ) ?;
598+ let result_data_str = cx. argument :: < JsString > ( 2 ) ?. value ( & mut cx) ;
599+ let mut result_data = match serde_json:: from_str :: < RequestResultData > ( & result_data_str) {
600+ Ok ( data) => data,
601+ Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
602+ } ;
603+
604+ if let Err ( err) = get_final_cubestore_result (
605+ & transform_request_data,
606+ & * * cube_store_result,
607+ & mut result_data,
608+ ) {
609+ return cx. throw_error ( err. to_string ( ) ) ;
610+ }
611+
612+ let json_data = match serde_json:: to_string ( & result_data) {
613+ Ok ( data) => data,
614+ Err ( e) => return cx. throw_error ( format ! ( "Serialization error: {}" , e) ) ,
615+ } ;
616+ let json_bytes = json_data. as_bytes ( ) ;
617+
618+ let mut js_buffer = cx. array_buffer ( json_bytes. len ( ) ) ?;
619+ {
620+ let buffer = js_buffer. as_mut_slice ( & mut cx) ;
621+ buffer. copy_from_slice ( json_bytes) ;
622+ }
623+
624+ Ok ( js_buffer)
625+ }
626+
627+ fn final_cubestore_result_multi ( mut cx : FunctionContext ) -> JsResult < JsArrayBuffer > {
628+ let transform_data_array = cx. argument :: < JsArray > ( 0 ) ?;
629+ let transform_requests: Vec < TransformDataRequest > = transform_data_array
630+ . to_vec ( & mut cx) ?
631+ . into_iter ( )
632+ . map ( |js_value| {
633+ let js_string = js_value
634+ . downcast_or_throw :: < JsString , _ > ( & mut cx) ?
635+ . value ( & mut cx) ;
636+
637+ match serde_json:: from_str :: < TransformDataRequest > ( & js_string) {
638+ Ok ( request) => Ok ( request) ,
639+ Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
640+ }
641+ } )
642+ . collect :: < Result < _ , _ > > ( ) ?;
643+
644+ let cube_store_array = cx. argument :: < JsArray > ( 1 ) ?;
645+ let cube_store_results_boxed: Vec < Handle < JsBox < CubeStoreResult > > > = cube_store_array
646+ . to_vec ( & mut cx) ?
647+ . into_iter ( )
648+ . map ( |js_value| js_value. downcast_or_throw :: < JsBox < CubeStoreResult > , _ > ( & mut cx) )
649+ . collect :: < Result < _ , _ > > ( ) ?;
650+ let cube_store_results: Vec < & CubeStoreResult > = cube_store_results_boxed
651+ . iter ( )
652+ . map ( |handle| & * * * handle)
653+ . collect ( ) ;
654+
655+ let result_data_str = cx. argument :: < JsString > ( 2 ) ?. value ( & mut cx) ;
656+ let mut result_data = match serde_json:: from_str :: < RequestResultDataMulti > ( & result_data_str) {
657+ Ok ( data) => data,
658+ Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
659+ } ;
660+
661+ if let Err ( err) =
662+ get_final_cubestore_result_multi ( & transform_requests, & cube_store_results, & mut result_data)
663+ {
664+ return cx. throw_error ( err. to_string ( ) ) ;
665+ }
666+
667+ let json_data = match serde_json:: to_string ( & result_data) {
668+ Ok ( data) => data,
669+ Err ( e) => return cx. throw_error ( format ! ( "Serialization error: {}" , e) ) ,
670+ } ;
671+ let json_bytes = json_data. as_bytes ( ) ;
672+
673+ let mut js_buffer = cx. array_buffer ( json_bytes. len ( ) ) ?;
674+ {
675+ let buffer = js_buffer. as_mut_slice ( & mut cx) ;
676+ buffer. copy_from_slice ( json_bytes) ;
677+ }
678+
679+ Ok ( js_buffer)
680+ }
681+
590682pub fn register_module_exports < C : NodeConfiguration + ' static > (
591683 mut cx : ModuleContext ,
592684) -> NeonResult < ( ) > {
@@ -607,6 +699,8 @@ pub fn register_module_exports<C: NodeConfiguration + 'static>(
607699 ) ?;
608700 cx. export_function ( "getCubestoreResult" , get_cubestore_result) ?;
609701 cx. export_function ( "transformQueryData" , transform_query_data) ?;
702+ cx. export_function ( "getFinalCubestoreResult" , final_cubestore_result) ?;
703+ cx. export_function ( "getFinalCubestoreResultMulti" , final_cubestore_result_multi) ?;
610704
611705 crate :: template:: template_register_module ( & mut cx) ?;
612706
0 commit comments