From 920f2ffbc374aecf296bb0d5555b674ca9fb10c6 Mon Sep 17 00:00:00 2001 From: Shaun Wang Date: Wed, 28 Apr 2021 17:19:25 +1200 Subject: [PATCH 1/3] Use 'select_nth_unstable' to get median. --- oracle/src/default_combine_data.rs | 10 +++++----- oracle/src/tests.rs | 9 +++++++++ traits/src/data_provider.rs | 7 +++---- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/oracle/src/default_combine_data.rs b/oracle/src/default_combine_data.rs index 4f096cfff..1e47639e5 100644 --- a/oracle/src/default_combine_data.rs +++ b/oracle/src/default_combine_data.rs @@ -27,13 +27,13 @@ where let count = values.len() as u32; let minimum_count = MinimumCount::get(); - if count < minimum_count { + if count < minimum_count || count == 0 { return prev_value; } - values.sort_by(|a, b| a.value.cmp(&b.value)); - - let median_index = count / 2; - Some(values[median_index as usize].clone()) + let mid_index = count / 2; + // Won't panic as guarded values empty case. + let (_, value, _) = values.select_nth_unstable_by(mid_index as usize, |a, b| a.value.cmp(&b.value)); + Some(value.clone()) } } diff --git a/oracle/src/tests.rs b/oracle/src/tests.rs index 423fe2a82..a1c994316 100644 --- a/oracle/src/tests.rs +++ b/oracle/src/tests.rs @@ -162,6 +162,15 @@ fn should_combined_data() { }); } +#[test] +fn default_combine_works_with_no_feeded_value() { + new_test_ext().execute_with(|| { + let key: u32 = 50; + + assert_eq!(ModuleOracle::get(&key), None); + }); +} + #[test] fn should_return_none_for_non_exist_key() { new_test_ext().execute_with(|| { diff --git a/traits/src/data_provider.rs b/traits/src/data_provider.rs index 4b3483df3..87f70d5fb 100644 --- a/traits/src/data_provider.rs +++ b/traits/src/data_provider.rs @@ -30,10 +30,9 @@ pub fn median(mut items: Vec) -> Option { let mid_index = items.len() / 2; - items.sort(); - - // Won't panic as guarded items not empty case. - Some(items[mid_index as usize].clone()) + // Won't panic as guarded items empty case. + let (_, item, _) = items.select_nth_unstable(mid_index); + Some(item.clone()) } #[macro_export] From 04f55312bf60f191821b528a0a05f19b2b8b1f2f Mon Sep 17 00:00:00 2001 From: Shaun Wang Date: Wed, 28 Apr 2021 17:20:27 +1200 Subject: [PATCH 2/3] fix --- oracle/src/tests.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/oracle/src/tests.rs b/oracle/src/tests.rs index a1c994316..423fe2a82 100644 --- a/oracle/src/tests.rs +++ b/oracle/src/tests.rs @@ -162,15 +162,6 @@ fn should_combined_data() { }); } -#[test] -fn default_combine_works_with_no_feeded_value() { - new_test_ext().execute_with(|| { - let key: u32 = 50; - - assert_eq!(ModuleOracle::get(&key), None); - }); -} - #[test] fn should_return_none_for_non_exist_key() { new_test_ext().execute_with(|| { From 51cb09bab141e6f206727fb2b999f15c48d9186a Mon Sep 17 00:00:00 2001 From: Shaun Wang Date: Wed, 28 Apr 2021 17:22:02 +1200 Subject: [PATCH 3/3] Update comments doc. --- oracle/src/default_combine_data.rs | 2 +- traits/src/data_provider.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/oracle/src/default_combine_data.rs b/oracle/src/default_combine_data.rs index 1e47639e5..d8c3f080c 100644 --- a/oracle/src/default_combine_data.rs +++ b/oracle/src/default_combine_data.rs @@ -32,7 +32,7 @@ where } let mid_index = count / 2; - // Won't panic as guarded values empty case. + // Won't panic as `values` ensured not empty. let (_, value, _) = values.select_nth_unstable_by(mid_index as usize, |a, b| a.value.cmp(&b.value)); Some(value.clone()) } diff --git a/traits/src/data_provider.rs b/traits/src/data_provider.rs index 87f70d5fb..650d3982c 100644 --- a/traits/src/data_provider.rs +++ b/traits/src/data_provider.rs @@ -30,7 +30,7 @@ pub fn median(mut items: Vec) -> Option { let mid_index = items.len() / 2; - // Won't panic as guarded items empty case. + // Won't panic as `items` ensured not empty. let (_, item, _) = items.select_nth_unstable(mid_index); Some(item.clone()) }