11use crate :: node_obj_deserializer:: JsValueDeserializer ;
2+ use crate :: transport:: MapCubeErrExt ;
23use cubeorchestrator:: query_message_parser:: QueryResult ;
34use cubeorchestrator:: query_result_transform:: {
4- get_final_cubestore_result_array, RequestResultArray , RequestResultData , RequestResultDataMulti ,
5+ get_final_cubestore_result_array, RequestResultArray , RequestResultData ,
6+ RequestResultDataMulti , TransformedData ,
57} ;
68use cubeorchestrator:: transport:: { JsRawData , TransformDataRequest } ;
9+ use cubesql:: CubeError ;
710use neon:: context:: { Context , FunctionContext , ModuleContext } ;
811use neon:: handle:: Handle ;
912use neon:: object:: Object ;
1013use neon:: prelude:: {
11- JsArray , JsArrayBuffer , JsBox , JsBuffer , JsObject , JsPromise , JsResult , JsValue , NeonResult ,
14+ JsArray , JsArrayBuffer , JsBox , JsBuffer , JsFunction , JsObject , JsPromise , JsResult , JsValue ,
15+ NeonResult ,
1216} ;
1317use neon:: types:: buffer:: TypedArray ;
1418use serde:: Deserialize ;
@@ -27,6 +31,108 @@ pub fn register_module(cx: &mut ModuleContext) -> NeonResult<()> {
2731 Ok ( ( ) )
2832}
2933
34+ // #[derive(Debug, Clone)]
35+ // pub enum ResultWrapperData {
36+ // JsObj(RecordBatch),
37+ // Native()
38+ // }
39+
40+ #[ derive( Debug , Clone ) ]
41+ pub struct ResultWrapper {
42+ transform_data : TransformDataRequest ,
43+ data : Arc < QueryResult > ,
44+ }
45+
46+ impl ResultWrapper {
47+ pub fn from_js_result_wrapper (
48+ cx : & mut FunctionContext < ' _ > ,
49+ js_result_wrapper_val : Handle < JsValue > ,
50+ ) -> Result < Self , CubeError > {
51+ let js_result_wrapper = js_result_wrapper_val
52+ . downcast :: < JsObject , _ > ( cx)
53+ . map_cube_err ( "Can't downcast JS ResultWrapper to object" ) ?;
54+
55+ let get_transform_data_js_method: Handle < JsFunction > = js_result_wrapper
56+ . get ( cx, "getTransformData" )
57+ . map_cube_err ( "Can't get getTransformData() method from JS ResultWrapper object" ) ?;
58+
59+ let transform_data_js_arr = get_transform_data_js_method
60+ . call ( cx, js_result_wrapper. upcast :: < JsValue > ( ) , [ ] )
61+ . map_cube_err ( "Error calling getTransformData() method of ResultWrapper object" ) ?
62+ . downcast :: < JsArray , _ > ( cx)
63+ . map_cube_err ( "Can't downcast JS transformData to array" ) ?
64+ . to_vec ( cx)
65+ . map_cube_err ( "Can't convert JS transformData to array" ) ?;
66+
67+ let transform_data_js = transform_data_js_arr. first ( ) . unwrap ( ) ;
68+
69+ let deserializer = JsValueDeserializer :: new ( cx, * transform_data_js) ;
70+ let transform_request: TransformDataRequest = match Deserialize :: deserialize ( deserializer) {
71+ Ok ( data) => data,
72+ Err ( _) => {
73+ return Err ( CubeError :: internal (
74+ "Can't deserialize transformData from JS ResultWrapper object" . to_string ( ) ,
75+ ) )
76+ }
77+ } ;
78+
79+ let get_raw_data_js_method: Handle < JsFunction > = js_result_wrapper
80+ . get ( cx, "getRawData" )
81+ . map_cube_err ( "Can't get getRawData() method from JS ResultWrapper object" ) ?;
82+
83+ let raw_data_js_arr = get_raw_data_js_method
84+ . call ( cx, js_result_wrapper. upcast :: < JsValue > ( ) , [ ] )
85+ . map_cube_err ( "Error calling getRawData() method of ResultWrapper object" ) ?
86+ . downcast :: < JsArray , _ > ( cx)
87+ . map_cube_err ( "Can't downcast JS rawData to array" ) ?
88+ . to_vec ( cx)
89+ . map_cube_err ( "Can't convert JS rawData to array" ) ?;
90+
91+ let raw_data_js = raw_data_js_arr. first ( ) . unwrap ( ) ;
92+
93+ let query_result =
94+ if let Ok ( js_box) = raw_data_js. downcast :: < JsBox < Arc < QueryResult > > , _ > ( cx) {
95+ Arc :: clone ( & js_box)
96+ } else if let Ok ( js_array) = raw_data_js. downcast :: < JsArray , _ > ( cx) {
97+ let deserializer = JsValueDeserializer :: new ( cx, js_array. upcast ( ) ) ;
98+ let js_raw_data: JsRawData = match Deserialize :: deserialize ( deserializer) {
99+ Ok ( data) => data,
100+ Err ( _) => {
101+ return Err ( CubeError :: internal (
102+ "Can't deserialize results raw data from JS ResultWrapper object" . to_string ( ) ,
103+ ) ) ;
104+ }
105+ } ;
106+
107+ QueryResult :: from_js_raw_data ( js_raw_data)
108+ . map ( Arc :: new)
109+ . map_cube_err ( "Can't build results data from JS rawData" ) ?
110+ } else {
111+ return Err ( CubeError :: internal (
112+ "Can't deserialize results raw data from JS ResultWrapper object" . to_string ( ) ,
113+ ) ) ;
114+ } ;
115+
116+ Ok ( Self {
117+ transform_data : transform_request,
118+ data : query_result,
119+ } )
120+ }
121+
122+ pub fn transform_result ( & self ) -> Result < TransformedData , CubeError > {
123+ let transformed = TransformedData :: transform ( & self . transform_data , & self . data )
124+ . map_cube_err ( "Can't prepare transformed data" ) ?;
125+
126+ Ok ( transformed)
127+ }
128+ }
129+
130+ pub type JsResultDataVectors = (
131+ Vec < TransformDataRequest > ,
132+ Vec < Arc < QueryResult > > ,
133+ Vec < RequestResultData > ,
134+ ) ;
135+
30136fn json_to_array_buffer < ' a , C > (
31137 mut cx : C ,
32138 json_data : Result < String , anyhow:: Error > ,
@@ -144,12 +250,6 @@ pub fn final_query_result(mut cx: FunctionContext) -> JsResult<JsPromise> {
144250 Ok ( promise)
145251}
146252
147- pub type JsResultDataVectors = (
148- Vec < TransformDataRequest > ,
149- Vec < Arc < QueryResult > > ,
150- Vec < RequestResultData > ,
151- ) ;
152-
153253pub fn convert_final_query_result_array_from_js (
154254 cx : & mut FunctionContext < ' _ > ,
155255 transform_data_array : Handle < JsValue > ,
0 commit comments