mirror of
https://github.com/ankitects/anki.git
synced 2025-09-24 16:56:36 -04:00
dynamic index generation, sort new in rev order
This commit is contained in:
parent
b91b458c6d
commit
8c9803e638
2 changed files with 70 additions and 23 deletions
92
anki/deck.py
92
anki/deck.py
|
@ -38,6 +38,9 @@ MATURE_THRESHOLD = 21
|
||||||
NEW_CARDS_DISTRIBUTE = 0
|
NEW_CARDS_DISTRIBUTE = 0
|
||||||
NEW_CARDS_LAST = 1
|
NEW_CARDS_LAST = 1
|
||||||
NEW_CARDS_FIRST = 2
|
NEW_CARDS_FIRST = 2
|
||||||
|
NEW_CARDS_RANDOM = 0
|
||||||
|
NEW_CARDS_OLD_FIRST = 1
|
||||||
|
NEW_CARDS_NEW_FIRST = 2
|
||||||
REV_CARDS_OLD_FIRST = 0
|
REV_CARDS_OLD_FIRST = 0
|
||||||
REV_CARDS_NEW_FIRST = 1
|
REV_CARDS_NEW_FIRST = 1
|
||||||
REV_CARDS_DUE_FIRST = 2
|
REV_CARDS_DUE_FIRST = 2
|
||||||
|
@ -50,7 +53,7 @@ decksTable = Table(
|
||||||
Column('created', Float, nullable=False, default=time.time),
|
Column('created', Float, nullable=False, default=time.time),
|
||||||
Column('modified', Float, nullable=False, default=time.time),
|
Column('modified', Float, nullable=False, default=time.time),
|
||||||
Column('description', UnicodeText, nullable=False, default=u""),
|
Column('description', UnicodeText, nullable=False, default=u""),
|
||||||
Column('version', Integer, nullable=False, default=24),
|
Column('version', Integer, nullable=False, default=25),
|
||||||
Column('currentModelId', Integer, ForeignKey("models.id")),
|
Column('currentModelId', Integer, ForeignKey("models.id")),
|
||||||
# syncing
|
# syncing
|
||||||
Column('syncName', UnicodeText),
|
Column('syncName', UnicodeText),
|
||||||
|
@ -210,7 +213,8 @@ limit 1""")
|
||||||
|
|
||||||
def newCardTable(self):
|
def newCardTable(self):
|
||||||
return ("acqCardsRandom",
|
return ("acqCardsRandom",
|
||||||
"acqCardsOrdered")[self.newCardOrder]
|
"acqCardsOld",
|
||||||
|
"acqCardsNew")[self.newCardOrder]
|
||||||
|
|
||||||
def revCardTable(self):
|
def revCardTable(self):
|
||||||
return ("revCardsOld",
|
return ("revCardsOld",
|
||||||
|
@ -1937,6 +1941,47 @@ seq > :s and seq <= :e order by seq desc""", s=start, e=end)
|
||||||
self.refresh()
|
self.refresh()
|
||||||
self.rebuildCounts()
|
self.rebuildCounts()
|
||||||
|
|
||||||
|
# Dynamic indices
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
def updateDynamicIndices(self):
|
||||||
|
t = time.time()
|
||||||
|
indices = {
|
||||||
|
'intervalDesc':
|
||||||
|
'(type, isDue, priority desc, interval desc)',
|
||||||
|
'intervalAsc':
|
||||||
|
'(type, isDue, priority desc, interval)',
|
||||||
|
'randomOrder':
|
||||||
|
'(type, isDue, priority desc, factId, ordinal)',
|
||||||
|
'dueAsc':
|
||||||
|
'(type, isDue, priority desc, due)',
|
||||||
|
'dueDesc':
|
||||||
|
'(type, isDue, priority desc, due desc)',
|
||||||
|
}
|
||||||
|
# determine required
|
||||||
|
required = []
|
||||||
|
if self.revCardOrder == REV_CARDS_OLD_FIRST:
|
||||||
|
required.append("intervalDesc")
|
||||||
|
if self.revCardOrder == REV_CARDS_NEW_FIRST:
|
||||||
|
required.append("intervalAsc")
|
||||||
|
if (self.revCardOrder == REV_CARDS_RANDOM or
|
||||||
|
self.newCardOrder == NEW_CARDS_RANDOM):
|
||||||
|
required.append("randomOrder")
|
||||||
|
if (self.revCardOrder == REV_CARDS_DUE_FIRST or
|
||||||
|
self.newCardOrder == NEW_CARDS_OLD_FIRST):
|
||||||
|
required.append("dueAsc")
|
||||||
|
if (self.newCardOrder == NEW_CARDS_NEW_FIRST):
|
||||||
|
required.append("dueDesc")
|
||||||
|
# add/delete
|
||||||
|
for (k, v) in indices.items():
|
||||||
|
if k in required:
|
||||||
|
self.s.statement(
|
||||||
|
"create index if not exists ix_cards_%s on cards %s" %
|
||||||
|
(k, v))
|
||||||
|
else:
|
||||||
|
self.s.statement("drop index if exists ix_cards_%s" % k)
|
||||||
|
print "up", time.time() - t
|
||||||
|
|
||||||
# Shared decks
|
# Shared decks
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
|
@ -2080,25 +2125,10 @@ class DeckStorage(object):
|
||||||
|
|
||||||
def _addIndices(deck):
|
def _addIndices(deck):
|
||||||
"Add indices to the DB."
|
"Add indices to the DB."
|
||||||
# card queues
|
# failed cards, review early, check due
|
||||||
deck.s.statement("""
|
deck.s.statement("""
|
||||||
create index if not exists ix_cards_duePriority on cards
|
create index if not exists ix_cards_duePriority on cards
|
||||||
(type, isDue, combinedDue, priority)""")
|
(type, isDue, combinedDue, priority)""")
|
||||||
deck.s.statement("""
|
|
||||||
create index if not exists ix_cards_intervalDesc on cards
|
|
||||||
(type, isDue, priority desc, interval desc)""")
|
|
||||||
deck.s.statement("""
|
|
||||||
create index if not exists ix_cards_intervalAsc on cards
|
|
||||||
(type, isDue, priority desc, interval)""")
|
|
||||||
deck.s.statement("""
|
|
||||||
create index if not exists ix_cards_randomOrder on cards
|
|
||||||
(type, isDue, priority desc, factId, ordinal)""")
|
|
||||||
deck.s.statement("""
|
|
||||||
create index if not exists ix_cards_priorityDue on cards
|
|
||||||
(type, isDue, priority desc, combinedDue)""")
|
|
||||||
deck.s.statement("""
|
|
||||||
create index if not exists ix_cards_priorityDueReal on cards
|
|
||||||
(type, isDue, priority desc, due)""")
|
|
||||||
# card spacing
|
# card spacing
|
||||||
deck.s.statement("""
|
deck.s.statement("""
|
||||||
create index if not exists ix_cards_factId on cards (factId)""")
|
create index if not exists ix_cards_factId on cards (factId)""")
|
||||||
|
@ -2138,7 +2168,8 @@ create index if not exists ix_mediaDeleted_factId on mediaDeleted (mediaId)""")
|
||||||
s.statement("drop view if exists revCardsDue")
|
s.statement("drop view if exists revCardsDue")
|
||||||
s.statement("drop view if exists revCardsRandom")
|
s.statement("drop view if exists revCardsRandom")
|
||||||
s.statement("drop view if exists acqCardsRandom")
|
s.statement("drop view if exists acqCardsRandom")
|
||||||
s.statement("drop view if exists acqCardsOrdered")
|
s.statement("drop view if exists acqCardsOld")
|
||||||
|
s.statement("drop view if exists acqCardsNew")
|
||||||
# failed cards
|
# failed cards
|
||||||
s.statement("""
|
s.statement("""
|
||||||
create view failedCards as
|
create view failedCards as
|
||||||
|
@ -2174,10 +2205,15 @@ select * from cards
|
||||||
where type = 2 and isDue = 1
|
where type = 2 and isDue = 1
|
||||||
order by priority desc, factId, ordinal""")
|
order by priority desc, factId, ordinal""")
|
||||||
s.statement("""
|
s.statement("""
|
||||||
create view acqCardsOrdered as
|
create view acqCardsOld as
|
||||||
select * from cards
|
select * from cards
|
||||||
where type = 2 and isDue = 1
|
where type = 2 and isDue = 1
|
||||||
order by priority desc, due""")
|
order by priority desc, due""")
|
||||||
|
s.statement("""
|
||||||
|
create view acqCardsNew as
|
||||||
|
select * from cards
|
||||||
|
where type = 2 and isDue = 1
|
||||||
|
order by priority desc, due desc""")
|
||||||
_addViews = staticmethod(_addViews)
|
_addViews = staticmethod(_addViews)
|
||||||
|
|
||||||
def _upgradeDeck(deck, path):
|
def _upgradeDeck(deck, path):
|
||||||
|
@ -2396,6 +2432,15 @@ where interval < 1""")
|
||||||
"update cardModels set lastFontColour = '#ffffff'")
|
"update cardModels set lastFontColour = '#ffffff'")
|
||||||
deck.version = 24
|
deck.version = 24
|
||||||
deck.s.commit()
|
deck.s.commit()
|
||||||
|
if deck.version < 25:
|
||||||
|
deck.s.statement("drop index if exists ix_cards_priorityDue")
|
||||||
|
deck.s.statement("drop index if exists ix_cards_priorityDueReal")
|
||||||
|
DeckStorage._addViews(deck)
|
||||||
|
DeckStorage._addIndices(deck)
|
||||||
|
deck.updateDynamicIndices()
|
||||||
|
deck.s.statement("vacuum")
|
||||||
|
deck.version = 25
|
||||||
|
deck.s.commit()
|
||||||
return deck
|
return deck
|
||||||
_upgradeDeck = staticmethod(_upgradeDeck)
|
_upgradeDeck = staticmethod(_upgradeDeck)
|
||||||
|
|
||||||
|
@ -2451,7 +2496,8 @@ where interval < 1""")
|
||||||
def newCardOrderLabels():
|
def newCardOrderLabels():
|
||||||
return {
|
return {
|
||||||
0: _("Show new cards in random order"),
|
0: _("Show new cards in random order"),
|
||||||
1: _("Show new cards in order they were added"),
|
1: _("Show new cards in order added"),
|
||||||
|
2: _("Show new cards in reverse order added"),
|
||||||
}
|
}
|
||||||
|
|
||||||
def newCardSchedulingLabels():
|
def newCardSchedulingLabels():
|
||||||
|
@ -2463,8 +2509,8 @@ def newCardSchedulingLabels():
|
||||||
|
|
||||||
def revCardOrderLabels():
|
def revCardOrderLabels():
|
||||||
return {
|
return {
|
||||||
0: _("Review largest interval first"),
|
0: _("Review cards from largest interval"),
|
||||||
1: _("Review smallest interval first"),
|
1: _("Review cards from smallest interval"),
|
||||||
2: _("Review cards in order due"),
|
2: _("Review cards in order due"),
|
||||||
3: _("Review cards in random order"),
|
3: _("Review cards in random order"),
|
||||||
}
|
}
|
||||||
|
|
|
@ -567,6 +567,7 @@ values
|
||||||
def updateDeck(self, deck):
|
def updateDeck(self, deck):
|
||||||
self.applyDict(self.deck, deck)
|
self.applyDict(self.deck, deck)
|
||||||
self.deck.lastSync = self.deck.modified
|
self.deck.lastSync = self.deck.modified
|
||||||
|
self.deck.updateDynamicIndices()
|
||||||
|
|
||||||
def bundleStats(self):
|
def bundleStats(self):
|
||||||
def bundleStat(stat):
|
def bundleStat(stat):
|
||||||
|
|
Loading…
Reference in a new issue