fix(execution-engine): quickfix for canon map iteration order (#845)

An O(n) quickfix for the canon map reverse iteration bug.
This commit is contained in:
Ivan Boldyrev 2024-07-22 13:38:21 +02:00 committed by GitHub
parent c611ae584b
commit 038637f94d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 22 additions and 16 deletions

View File

@ -123,6 +123,12 @@ pub(crate) fn create_canon_stream_map_iterable_value(
} }
} }
} }
// the reverse iteration of the original data produce `values` in reverse order;
// the spec requires direct order of iteration, so reverse it one more time
//
// it can be solved at O(1) with special handling of reversed iterators in fold,
// so this O(n) implementation is just a quick fix
values.reverse();
let iterable_ingredients = CanonStreamMapIterableIngredients::init(values); let iterable_ingredients = CanonStreamMapIterableIngredients::init(values);
let iterable = Box::new(iterable_ingredients); let iterable = Box::new(iterable_ingredients);

View File

@ -955,12 +955,12 @@ async fn fold_canon_stream_map() {
(seq (seq
(seq (seq
(seq (seq
(ap ("key" "value4") %map) (ap ("key" "value1") %map)
(ap (-42 "value3") %map) (ap (-42 "value2") %map)
) )
(seq (seq
(ap (-42 "value2") %map) (ap (-42 "value3") %map)
(ap ("key" "value1") %map) (ap ("key" "value4") %map)
) )
) )
(seq (seq
@ -986,8 +986,8 @@ async fn fold_canon_stream_map() {
let mut cid_tracker: ExecutionCidState = ExecutionCidState::new(); let mut cid_tracker: ExecutionCidState = ExecutionCidState::new();
let tetraplet = json!({"function_name": "", "lens": "", "peer_pk": vm_1_peer_id, "service_id": ""}); let tetraplet = json!({"function_name": "", "lens": "", "peer_pk": vm_1_peer_id, "service_id": ""});
let map_value_2 = json!({"key": -42, "value": "value2"});
let map_value_1 = json!({"key": "key", "value": "value1"}); let map_value_1 = json!({"key": "key", "value": "value1"});
let map_value_2 = json!({"key": -42, "value": "value2"});
let map_value_3 = json!({"key": -42, "value": "value3"}); let map_value_3 = json!({"key": -42, "value": "value3"});
let map_value_4 = json!({"key": "key", "value": "value4"}); let map_value_4 = json!({"key": "key", "value": "value4"});
@ -999,13 +999,8 @@ async fn fold_canon_stream_map() {
canon_tracked( canon_tracked(
json!({"tetraplet": tetraplet, json!({"tetraplet": tetraplet,
"values": [ "values": [
{
"result": map_value_4,
"tetraplet": tetraplet,
"provenance": Provenance::Literal,
},
{ {
"result": map_value_3, "result": map_value_1,
"tetraplet": tetraplet, "tetraplet": tetraplet,
"provenance": Provenance::Literal, "provenance": Provenance::Literal,
}, },
@ -1015,7 +1010,12 @@ async fn fold_canon_stream_map() {
"provenance": Provenance::Literal, "provenance": Provenance::Literal,
}, },
{ {
"result": map_value_1, "result": map_value_3,
"tetraplet": tetraplet,
"provenance": Provenance::Literal,
},
{
"result": map_value_4,
"tetraplet": tetraplet, "tetraplet": tetraplet,
"provenance": Provenance::Literal, "provenance": Provenance::Literal,
}, },
@ -1023,20 +1023,20 @@ async fn fold_canon_stream_map() {
&mut cid_tracker, &mut cid_tracker,
), ),
scalar_tracked!( scalar_tracked!(
map_value_1.clone(), map_value_3.clone(),
cid_tracker, cid_tracker,
peer = &vm_1_peer_id, peer = &vm_1_peer_id,
service = "m..0", service = "m..0",
function = "f", function = "f",
args = [map_value_1] args = [map_value_3]
), ),
scalar_tracked!( scalar_tracked!(
map_value_2.clone(), map_value_4.clone(),
cid_tracker, cid_tracker,
peer = vm_1_peer_id, peer = vm_1_peer_id,
service = "m..0", service = "m..0",
function = "f", function = "f",
args = [map_value_2] args = [map_value_4]
), ),
]; ];