Skip to content

Commit 8e3f54b

Browse files
fix: Remove HashMap for names (#624)
# Motivation Using Rust API, it is not possible to create multiple results with the same name as the result is encoded with a HashMap. If multiple results have the same name, the values have the same key, and only a single element is got back. # Description Replace HashMap by Vec for result creation. # Testing It will be tested as part of the load balancer.
2 parents 8d74493 + 21115bd commit 8e3f54b

File tree

6 files changed

+109
-198
lines changed

6 files changed

+109
-198
lines changed

packages/rust/armonik/src/client/agent.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::collections::HashMap;
2-
31
use futures::{Stream, StreamExt};
42
use snafu::ResultExt;
53

@@ -40,11 +38,11 @@ where
4038
token: impl Into<String>,
4139
session_id: impl Into<String>,
4240
names: impl std::iter::IntoIterator<Item = impl Into<String>>,
43-
) -> Result<HashMap<String, ResultMetaData>, super::RequestError> {
41+
) -> Result<Vec<ResultMetaData>, super::RequestError> {
4442
Ok(self
4543
.call(create_results_metadata::Request {
4644
communication_token: token.into(),
47-
names: names.into_collect(),
45+
results: names.into_iter().map(|name| name.into().into()).collect(),
4846
session_id: session_id.into(),
4947
})
5048
.await?
@@ -57,13 +55,13 @@ where
5755
token: impl Into<String>,
5856
session_id: impl Into<String>,
5957
results: impl std::iter::IntoIterator<Item = (impl Into<String>, impl Into<Vec<u8>>)>,
60-
) -> Result<HashMap<String, ResultMetaData>, super::RequestError> {
58+
) -> Result<Vec<ResultMetaData>, super::RequestError> {
6159
Ok(self
6260
.call(create_results::Request {
6361
communication_token: token.into(),
6462
results: results
6563
.into_iter()
66-
.map(|(name, data)| (name.into(), data.into()))
64+
.map(|(name, data)| (name.into(), data.into()).into())
6765
.collect(),
6866
session_id: session_id.into(),
6967
})
@@ -267,8 +265,6 @@ where
267265
#[cfg(test)]
268266
#[serial_test::serial(agent)]
269267
mod tests {
270-
use std::collections::HashMap;
271-
272268
use crate::Client;
273269

274270
// Named methods
@@ -346,7 +342,7 @@ mod tests {
346342
.call(crate::agent::create_results_metadata::Request {
347343
communication_token: String::from("token"),
348344
session_id: String::from("session-id"),
349-
names: Vec::new(),
345+
results: Vec::new(),
350346
})
351347
.await
352348
.unwrap();
@@ -362,7 +358,7 @@ mod tests {
362358
.call(crate::agent::create_results::Request {
363359
communication_token: String::from("token"),
364360
session_id: String::from("session-id"),
365-
results: HashMap::new(),
361+
results: Vec::new(),
366362
})
367363
.await
368364
.unwrap();

packages/rust/armonik/src/client/results.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ where
8383
&mut self,
8484
session_id: impl Into<String>,
8585
results: impl IntoIterator<Item = create_metadata::RequestItem>,
86-
) -> Result<HashMap<String, Raw>, super::RequestError> {
86+
) -> Result<Vec<Raw>, super::RequestError> {
8787
Ok(self
8888
.call(create_metadata::Request {
8989
results: results.into_collect(),
@@ -98,7 +98,7 @@ where
9898
&mut self,
9999
session_id: impl Into<String>,
100100
results: impl IntoIterator<Item = create::RequestItem>,
101-
) -> Result<HashMap<String, Raw>, super::RequestError> {
101+
) -> Result<Vec<Raw>, super::RequestError> {
102102
Ok(self
103103
.call(create::Request {
104104
results: results.into_collect(),
Lines changed: 39 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,52 @@
1-
use std::collections::HashMap;
2-
31
use super::ResultMetaData;
42

53
use crate::api::v3;
64

5+
/// Result to create with data.
6+
#[derive(Debug, Clone, Default, PartialEq, Eq)]
7+
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8+
pub struct RequestItem {
9+
/// The name of the result to create.
10+
pub name: String,
11+
/// The data associated to the result to create.
12+
pub data: Vec<u8>,
13+
}
14+
15+
impl<K: Into<String>, V: Into<Vec<u8>>> From<(K, V)> for RequestItem {
16+
fn from((name, data): (K, V)) -> Self {
17+
Self {
18+
name: name.into(),
19+
data: data.into(),
20+
}
21+
}
22+
}
23+
24+
super::super::impl_convert!(
25+
struct RequestItem = v3::agent::create_results_request::ResultCreate {
26+
name,
27+
data,
28+
}
29+
);
30+
731
/// Request for creating results with data.
832
#[derive(Debug, Clone, Default, PartialEq, Eq)]
933
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1034
pub struct Request {
1135
/// Communication token received by the worker during task processing.
1236
pub communication_token: String,
1337
/// Results to create.
14-
pub results: HashMap<String, Vec<u8>>,
38+
pub results: Vec<RequestItem>,
1539
/// The session in which create results.
1640
pub session_id: String,
1741
}
1842

19-
impl From<Request> for v3::agent::CreateResultsRequest {
20-
fn from(value: Request) -> Self {
21-
Self {
22-
communication_token: value.communication_token,
23-
results: value
24-
.results
25-
.into_iter()
26-
.map(|(name, data)| v3::agent::create_results_request::ResultCreate { name, data })
27-
.collect(),
28-
session_id: value.session_id,
29-
}
43+
super::super::impl_convert!(
44+
struct Request = v3::agent::CreateResultsRequest {
45+
communication_token,
46+
list results,
47+
session_id,
3048
}
31-
}
32-
33-
impl From<v3::agent::CreateResultsRequest> for Request {
34-
fn from(value: v3::agent::CreateResultsRequest) -> Self {
35-
Self {
36-
communication_token: value.communication_token,
37-
results: value
38-
.results
39-
.into_iter()
40-
.map(|result| (result.name, result.data))
41-
.collect(),
42-
session_id: value.session_id,
43-
}
44-
}
45-
}
46-
47-
super::super::impl_convert!(req Request : v3::agent::CreateResultsRequest);
49+
);
4850

4951
/// Response for creating results without data.
5052
#[derive(Debug, Clone, Default)]
@@ -53,36 +55,12 @@ pub struct Response {
5355
/// Communication token received by the worker during task processing.
5456
pub communication_token: String,
5557
/// The list of ResultMetaData results that were created.
56-
pub results: HashMap<String, ResultMetaData>,
57-
}
58-
59-
impl From<Response> for v3::agent::CreateResultsResponse {
60-
fn from(value: Response) -> Self {
61-
Self {
62-
communication_token: value.communication_token,
63-
results: value
64-
.results
65-
.into_iter()
66-
.map(|(name, result)| {
67-
debug_assert_eq!(name, result.name);
68-
result.into()
69-
})
70-
.collect(),
71-
}
72-
}
58+
pub results: Vec<ResultMetaData>,
7359
}
7460

75-
impl From<v3::agent::CreateResultsResponse> for Response {
76-
fn from(value: v3::agent::CreateResultsResponse) -> Self {
77-
Self {
78-
communication_token: value.communication_token,
79-
results: value
80-
.results
81-
.into_iter()
82-
.map(|result| (result.name.clone(), result.into()))
83-
.collect(),
84-
}
61+
super::super::impl_convert!(
62+
struct Response = v3::agent::CreateResultsResponse{
63+
communication_token,
64+
list results,
8565
}
86-
}
87-
88-
super::super::impl_convert!(req Response : v3::agent::CreateResultsResponse);
66+
);
Lines changed: 33 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,46 @@
1-
use std::collections::HashMap;
2-
31
use super::ResultMetaData;
42

53
use crate::api::v3;
64

5+
/// Result to create without data.
6+
#[derive(Debug, Clone, Default, PartialEq, Eq)]
7+
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8+
pub struct RequestItem {
9+
/// The name of the result to create.
10+
pub name: String,
11+
}
12+
13+
impl<T: Into<String>> From<T> for RequestItem {
14+
fn from(value: T) -> Self {
15+
Self { name: value.into() }
16+
}
17+
}
18+
19+
super::super::impl_convert!(
20+
struct RequestItem = v3::agent::create_results_meta_data_request::ResultCreate {
21+
name,
22+
}
23+
);
24+
725
/// Request for creating results without data.
826
#[derive(Debug, Clone, Default, PartialEq, Eq)]
927
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1028
pub struct Request {
1129
/// Communication token received by the worker during task processing.
1230
pub communication_token: String,
1331
/// The list of names for the results to create.
14-
pub names: Vec<String>,
32+
pub results: Vec<RequestItem>,
1533
/// The session in which create results.
1634
pub session_id: String,
1735
}
1836

19-
impl From<Request> for v3::agent::CreateResultsMetaDataRequest {
20-
fn from(value: Request) -> Self {
21-
Self {
22-
communication_token: value.communication_token,
23-
results: value
24-
.names
25-
.into_iter()
26-
.map(
27-
|result| v3::agent::create_results_meta_data_request::ResultCreate {
28-
name: result,
29-
},
30-
)
31-
.collect(),
32-
session_id: value.session_id,
33-
}
37+
super::super::impl_convert!(
38+
struct Request = v3::agent::CreateResultsMetaDataRequest {
39+
communication_token,
40+
list results,
41+
session_id,
3442
}
35-
}
36-
37-
impl From<v3::agent::CreateResultsMetaDataRequest> for Request {
38-
fn from(value: v3::agent::CreateResultsMetaDataRequest) -> Self {
39-
Self {
40-
communication_token: value.communication_token,
41-
names: value
42-
.results
43-
.into_iter()
44-
.map(|result| result.name)
45-
.collect(),
46-
session_id: value.session_id,
47-
}
48-
}
49-
}
50-
51-
super::super::impl_convert!(req Request : v3::agent::CreateResultsMetaDataRequest);
43+
);
5244

5345
/// Response for creating results without data.
5446
#[derive(Debug, Clone, Default)]
@@ -57,36 +49,12 @@ pub struct Response {
5749
/// Communication token received by the worker during task processing.
5850
pub communication_token: String,
5951
/// The list of ResultMetaData results that were created.
60-
pub results: HashMap<String, ResultMetaData>,
52+
pub results: Vec<ResultMetaData>,
6153
}
6254

63-
impl From<Response> for v3::agent::CreateResultsMetaDataResponse {
64-
fn from(value: Response) -> Self {
65-
Self {
66-
communication_token: value.communication_token,
67-
results: value
68-
.results
69-
.into_iter()
70-
.map(|(k, v)| {
71-
debug_assert_eq!(k, v.name);
72-
v.into()
73-
})
74-
.collect(),
75-
}
55+
super::super::impl_convert!(
56+
struct Response = v3::agent::CreateResultsMetaDataResponse {
57+
communication_token,
58+
list results,
7659
}
77-
}
78-
79-
impl From<v3::agent::CreateResultsMetaDataResponse> for Response {
80-
fn from(value: v3::agent::CreateResultsMetaDataResponse) -> Self {
81-
Self {
82-
communication_token: value.communication_token,
83-
results: value
84-
.results
85-
.into_iter()
86-
.map(|result| (result.name.clone(), result.into()))
87-
.collect(),
88-
}
89-
}
90-
}
91-
92-
super::super::impl_convert!(req Response : v3::agent::CreateResultsMetaDataResponse);
60+
);

packages/rust/armonik/src/objects/results/create.rs

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::collections::HashMap;
2-
31
use super::Raw;
42

53
use crate::api::v3;
@@ -16,6 +14,16 @@ pub struct RequestItem {
1614
pub manual_deletion: bool,
1715
}
1816

17+
impl<K: Into<String>, V: Into<Vec<u8>>> From<(K, V)> for RequestItem {
18+
fn from((name, data): (K, V)) -> Self {
19+
Self {
20+
name: name.into(),
21+
data: data.into(),
22+
manual_deletion: false,
23+
}
24+
}
25+
}
26+
1927
super::super::impl_convert!(
2028
struct RequestItem = v3::results::create_results_request::ResultCreate {
2129
name,
@@ -46,34 +54,11 @@ super::super::impl_convert!(
4654
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4755
pub struct Response {
4856
/// The list of raw results that were created.
49-
pub results: HashMap<String, Raw>,
57+
pub results: Vec<Raw>,
5058
}
5159

52-
impl From<Response> for v3::results::CreateResultsResponse {
53-
fn from(value: Response) -> Self {
54-
Self {
55-
results: value
56-
.results
57-
.into_iter()
58-
.map(|(name, result)| {
59-
debug_assert_eq!(name, result.name);
60-
result.into()
61-
})
62-
.collect(),
63-
}
64-
}
65-
}
66-
67-
impl From<v3::results::CreateResultsResponse> for Response {
68-
fn from(value: v3::results::CreateResultsResponse) -> Self {
69-
Self {
70-
results: value
71-
.results
72-
.into_iter()
73-
.map(|result| (result.name.clone(), result.into()))
74-
.collect(),
75-
}
60+
super::super::impl_convert!(
61+
struct Response = v3::results::CreateResultsResponse {
62+
list results,
7663
}
77-
}
78-
79-
super::super::impl_convert!(req Response : v3::results::CreateResultsResponse);
64+
);

0 commit comments

Comments
 (0)