Skip unnecessary computations when the load balancer is disabled (#4184)

* Only get_deck_config when load balancer is enabled

* Refactor load balancer card addition logic to use pre-fetched deckconfig_id

* Refactor get_scheduling_states to use context for deck configuration
This commit is contained in:
Jarrett Ye 2025-07-08 17:29:36 +08:00 committed by GitHub
parent 6744a0a31a
commit 208729fa3e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -228,28 +228,31 @@ impl Collection {
/// Return the next states that will be applied for each answer button. /// Return the next states that will be applied for each answer button.
pub fn get_scheduling_states(&mut self, cid: CardId) -> Result<SchedulingStates> { pub fn get_scheduling_states(&mut self, cid: CardId) -> Result<SchedulingStates> {
let card = self.storage.get_card(cid)?.or_not_found(cid)?; let card = self.storage.get_card(cid)?.or_not_found(cid)?;
let deck = self.get_deck(card.deck_id)?.or_not_found(card.deck_id)?; let note_id = card.note_id;
let note_id = deck
.config_id()
.map(|deck_config_id| self.get_deck_config(deck_config_id, false))
.transpose()?
.flatten()
.map(|deck_config| deck_config.inner.bury_reviews)
.unwrap_or(false)
.then_some(card.note_id);
let ctx = self.card_state_updater(card)?; let ctx = self.card_state_updater(card)?;
let current = ctx.current_card_state(); let current = ctx.current_card_state();
let load_balancer_ctx = self.state.card_queues.as_ref().and_then(|card_queues| { let load_balancer_ctx = if let Some(load_balancer) = self
match card_queues.load_balancer.as_ref() { .state
None => None, .card_queues
Some(load_balancer) => { .as_ref()
Some(load_balancer.review_context(note_id, deck.config_id()?)) .and_then(|card_queues| card_queues.load_balancer.as_ref())
{
// Only get_deck_config when load balancer is enabled
if let Some(deck_config_id) = ctx.deck.config_id() {
let note_id = self
.get_deck_config(deck_config_id, false)?
.map(|deck_config| deck_config.inner.bury_reviews)
.unwrap_or(false)
.then_some(note_id);
Some(load_balancer.review_context(note_id, deck_config_id))
} else {
None
} }
} } else {
}); None
};
let state_ctx = ctx.state_context(load_balancer_ctx); let state_ctx = ctx.state_context(load_balancer_ctx);
Ok(current.next_states(&state_ctx)) Ok(current.next_states(&state_ctx))
@ -334,6 +337,7 @@ impl Collection {
self.update_deck_stats_from_answer(usn, answer, &updater, original.queue)?; self.update_deck_stats_from_answer(usn, answer, &updater, original.queue)?;
self.maybe_bury_siblings(&original, &updater.config)?; self.maybe_bury_siblings(&original, &updater.config)?;
let timing = updater.timing; let timing = updater.timing;
let deckconfig_id = updater.deck.config_id();
let mut card = updater.into_card(); let mut card = updater.into_card();
if !matches!( if !matches!(
answer.current_state, answer.current_state,
@ -352,15 +356,17 @@ impl Collection {
} }
if card.queue == CardQueue::Review { if card.queue == CardQueue::Review {
let deck = self.get_deck(card.deck_id)?; if let Some(load_balancer) = self
if let Some(card_queues) = self.state.card_queues.as_mut() { .state
if let Some(deckconfig_id) = deck.and_then(|deck| deck.config_id()) { .card_queues
if let Some(load_balancer) = card_queues.load_balancer.as_mut() { .as_mut()
.and_then(|card_queues| card_queues.load_balancer.as_mut())
{
if let Some(deckconfig_id) = deckconfig_id {
load_balancer.add_card(card.id, card.note_id, deckconfig_id, card.interval) load_balancer.add_card(card.id, card.note_id, deckconfig_id, card.interval)
} }
} }
} }
}
// Handle queue updates based on from_queue flag // Handle queue updates based on from_queue flag
if answer.from_queue { if answer.from_queue {