From e261d93ce5a5e61644e74f76e3b3dfcc668a3154 Mon Sep 17 00:00:00 2001 From: boris Date: Fri, 28 Aug 2026 15:49:02 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B7=B3=E8=BF=87=E5=B7=B2=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E5=BF=AB=E7=85=A7=E7=9A=84=E9=87=8D=E5=A4=8D=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/fidc-core/src/data.rs | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) 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>,