diff --git a/crates/fidc-core/src/data.rs b/crates/fidc-core/src/data.rs index 74d953c..2995329 100644 --- a/crates/fidc-core/src/data.rs +++ b/crates/fidc-core/src/data.rs @@ -1386,7 +1386,12 @@ impl DataSet { mut bundles: Vec, execution_quotes: Vec, ) -> Result { - bundles.sort_by_key(|bundle| bundle.date); + if !bundles + .windows(2) + .all(|window| window[0].date <= window[1].date) + { + bundles.sort_by_key(|bundle| bundle.date); + } if let Some(pair) = bundles.windows(2).find(|pair| pair[0].date == pair[1].date) { return Err(DataSetError::DuplicateDailyBundle { date: pair[1].date }); } @@ -1435,14 +1440,10 @@ impl DataSet { |row| row.date, |row| row.symbol.as_str(), )?; - bundle.market.sort_by(|left, right| left.symbol.cmp(&right.symbol)); + sort_rows_by_symbol_if_needed(&mut bundle.market, |row| row.symbol.as_str()); bundle.factors = normalize_factor_snapshots(bundle.factors); - bundle - .factors - .sort_by(|left, right| left.symbol.cmp(&right.symbol)); - bundle - .candidates - .sort_by(|left, right| left.symbol.cmp(&right.symbol)); + sort_rows_by_symbol_if_needed(&mut bundle.factors, |row| row.symbol.as_str()); + sort_rows_by_symbol_if_needed(&mut bundle.candidates, |row| row.symbol.as_str()); if !bundle.market.is_empty() { grouped.market_by_date.insert(date, bundle.market); } @@ -3844,6 +3845,18 @@ where } } +fn sort_rows_by_symbol_if_needed(rows: &mut Vec, symbol_of: F) +where + F: Fn(&T) -> &str + Copy, +{ + if !rows + .windows(2) + .all(|window| symbol_of(&window[0]) <= symbol_of(&window[1])) + { + rows.sort_by(|left, right| symbol_of(left).cmp(symbol_of(right))); + } +} + fn build_symbol_id_index( instruments: &HashMap, market_by_date: &BTreeMap>,