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.
pub fn get_scheduling_states(&mut self, cid: CardId) -> Result<SchedulingStates> {
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 = 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 note_id = card.note_id;
let ctx = self.card_state_updater(card)?;
let current = ctx.current_card_state();
let load_balancer_ctx = self.state.card_queues.as_ref().and_then(|card_queues| {
match card_queues.load_balancer.as_ref() {
None => None,
Some(load_balancer) => {
Some(load_balancer.review_context(note_id, deck.config_id()?))
}
let load_balancer_ctx = if let Some(load_balancer) = self
.state
.card_queues
.as_ref()
.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);
Ok(current.next_states(&state_ctx))
@ -334,6 +337,7 @@ impl Collection {
self.update_deck_stats_from_answer(usn, answer, &updater, original.queue)?;
self.maybe_bury_siblings(&original, &updater.config)?;
let timing = updater.timing;
let deckconfig_id = updater.deck.config_id();
let mut card = updater.into_card();
if !matches!(
answer.current_state,
@ -352,12 +356,14 @@ impl Collection {
}
if card.queue == CardQueue::Review {
let deck = self.get_deck(card.deck_id)?;
if let Some(card_queues) = self.state.card_queues.as_mut() {
if let Some(deckconfig_id) = deck.and_then(|deck| deck.config_id()) {
if let Some(load_balancer) = card_queues.load_balancer.as_mut() {
load_balancer.add_card(card.id, card.note_id, deckconfig_id, card.interval)
}
if let Some(load_balancer) = self
.state
.card_queues
.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)
}
}
}