new random handling

This commit is contained in:
Damien Elmes 2009-04-23 01:25:42 +09:00
parent a6827b8dd7
commit fbf31d60da

View file

@ -47,7 +47,7 @@ REV_CARDS_NEW_FIRST = 1
REV_CARDS_DUE_FIRST = 2 REV_CARDS_DUE_FIRST = 2
REV_CARDS_RANDOM = 3 REV_CARDS_RANDOM = 3
DECK_VERSION = 33 DECK_VERSION = 34
deckVarsTable = Table( deckVarsTable = Table(
'deckVars', metadata, 'deckVars', metadata,
@ -221,7 +221,7 @@ limit 1""")
return self._getNewCard() return self._getNewCard()
def newCardTable(self): def newCardTable(self):
return ("acqCardsRandom", return ("acqCardsOld",
"acqCardsOld", "acqCardsOld",
"acqCardsNew")[self.newCardOrder] "acqCardsNew")[self.newCardOrder]
@ -516,6 +516,27 @@ combinedDue = created, modified = :now, due = created
where id in %s""" % ids2str(ids), now=time.time(), new=0) where id in %s""" % ids2str(ids), now=time.time(), new=0)
self.flushMod() self.flushMod()
def randomizeNewCards(self):
"Randomize 'due' on all new cards."
now = time.time()
fids = self.s.column0("""
select distinct factId from cards where type = 2""")
data = [{'fid': fid, 'rand': random.uniform(0, now)} for fid in fids]
self.s.statements("""
update cards
set due = :rand + ordinal,
combinedDue = max(:rand + ordinal, spaceUntil)
where factId = :fid
and type = 2""", data)
def orderNewCards(self):
"Set 'due' to card creation time."
self.s.statement("""
update cards set
due = created,
combinedDue = max(spaceUntil, due)
where type = 2""")
def rescheduleCards(self, ids, min, max): def rescheduleCards(self, ids, min, max):
"Reset cards and schedule with new interval in days (min, max)." "Reset cards and schedule with new interval in days (min, max)."
self.resetCards(ids) self.resetCards(ids)
@ -935,8 +956,17 @@ and due < :now""", now=time.time())
self.s.save(fact) self.s.save(fact)
self.factCount += 1 self.factCount += 1
self.flushMod() self.flushMod()
random = self.newCardOrder == NEW_CARDS_RANDOM
if random:
oldest = self.s.scalar("""
select min(due) from cards
where type = 2 and priority in (1,2,3,4)""") or 0
due = random.uniform(oldest, time.time())
for cardModel in cms: for cardModel in cms:
card = anki.cards.Card(fact, cardModel) card = anki.cards.Card(fact, cardModel)
if random:
card.due = due + card.ordinal
card.combinedDue = card.due
self.flushMod() self.flushMod()
cards.append(card) cards.append(card)
self.updateFactTags([fact.id]) self.updateFactTags([fact.id])
@ -2359,11 +2389,11 @@ seq > :s and seq <= :e order by seq desc""", s=start, e=end)
required.append("intervalDesc") required.append("intervalDesc")
if self.revCardOrder == REV_CARDS_NEW_FIRST: if self.revCardOrder == REV_CARDS_NEW_FIRST:
required.append("intervalAsc") required.append("intervalAsc")
if (self.revCardOrder == REV_CARDS_RANDOM or if self.revCardOrder == REV_CARDS_RANDOM:
self.newCardOrder == NEW_CARDS_RANDOM):
required.append("randomOrder") required.append("randomOrder")
if (self.revCardOrder == REV_CARDS_DUE_FIRST or if (self.revCardOrder == REV_CARDS_DUE_FIRST or
self.newCardOrder == NEW_CARDS_OLD_FIRST): self.newCardOrder == NEW_CARDS_OLD_FIRST or
self.newCardOrder == NEW_CARDS_RANDOM):
required.append("dueAsc") required.append("dueAsc")
if (self.newCardOrder == NEW_CARDS_NEW_FIRST): if (self.newCardOrder == NEW_CARDS_NEW_FIRST):
required.append("dueDesc") required.append("dueDesc")
@ -2630,11 +2660,6 @@ where type = 1 and isDue = 1
order by priority desc, factId, ordinal""") order by priority desc, factId, ordinal""")
# new cards # new cards
s.statement(""" s.statement("""
create view acqCardsRandom as
select * from cards
where type = 2 and isDue = 1
order by priority desc, factId, ordinal""")
s.statement("""
create view acqCardsOld as create view acqCardsOld as
select * from cards select * from cards
where type = 2 and isDue = 1 where type = 2 and isDue = 1
@ -2967,6 +2992,13 @@ nextFactor, reps, thinkingTime, yesCount, noCount from reviewHistory""")
DeckStorage._addIndices(deck) DeckStorage._addIndices(deck)
deck.version = 33 deck.version = 33
deck.s.commit() deck.s.commit()
if deck.version < 34:
if deck.newCardOrder == NEW_CARDS_RANDOM:
deck.randomizeNewCards()
deck.updateDynamicIndices()
deck.s.execute("drop view if exists acqCardsRandom")
deck.version = 34
deck.s.commit()
# executing a pragma here is very slow on large decks, so we store # executing a pragma here is very slow on large decks, so we store
# our own record # our own record
if not deck.getInt("pageSize") == 4096: if not deck.getInt("pageSize") == 4096: