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,32 @@ 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+ if let Ok ( js_box) = data_arg. downcast :: < JsBox < Arc < QueryResult > > , _ > ( cx) {
58+ Ok ( Arc :: clone ( & js_box) )
59+ } else if let Ok ( js_array) = data_arg. downcast :: < JsArray , _ > ( cx) {
60+ let deserializer = JsValueDeserializer :: new ( cx, js_array. upcast ( ) ) ;
61+ let js_raw_data: JsRawData = Deserialize :: deserialize ( deserializer) ?;
62+
63+ QueryResult :: from_js_raw_data ( js_raw_data)
64+ . map ( Arc :: new)
65+ . map_err ( anyhow:: Error :: from)
66+ } else {
67+ Err ( anyhow:: anyhow!(
68+ "Second argument must be an Array of JsBox<Arc<QueryResult>> or JsArray"
69+ ) )
70+ }
71+ }
72+
5373pub fn parse_cubestore_result_message ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
5474 let msg = cx. argument :: < JsBuffer > ( 0 ) ?;
5575 let msg_data = msg. as_slice ( & cx) . to_vec ( ) ;
5676
5777 let promise = cx
58- . task ( move || CubeStoreResult :: from_fb ( & msg_data) )
78+ . task ( move || QueryResult :: from_cubestore_fb ( & msg_data) )
5979 . promise ( move |mut cx, res| match res {
6080 Ok ( result) => Ok ( cx. boxed ( Arc :: new ( result) ) ) ,
6181 Err ( err) => cx. throw_error ( err. to_string ( ) ) ,
@@ -65,7 +85,7 @@ pub fn parse_cubestore_result_message(mut cx: FunctionContext) -> JsResult<JsPro
6585}
6686
6787pub fn get_cubestore_result ( mut cx : FunctionContext ) -> JsResult < JsValue > {
68- let result = cx. argument :: < JsBox < Arc < CubeStoreResult > > > ( 0 ) ?;
88+ let result = cx. argument :: < JsBox < Arc < QueryResult > > > ( 0 ) ?;
6989
7090 let js_array = cx. execute_scoped ( |mut cx| {
7191 let js_array = JsArray :: new ( & mut cx, result. rows . len ( ) ) ;
@@ -99,7 +119,7 @@ pub fn transform_query_data(mut cx: FunctionContext) -> JsResult<JsPromise> {
99119 Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
100120 } ;
101121
102- let cube_store_result = cx. argument :: < JsBox < Arc < CubeStoreResult > > > ( 1 ) ?;
122+ let cube_store_result = cx. argument :: < JsBox < Arc < QueryResult > > > ( 1 ) ?;
103123 let cube_store_result = Arc :: clone ( & cube_store_result) ;
104124
105125 let promise = cx
@@ -126,7 +146,7 @@ pub fn transform_query_data(mut cx: FunctionContext) -> JsResult<JsPromise> {
126146 Ok ( promise)
127147}
128148
129- pub fn final_cubestore_result ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
149+ pub fn final_query_result ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
130150 let transform_data_js_object = cx. argument :: < JsValue > ( 0 ) ?;
131151 let deserializer = JsValueDeserializer :: new ( & mut cx, transform_data_js_object) ;
132152 let transform_request_data: TransformDataRequest = match Deserialize :: deserialize ( deserializer)
@@ -135,8 +155,12 @@ pub fn final_cubestore_result(mut cx: FunctionContext) -> JsResult<JsPromise> {
135155 Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
136156 } ;
137157
138- let cube_store_result = cx. argument :: < JsBox < Arc < CubeStoreResult > > > ( 1 ) ?;
139- let cube_store_result = Arc :: clone ( & cube_store_result) ;
158+ let data_arg = cx. argument :: < JsValue > ( 1 ) ?;
159+ let cube_store_result: Arc < QueryResult > = match extract_query_result ( & mut cx, data_arg) {
160+ Ok ( query_result) => query_result,
161+ Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
162+ } ;
163+
140164 let result_data_js_object = cx. argument :: < JsValue > ( 2 ) ?;
141165 let deserializer = JsValueDeserializer :: new ( & mut cx, result_data_js_object) ;
142166 let mut result_data: RequestResultData = match Deserialize :: deserialize ( deserializer) {
@@ -158,7 +182,7 @@ pub fn final_cubestore_result(mut cx: FunctionContext) -> JsResult<JsPromise> {
158182 Ok ( promise)
159183}
160184
161- pub fn final_cubestore_result_array ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
185+ pub fn final_query_result_array ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
162186 let transform_data_array = cx. argument :: < JsValue > ( 0 ) ?;
163187 let deserializer = JsValueDeserializer :: new ( & mut cx, transform_data_array) ;
164188 let transform_requests: Vec < TransformDataRequest > = match Deserialize :: deserialize ( deserializer)
@@ -167,16 +191,14 @@ pub fn final_cubestore_result_array(mut cx: FunctionContext) -> JsResult<JsPromi
167191 Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
168192 } ;
169193
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 ( ) ;
194+ let data_array = cx. argument :: < JsArray > ( 1 ) ?;
195+ let mut cube_store_results: Vec < Arc < QueryResult > > = vec ! [ ] ;
196+ for data_arg in data_array. to_vec ( & mut cx) ? {
197+ match extract_query_result ( & mut cx, data_arg) {
198+ Ok ( query_result) => cube_store_results. push ( query_result) ,
199+ Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
200+ } ;
201+ }
180202
181203 let results_data_array = cx. argument :: < JsValue > ( 2 ) ?;
182204 let deserializer = JsValueDeserializer :: new ( & mut cx, results_data_array) ;
@@ -207,7 +229,7 @@ pub fn final_cubestore_result_array(mut cx: FunctionContext) -> JsResult<JsPromi
207229 Ok ( promise)
208230}
209231
210- pub fn final_cubestore_result_multi ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
232+ pub fn final_query_result_multi ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
211233 let transform_data_array = cx. argument :: < JsValue > ( 0 ) ?;
212234 let deserializer = JsValueDeserializer :: new ( & mut cx, transform_data_array) ;
213235 let transform_requests: Vec < TransformDataRequest > = match Deserialize :: deserialize ( deserializer)
@@ -216,16 +238,14 @@ pub fn final_cubestore_result_multi(mut cx: FunctionContext) -> JsResult<JsPromi
216238 Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
217239 } ;
218240
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 ( ) ;
241+ let data_array = cx. argument :: < JsArray > ( 1 ) ?;
242+ let mut cube_store_results: Vec < Arc < QueryResult > > = vec ! [ ] ;
243+ for data_arg in data_array. to_vec ( & mut cx) ? {
244+ match extract_query_result ( & mut cx, data_arg) {
245+ Ok ( query_result) => cube_store_results. push ( query_result) ,
246+ Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
247+ } ;
248+ }
229249
230250 let result_data_js_object = cx. argument :: < JsValue > ( 2 ) ?;
231251 let deserializer = JsValueDeserializer :: new ( & mut cx, result_data_js_object) ;
0 commit comments