11use crate :: node_obj_deserializer:: JsValueDeserializer ;
2- use cubeorchestrator:: cubestore_message_parser :: CubeStoreResult ;
3- use cubeorchestrator:: cubestore_result_transform :: {
2+ use cubeorchestrator:: query_message_parser :: QueryResult ;
3+ use cubeorchestrator:: query_result_transform :: {
44 get_final_cubestore_result_array, RequestResultArray , RequestResultData ,
55 RequestResultDataMulti , TransformedData ,
66} ;
7- use cubeorchestrator:: transport:: TransformDataRequest ;
7+ use cubeorchestrator:: transport:: { JsRawData , TransformDataRequest } ;
88use neon:: context:: { Context , FunctionContext , ModuleContext } ;
99use neon:: handle:: Handle ;
1010use neon:: object:: Object ;
@@ -22,9 +22,9 @@ pub fn register_module(cx: &mut ModuleContext) -> NeonResult<()> {
2222 ) ?;
2323 cx. export_function ( "getCubestoreResult" , get_cubestore_result) ?;
2424 cx. export_function ( "transformQueryData" , transform_query_data) ?;
25- cx. export_function ( "getFinalCubestoreResult " , final_cubestore_result ) ?;
26- cx. export_function ( "getFinalCubestoreResultMulti " , final_cubestore_result_multi ) ?;
27- cx. export_function ( "getFinalCubestoreResultArray " , final_cubestore_result_array ) ?;
25+ cx. export_function ( "getFinalQueryResult " , final_query_result ) ?;
26+ cx. export_function ( "getFinalQueryResultMulti " , final_query_result_multi ) ?;
27+ cx. export_function ( "getFinalQueryResultArray " , final_query_result_array ) ?;
2828
2929 Ok ( ( ) )
3030}
@@ -50,12 +50,31 @@ where
5050 }
5151}
5252
53+ fn extract_query_result (
54+ cx : & mut FunctionContext < ' _ > ,
55+ data_arg : Handle < JsValue > ,
56+ ) -> Result < Arc < QueryResult > , anyhow:: Error > {
57+
58+ if let Ok ( js_box) = data_arg. downcast :: < JsBox < Arc < QueryResult > > , _ > ( cx) {
59+ Ok ( Arc :: clone ( & js_box) )
60+ } else if let Ok ( js_array) = data_arg. downcast :: < JsArray , _ > ( cx) {
61+ let deserializer = JsValueDeserializer :: new ( cx, js_array. upcast ( ) ) ;
62+ let js_raw_data: JsRawData = Deserialize :: deserialize ( deserializer) ?;
63+
64+ QueryResult :: from_js_raw_data ( js_raw_data)
65+ . map ( Arc :: new)
66+ . map_err ( anyhow:: Error :: from)
67+ } else {
68+ Err ( anyhow:: anyhow!( "Second argument must be an Array of JsBox<Arc<QueryResult>> or JsArray" ) )
69+ }
70+ }
71+
5372pub fn parse_cubestore_result_message ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
5473 let msg = cx. argument :: < JsBuffer > ( 0 ) ?;
5574 let msg_data = msg. as_slice ( & cx) . to_vec ( ) ;
5675
5776 let promise = cx
58- . task ( move || CubeStoreResult :: from_fb ( & msg_data) )
77+ . task ( move || QueryResult :: from_cubestore_fb ( & msg_data) )
5978 . promise ( move |mut cx, res| match res {
6079 Ok ( result) => Ok ( cx. boxed ( Arc :: new ( result) ) ) ,
6180 Err ( err) => cx. throw_error ( err. to_string ( ) ) ,
@@ -65,7 +84,7 @@ pub fn parse_cubestore_result_message(mut cx: FunctionContext) -> JsResult<JsPro
6584}
6685
6786pub fn get_cubestore_result ( mut cx : FunctionContext ) -> JsResult < JsValue > {
68- let result = cx. argument :: < JsBox < Arc < CubeStoreResult > > > ( 0 ) ?;
87+ let result = cx. argument :: < JsBox < Arc < QueryResult > > > ( 0 ) ?;
6988
7089 let js_array = cx. execute_scoped ( |mut cx| {
7190 let js_array = JsArray :: new ( & mut cx, result. rows . len ( ) ) ;
@@ -99,7 +118,7 @@ pub fn transform_query_data(mut cx: FunctionContext) -> JsResult<JsPromise> {
99118 Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
100119 } ;
101120
102- let cube_store_result = cx. argument :: < JsBox < Arc < CubeStoreResult > > > ( 1 ) ?;
121+ let cube_store_result = cx. argument :: < JsBox < Arc < QueryResult > > > ( 1 ) ?;
103122 let cube_store_result = Arc :: clone ( & cube_store_result) ;
104123
105124 let promise = cx
@@ -126,7 +145,7 @@ pub fn transform_query_data(mut cx: FunctionContext) -> JsResult<JsPromise> {
126145 Ok ( promise)
127146}
128147
129- pub fn final_cubestore_result ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
148+ pub fn final_query_result ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
130149 let transform_data_js_object = cx. argument :: < JsValue > ( 0 ) ?;
131150 let deserializer = JsValueDeserializer :: new ( & mut cx, transform_data_js_object) ;
132151 let transform_request_data: TransformDataRequest = match Deserialize :: deserialize ( deserializer)
@@ -135,8 +154,12 @@ pub fn final_cubestore_result(mut cx: FunctionContext) -> JsResult<JsPromise> {
135154 Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
136155 } ;
137156
138- let cube_store_result = cx. argument :: < JsBox < Arc < CubeStoreResult > > > ( 1 ) ?;
139- let cube_store_result = Arc :: clone ( & cube_store_result) ;
157+ let data_arg = cx. argument :: < JsValue > ( 1 ) ?;
158+ let cube_store_result: Arc < QueryResult > = match extract_query_result ( & mut cx, data_arg) {
159+ Ok ( query_result) => query_result,
160+ Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
161+ } ;
162+
140163 let result_data_js_object = cx. argument :: < JsValue > ( 2 ) ?;
141164 let deserializer = JsValueDeserializer :: new ( & mut cx, result_data_js_object) ;
142165 let mut result_data: RequestResultData = match Deserialize :: deserialize ( deserializer) {
@@ -158,7 +181,7 @@ pub fn final_cubestore_result(mut cx: FunctionContext) -> JsResult<JsPromise> {
158181 Ok ( promise)
159182}
160183
161- pub fn final_cubestore_result_array ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
184+ pub fn final_query_result_array ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
162185 let transform_data_array = cx. argument :: < JsValue > ( 0 ) ?;
163186 let deserializer = JsValueDeserializer :: new ( & mut cx, transform_data_array) ;
164187 let transform_requests: Vec < TransformDataRequest > = match Deserialize :: deserialize ( deserializer)
@@ -167,16 +190,14 @@ pub fn final_cubestore_result_array(mut cx: FunctionContext) -> JsResult<JsPromi
167190 Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
168191 } ;
169192
170- let cube_store_array = cx. argument :: < JsArray > ( 1 ) ?;
171- let cube_store_results_boxed: Vec < Handle < JsBox < Arc < CubeStoreResult > > > > = cube_store_array
172- . to_vec ( & mut cx) ?
173- . into_iter ( )
174- . map ( |js_value| js_value. downcast_or_throw :: < JsBox < Arc < CubeStoreResult > > , _ > ( & mut cx) )
175- . collect :: < Result < _ , _ > > ( ) ?;
176- let cube_store_results: Vec < Arc < CubeStoreResult > > = cube_store_results_boxed
177- . iter ( )
178- . map ( |handle| ( * * handle) . clone ( ) )
179- . collect ( ) ;
193+ let data_array = cx. argument :: < JsArray > ( 1 ) ?;
194+ let mut cube_store_results: Vec < Arc < QueryResult > > = vec ! [ ] ;
195+ for data_arg in data_array. to_vec ( & mut cx) ? {
196+ match extract_query_result ( & mut cx, data_arg) {
197+ Ok ( query_result) => cube_store_results. push ( query_result) ,
198+ Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
199+ } ;
200+ }
180201
181202 let results_data_array = cx. argument :: < JsValue > ( 2 ) ?;
182203 let deserializer = JsValueDeserializer :: new ( & mut cx, results_data_array) ;
@@ -207,7 +228,7 @@ pub fn final_cubestore_result_array(mut cx: FunctionContext) -> JsResult<JsPromi
207228 Ok ( promise)
208229}
209230
210- pub fn final_cubestore_result_multi ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
231+ pub fn final_query_result_multi ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
211232 let transform_data_array = cx. argument :: < JsValue > ( 0 ) ?;
212233 let deserializer = JsValueDeserializer :: new ( & mut cx, transform_data_array) ;
213234 let transform_requests: Vec < TransformDataRequest > = match Deserialize :: deserialize ( deserializer)
@@ -216,16 +237,14 @@ pub fn final_cubestore_result_multi(mut cx: FunctionContext) -> JsResult<JsPromi
216237 Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
217238 } ;
218239
219- let cube_store_array = cx. argument :: < JsArray > ( 1 ) ?;
220- let cube_store_results_boxed: Vec < Handle < JsBox < Arc < CubeStoreResult > > > > = cube_store_array
221- . to_vec ( & mut cx) ?
222- . into_iter ( )
223- . map ( |js_value| js_value. downcast_or_throw :: < JsBox < Arc < CubeStoreResult > > , _ > ( & mut cx) )
224- . collect :: < Result < _ , _ > > ( ) ?;
225- let cube_store_results: Vec < Arc < CubeStoreResult > > = cube_store_results_boxed
226- . iter ( )
227- . map ( |handle| ( * * handle) . clone ( ) )
228- . collect ( ) ;
240+ let data_array = cx. argument :: < JsArray > ( 1 ) ?;
241+ let mut cube_store_results: Vec < Arc < QueryResult > > = vec ! [ ] ;
242+ for data_arg in data_array. to_vec ( & mut cx) ? {
243+ match extract_query_result ( & mut cx, data_arg) {
244+ Ok ( query_result) => cube_store_results. push ( query_result) ,
245+ Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
246+ } ;
247+ }
229248
230249 let result_data_js_object = cx. argument :: < JsValue > ( 2 ) ?;
231250 let deserializer = JsValueDeserializer :: new ( & mut cx, result_data_js_object) ;
0 commit comments