1
1
use 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 :: {
4
4
get_final_cubestore_result_array, RequestResultArray , RequestResultData ,
5
5
RequestResultDataMulti , TransformedData ,
6
6
} ;
7
- use cubeorchestrator:: transport:: TransformDataRequest ;
7
+ use cubeorchestrator:: transport:: { JsRawData , TransformDataRequest } ;
8
8
use neon:: context:: { Context , FunctionContext , ModuleContext } ;
9
9
use neon:: handle:: Handle ;
10
10
use neon:: object:: Object ;
@@ -22,9 +22,9 @@ pub fn register_module(cx: &mut ModuleContext) -> NeonResult<()> {
22
22
) ?;
23
23
cx. export_function ( "getCubestoreResult" , get_cubestore_result) ?;
24
24
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 ) ?;
28
28
29
29
Ok ( ( ) )
30
30
}
@@ -50,12 +50,32 @@ where
50
50
}
51
51
}
52
52
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
+
53
73
pub fn parse_cubestore_result_message ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
54
74
let msg = cx. argument :: < JsBuffer > ( 0 ) ?;
55
75
let msg_data = msg. as_slice ( & cx) . to_vec ( ) ;
56
76
57
77
let promise = cx
58
- . task ( move || CubeStoreResult :: from_fb ( & msg_data) )
78
+ . task ( move || QueryResult :: from_cubestore_fb ( & msg_data) )
59
79
. promise ( move |mut cx, res| match res {
60
80
Ok ( result) => Ok ( cx. boxed ( Arc :: new ( result) ) ) ,
61
81
Err ( err) => cx. throw_error ( err. to_string ( ) ) ,
@@ -65,7 +85,7 @@ pub fn parse_cubestore_result_message(mut cx: FunctionContext) -> JsResult<JsPro
65
85
}
66
86
67
87
pub 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 ) ?;
69
89
70
90
let js_array = cx. execute_scoped ( |mut cx| {
71
91
let js_array = JsArray :: new ( & mut cx, result. rows . len ( ) ) ;
@@ -99,7 +119,7 @@ pub fn transform_query_data(mut cx: FunctionContext) -> JsResult<JsPromise> {
99
119
Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
100
120
} ;
101
121
102
- let cube_store_result = cx. argument :: < JsBox < Arc < CubeStoreResult > > > ( 1 ) ?;
122
+ let cube_store_result = cx. argument :: < JsBox < Arc < QueryResult > > > ( 1 ) ?;
103
123
let cube_store_result = Arc :: clone ( & cube_store_result) ;
104
124
105
125
let promise = cx
@@ -126,7 +146,7 @@ pub fn transform_query_data(mut cx: FunctionContext) -> JsResult<JsPromise> {
126
146
Ok ( promise)
127
147
}
128
148
129
- pub fn final_cubestore_result ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
149
+ pub fn final_query_result ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
130
150
let transform_data_js_object = cx. argument :: < JsValue > ( 0 ) ?;
131
151
let deserializer = JsValueDeserializer :: new ( & mut cx, transform_data_js_object) ;
132
152
let transform_request_data: TransformDataRequest = match Deserialize :: deserialize ( deserializer)
@@ -135,8 +155,12 @@ pub fn final_cubestore_result(mut cx: FunctionContext) -> JsResult<JsPromise> {
135
155
Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
136
156
} ;
137
157
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
+
140
164
let result_data_js_object = cx. argument :: < JsValue > ( 2 ) ?;
141
165
let deserializer = JsValueDeserializer :: new ( & mut cx, result_data_js_object) ;
142
166
let mut result_data: RequestResultData = match Deserialize :: deserialize ( deserializer) {
@@ -158,7 +182,7 @@ pub fn final_cubestore_result(mut cx: FunctionContext) -> JsResult<JsPromise> {
158
182
Ok ( promise)
159
183
}
160
184
161
- pub fn final_cubestore_result_array ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
185
+ pub fn final_query_result_array ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
162
186
let transform_data_array = cx. argument :: < JsValue > ( 0 ) ?;
163
187
let deserializer = JsValueDeserializer :: new ( & mut cx, transform_data_array) ;
164
188
let transform_requests: Vec < TransformDataRequest > = match Deserialize :: deserialize ( deserializer)
@@ -167,16 +191,14 @@ pub fn final_cubestore_result_array(mut cx: FunctionContext) -> JsResult<JsPromi
167
191
Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
168
192
} ;
169
193
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
+ }
180
202
181
203
let results_data_array = cx. argument :: < JsValue > ( 2 ) ?;
182
204
let deserializer = JsValueDeserializer :: new ( & mut cx, results_data_array) ;
@@ -207,7 +229,7 @@ pub fn final_cubestore_result_array(mut cx: FunctionContext) -> JsResult<JsPromi
207
229
Ok ( promise)
208
230
}
209
231
210
- pub fn final_cubestore_result_multi ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
232
+ pub fn final_query_result_multi ( mut cx : FunctionContext ) -> JsResult < JsPromise > {
211
233
let transform_data_array = cx. argument :: < JsValue > ( 0 ) ?;
212
234
let deserializer = JsValueDeserializer :: new ( & mut cx, transform_data_array) ;
213
235
let transform_requests: Vec < TransformDataRequest > = match Deserialize :: deserialize ( deserializer)
@@ -216,16 +238,14 @@ pub fn final_cubestore_result_multi(mut cx: FunctionContext) -> JsResult<JsPromi
216
238
Err ( err) => return cx. throw_error ( err. to_string ( ) ) ,
217
239
} ;
218
240
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
+ }
229
249
230
250
let result_data_js_object = cx. argument :: < JsValue > ( 2 ) ?;
231
251
let deserializer = JsValueDeserializer :: new ( & mut cx, result_data_js_object) ;
0 commit comments