mirror of
https://github.com/ankitects/anki.git
synced 2025-09-19 06:22:22 -04:00
remove priorities
This commit is contained in:
parent
73d83bc640
commit
28604b9d29
8 changed files with 54 additions and 210 deletions
|
@ -29,12 +29,10 @@ cardsTable = Table(
|
||||||
Column('modified', Float, nullable=False, default=time.time),
|
Column('modified', Float, nullable=False, default=time.time),
|
||||||
Column('tags', UnicodeText, nullable=False, default=u""),
|
Column('tags', UnicodeText, nullable=False, default=u""),
|
||||||
Column('ordinal', Integer, nullable=False),
|
Column('ordinal', Integer, nullable=False),
|
||||||
# cached - changed on fact update
|
# q/a cached - changed on fact update
|
||||||
Column('question', UnicodeText, nullable=False, default=u""),
|
Column('question', UnicodeText, nullable=False, default=u""),
|
||||||
Column('answer', UnicodeText, nullable=False, default=u""),
|
Column('answer', UnicodeText, nullable=False, default=u""),
|
||||||
# default to 'normal' priority;
|
Column('priority', Integer, nullable=False, default=2), # obsolete
|
||||||
# this is indexed in deck.py as we need to create a reverse index
|
|
||||||
Column('priority', Integer, nullable=False, default=2),
|
|
||||||
Column('interval', Float, nullable=False, default=0),
|
Column('interval', Float, nullable=False, default=0),
|
||||||
Column('lastInterval', Float, nullable=False, default=0),
|
Column('lastInterval', Float, nullable=False, default=0),
|
||||||
Column('due', Float, nullable=False, default=time.time),
|
Column('due', Float, nullable=False, default=time.time),
|
||||||
|
|
230
anki/deck.py
230
anki/deck.py
|
@ -34,22 +34,6 @@ import anki.latex # sets up hook
|
||||||
import anki.models, anki.facts, anki.cards, anki.stats
|
import anki.models, anki.facts, anki.cards, anki.stats
|
||||||
import anki.history, anki.media
|
import anki.history, anki.media
|
||||||
|
|
||||||
# the current code set type -= 3 for manually suspended cards, and += 3*n
|
|
||||||
# for temporary suspends, (where n=1 for bury, n=2 for review/cram).
|
|
||||||
# This way we don't need to recalculate priorities when enabling the cards
|
|
||||||
# again, and paves the way for an arbitrary number of priorities in the
|
|
||||||
# future. But until all clients are upgraded, we need to keep munging the
|
|
||||||
# priorities to prevent older clients from getting confused
|
|
||||||
# PRIORITY_REVEARLY = -1
|
|
||||||
# PRIORITY_BURIED = -2
|
|
||||||
# PRIORITY_SUSPENDED = -3
|
|
||||||
|
|
||||||
# priorities
|
|
||||||
PRIORITY_HIGH = 4
|
|
||||||
PRIORITY_MED = 3
|
|
||||||
PRIORITY_NORM = 2
|
|
||||||
PRIORITY_LOW = 1
|
|
||||||
PRIORITY_NONE = 0
|
|
||||||
# rest
|
# rest
|
||||||
MATURE_THRESHOLD = 21
|
MATURE_THRESHOLD = 21
|
||||||
NEW_CARDS_DISTRIBUTE = 0
|
NEW_CARDS_DISTRIBUTE = 0
|
||||||
|
@ -72,7 +56,7 @@ SEARCH_FIELD = 6
|
||||||
SEARCH_FIELD_EXISTS = 7
|
SEARCH_FIELD_EXISTS = 7
|
||||||
SEARCH_QA = 8
|
SEARCH_QA = 8
|
||||||
SEARCH_PHRASE_WB = 9
|
SEARCH_PHRASE_WB = 9
|
||||||
DECK_VERSION = 65
|
DECK_VERSION = 70
|
||||||
|
|
||||||
deckVarsTable = Table(
|
deckVarsTable = Table(
|
||||||
'deckVars', metadata,
|
'deckVars', metadata,
|
||||||
|
@ -109,11 +93,11 @@ decksTable = Table(
|
||||||
Column('delay2', Float, nullable=False, default=0.0),
|
Column('delay2', Float, nullable=False, default=0.0),
|
||||||
# collapsing future cards
|
# collapsing future cards
|
||||||
Column('collapseTime', Integer, nullable=False, default=1),
|
Column('collapseTime', Integer, nullable=False, default=1),
|
||||||
# priorities & postponing
|
# priorities & postponing - all obsolete
|
||||||
Column('highPriority', UnicodeText, nullable=False, default=u"PriorityVeryHigh"),
|
Column('highPriority', UnicodeText, nullable=False, default=u"PriorityVeryHigh"),
|
||||||
Column('medPriority', UnicodeText, nullable=False, default=u"PriorityHigh"),
|
Column('medPriority', UnicodeText, nullable=False, default=u"PriorityHigh"),
|
||||||
Column('lowPriority', UnicodeText, nullable=False, default=u"PriorityLow"),
|
Column('lowPriority', UnicodeText, nullable=False, default=u"PriorityLow"),
|
||||||
Column('suspended', UnicodeText, nullable=False, default=u""), # obsolete
|
Column('suspended', UnicodeText, nullable=False, default=u""),
|
||||||
# 0 is random, 1 is by input date
|
# 0 is random, 1 is by input date
|
||||||
Column('newCardOrder', Integer, nullable=False, default=1),
|
Column('newCardOrder', Integer, nullable=False, default=1),
|
||||||
# when to show new cards
|
# when to show new cards
|
||||||
|
@ -384,15 +368,15 @@ New type: %s""" % (self.failedSoonCount, self.revCount, self.newCountToday,
|
||||||
card.reps, card.successive, oldSuc, `newType`))
|
card.reps, card.successive, oldSuc, `newType`))
|
||||||
|
|
||||||
def revOrder(self):
|
def revOrder(self):
|
||||||
return ("priority desc, interval desc",
|
return ("interval desc",
|
||||||
"priority desc, interval",
|
"interval",
|
||||||
"priority desc, combinedDue",
|
"combinedDue",
|
||||||
"priority desc, factId, ordinal")[self.revCardOrder]
|
"factId, ordinal")[self.revCardOrder]
|
||||||
|
|
||||||
def newOrder(self):
|
def newOrder(self):
|
||||||
return ("priority desc, due",
|
return ("due",
|
||||||
"priority desc, due",
|
"due",
|
||||||
"priority desc, due desc")[self.newCardOrder]
|
"due desc")[self.newCardOrder]
|
||||||
|
|
||||||
def rebuildTypes(self):
|
def rebuildTypes(self):
|
||||||
"Rebuild the type cache. Only necessary on upgrade."
|
"Rebuild the type cache. Only necessary on upgrade."
|
||||||
|
@ -492,14 +476,8 @@ when type >= 0 then relativeDelay else relativeDelay - 3 end)
|
||||||
|
|
||||||
def resetAfterReviewEarly(self):
|
def resetAfterReviewEarly(self):
|
||||||
"Put temporarily suspended cards back into play. Caller must .reset()"
|
"Put temporarily suspended cards back into play. Caller must .reset()"
|
||||||
# FIXME: can ignore priorities in the future
|
|
||||||
ids = self.s.column0(
|
|
||||||
"select id from cards where type between 6 and 8 or priority = -1")
|
|
||||||
if ids:
|
|
||||||
self.updatePriorities(ids)
|
|
||||||
self.s.statement(
|
self.s.statement(
|
||||||
"update cards set type = type - 6 where type between 6 and 8")
|
"update cards set type = type - 6 where type between 6 and 8")
|
||||||
self.flushMod()
|
|
||||||
|
|
||||||
def _onReviewEarlyFinished(self):
|
def _onReviewEarlyFinished(self):
|
||||||
# clean up buried cards
|
# clean up buried cards
|
||||||
|
@ -715,12 +693,6 @@ limit %s""" % (self.cramOrder, self.queueLimit)))
|
||||||
return False
|
return False
|
||||||
if self.newCardSpacing == NEW_CARDS_FIRST:
|
if self.newCardSpacing == NEW_CARDS_FIRST:
|
||||||
return True
|
return True
|
||||||
# force review if there are very high priority cards
|
|
||||||
if self.revQueue:
|
|
||||||
if self.s.scalar(
|
|
||||||
"select 1 from cards where id = :id and priority = 4",
|
|
||||||
id = self.revQueue[-1][0]):
|
|
||||||
return False
|
|
||||||
if self.newCardModulus:
|
if self.newCardModulus:
|
||||||
return self._dailyStats.reps % self.newCardModulus == 0
|
return self._dailyStats.reps % self.newCardModulus == 0
|
||||||
else:
|
else:
|
||||||
|
@ -1156,97 +1128,16 @@ limit 1""" % self.delay0))
|
||||||
"spaceSusp": spaceSusp,
|
"spaceSusp": spaceSusp,
|
||||||
}
|
}
|
||||||
|
|
||||||
# Priorities
|
|
||||||
##########################################################################
|
|
||||||
|
|
||||||
def updateAllPriorities(self, partial=False, dirty=True):
|
|
||||||
"Update all card priorities if changed. Caller must .reset()"
|
|
||||||
new = self.updateTagPriorities()
|
|
||||||
if not partial:
|
|
||||||
new = self.s.all("select id, priority as pri from tags")
|
|
||||||
cids = self.s.column0(
|
|
||||||
"select distinct cardId from cardTags where tagId in %s" %
|
|
||||||
ids2str([x['id'] for x in new]))
|
|
||||||
self.updatePriorities(cids, dirty=dirty)
|
|
||||||
|
|
||||||
def updateTagPriorities(self):
|
|
||||||
"Update priority setting on tags table."
|
|
||||||
# make sure all priority tags exist
|
|
||||||
for s in (self.lowPriority, self.medPriority,
|
|
||||||
self.highPriority):
|
|
||||||
tagIds(self.s, parseTags(s))
|
|
||||||
tags = self.s.all("select tag, id, priority from tags")
|
|
||||||
tags = [(x[0].lower(), x[1], x[2]) for x in tags]
|
|
||||||
up = {}
|
|
||||||
for (type, pri) in ((self.lowPriority, 1),
|
|
||||||
(self.medPriority, 3),
|
|
||||||
(self.highPriority, 4)):
|
|
||||||
for tag in parseTags(type.lower()):
|
|
||||||
up[tag] = pri
|
|
||||||
new = []
|
|
||||||
for (tag, id, pri) in tags:
|
|
||||||
if tag in up and up[tag] != pri:
|
|
||||||
new.append({'id': id, 'pri': up[tag]})
|
|
||||||
elif tag not in up and pri != 2:
|
|
||||||
new.append({'id': id, 'pri': 2})
|
|
||||||
self.s.statements(
|
|
||||||
"update tags set priority = :pri where id = :id",
|
|
||||||
new)
|
|
||||||
return new
|
|
||||||
|
|
||||||
def updatePriorities(self, cardIds, suspend=[], dirty=True):
|
|
||||||
"Update priorities for cardIds. Caller must .reset()."
|
|
||||||
# any tags to suspend
|
|
||||||
if suspend:
|
|
||||||
ids = tagIds(self.s, suspend)
|
|
||||||
self.s.statement(
|
|
||||||
"update tags set priority = 0 where id in %s" %
|
|
||||||
ids2str(ids.values()))
|
|
||||||
if len(cardIds) > 1000:
|
|
||||||
limit = ""
|
|
||||||
else:
|
|
||||||
limit = "and cardTags.cardId in %s" % ids2str(cardIds)
|
|
||||||
cards = self.s.all("""
|
|
||||||
select cardTags.cardId,
|
|
||||||
case
|
|
||||||
when max(tags.priority) > 2 then max(tags.priority)
|
|
||||||
when min(tags.priority) = 1 then 1
|
|
||||||
else 2 end
|
|
||||||
from cardTags, tags
|
|
||||||
where cardTags.tagId = tags.id
|
|
||||||
%s
|
|
||||||
group by cardTags.cardId""" % limit)
|
|
||||||
if dirty:
|
|
||||||
extra = ", modified = :m "
|
|
||||||
else:
|
|
||||||
extra = ""
|
|
||||||
for pri in range(5):
|
|
||||||
cs = [c[0] for c in cards if c[1] == pri]
|
|
||||||
if cs:
|
|
||||||
# catch review early & buried but not suspended
|
|
||||||
self.s.statement((
|
|
||||||
"update cards set priority = :pri %s where id in %s "
|
|
||||||
"and priority != :pri and priority >= -2") % (
|
|
||||||
extra, ids2str(cs)), pri=pri, m=time.time())
|
|
||||||
|
|
||||||
def updatePriority(self, card):
|
|
||||||
"Update priority on a single card."
|
|
||||||
self.s.flush()
|
|
||||||
self.updatePriorities([card.id])
|
|
||||||
|
|
||||||
# Suspending
|
# Suspending
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
# when older clients are upgraded, we can remove the code which touches
|
|
||||||
# priorities & isDue
|
|
||||||
|
|
||||||
def suspendCards(self, ids):
|
def suspendCards(self, ids):
|
||||||
"Suspend cards. Caller must .reset()"
|
"Suspend cards. Caller must .reset()"
|
||||||
self.startProgress()
|
self.startProgress()
|
||||||
self.s.statement("""
|
self.s.statement("""
|
||||||
update cards
|
update cards
|
||||||
set type = relativeDelay - 3,
|
set type = relativeDelay - 3,
|
||||||
priority = -3, modified = :t, isDue=0
|
modified = :t
|
||||||
where type >= 0 and id in %s""" % ids2str(ids), t=time.time())
|
where type >= 0 and id in %s""" % ids2str(ids), t=time.time())
|
||||||
self.flushMod()
|
self.flushMod()
|
||||||
self.finishProgress()
|
self.finishProgress()
|
||||||
|
@ -1255,10 +1146,9 @@ where type >= 0 and id in %s""" % ids2str(ids), t=time.time())
|
||||||
"Unsuspend cards. Caller must .reset()"
|
"Unsuspend cards. Caller must .reset()"
|
||||||
self.startProgress()
|
self.startProgress()
|
||||||
self.s.statement("""
|
self.s.statement("""
|
||||||
update cards set type = relativeDelay, priority=0, modified=:t
|
update cards set type = relativeDelay, modified=:t
|
||||||
where type < 0 and id in %s""" %
|
where type between -3 and -1 and id in %s""" %
|
||||||
ids2str(ids), t=time.time())
|
ids2str(ids), t=time.time())
|
||||||
self.updatePriorities(ids)
|
|
||||||
self.flushMod()
|
self.flushMod()
|
||||||
self.finishProgress()
|
self.finishProgress()
|
||||||
|
|
||||||
|
@ -1266,9 +1156,7 @@ where type < 0 and id in %s""" %
|
||||||
"Bury all cards for fact until next session. Caller must .reset()"
|
"Bury all cards for fact until next session. Caller must .reset()"
|
||||||
for card in fact.cards:
|
for card in fact.cards:
|
||||||
if card.type in (0,1,2):
|
if card.type in (0,1,2):
|
||||||
card.priority = -2
|
|
||||||
card.type += 3
|
card.type += 3
|
||||||
card.isDue = 0
|
|
||||||
self.flushMod()
|
self.flushMod()
|
||||||
|
|
||||||
# Counts
|
# Counts
|
||||||
|
@ -1413,8 +1301,6 @@ combinedDue > :now and due < :now""", now=time.time())
|
||||||
# update card q/a
|
# update card q/a
|
||||||
fact.setModified(True, self)
|
fact.setModified(True, self)
|
||||||
self.updateFactTags([fact.id])
|
self.updateFactTags([fact.id])
|
||||||
# this will call reset() which will update counts
|
|
||||||
self.updatePriorities([c.id for c in cards])
|
|
||||||
# keep track of last used tags for convenience
|
# keep track of last used tags for convenience
|
||||||
self.lastTags = fact.tags
|
self.lastTags = fact.tags
|
||||||
self.flushMod()
|
self.flushMod()
|
||||||
|
@ -1457,7 +1343,7 @@ combinedDue > :now and due < :now""", now=time.time())
|
||||||
return models
|
return models
|
||||||
|
|
||||||
def addCards(self, fact, cardModelIds):
|
def addCards(self, fact, cardModelIds):
|
||||||
"Caller must flush first, flushMod after, rebuild priorities."
|
"Caller must flush first and flushMod after."
|
||||||
ids = []
|
ids = []
|
||||||
for cardModel in self.availableCardModels(fact, False):
|
for cardModel in self.availableCardModels(fact, False):
|
||||||
if cardModel.id not in cardModelIds:
|
if cardModel.id not in cardModelIds:
|
||||||
|
@ -1471,7 +1357,6 @@ where factId = :fid and cardModelId = :cmid""",
|
||||||
fact, cardModel,
|
fact, cardModel,
|
||||||
fact.created+0.0001*cardModel.ordinal)
|
fact.created+0.0001*cardModel.ordinal)
|
||||||
self.updateCardTags([card.id])
|
self.updateCardTags([card.id])
|
||||||
self.updatePriority(card)
|
|
||||||
self.cardCount += 1
|
self.cardCount += 1
|
||||||
self.newCount += 1
|
self.newCount += 1
|
||||||
ids.append(card.id)
|
ids.append(card.id)
|
||||||
|
@ -1589,7 +1474,7 @@ where facts.id not in (select distinct factId from cards)""")
|
||||||
"select 1 from cardTags where tagId = :d limit 1", d=tag):
|
"select 1 from cardTags where tagId = :d limit 1", d=tag):
|
||||||
unused.append(tag)
|
unused.append(tag)
|
||||||
# delete unused
|
# delete unused
|
||||||
self.s.statement("delete from tags where id in %s and priority = 2" %
|
self.s.statement("delete from tags where id in %s" %
|
||||||
ids2str(unused))
|
ids2str(unused))
|
||||||
# remove any dangling facts
|
# remove any dangling facts
|
||||||
self.deleteDanglingFacts()
|
self.deleteDanglingFacts()
|
||||||
|
@ -1750,7 +1635,7 @@ modelId = :id
|
||||||
where id in %s""" % fids, t=time.time(), id=newModel.id)
|
where id in %s""" % fids, t=time.time(), id=newModel.id)
|
||||||
self.finishProgress()
|
self.finishProgress()
|
||||||
# template remapping
|
# template remapping
|
||||||
self.startProgress(len(cardMap)+4)
|
self.startProgress(len(cardMap)+3)
|
||||||
toChange = []
|
toChange = []
|
||||||
self.updateProgress(_("Changing cards..."))
|
self.updateProgress(_("Changing cards..."))
|
||||||
for (old, new) in cardMap.items():
|
for (old, new) in cardMap.items():
|
||||||
|
@ -1781,9 +1666,6 @@ where id in %s""" % ids2str(ids), new=new.id, ord=new.ordinal)
|
||||||
"select id from cards where factId in %s" %
|
"select id from cards where factId in %s" %
|
||||||
ids2str(factIds))
|
ids2str(factIds))
|
||||||
self.updateCardTags(cardIds)
|
self.updateCardTags(cardIds)
|
||||||
self.updateProgress()
|
|
||||||
self.updatePriorities(cardIds)
|
|
||||||
self.updateProgress()
|
|
||||||
self.refreshSession()
|
self.refreshSession()
|
||||||
self.finishProgress()
|
self.finishProgress()
|
||||||
|
|
||||||
|
@ -2036,21 +1918,6 @@ where cardModelId in %s""" % strids, now=time.time())
|
||||||
# Tags: querying
|
# Tags: querying
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
def tagsList(self, where="", priority=", cards.priority", kwargs={}):
|
|
||||||
"Return a list of (cardId, allTags, priority)"
|
|
||||||
return self.s.all("""
|
|
||||||
select cards.id, facts.tags || " " || models.tags || " " ||
|
|
||||||
cardModels.name %s from cards, facts, models, cardModels where
|
|
||||||
cards.factId == facts.id and facts.modelId == models.id
|
|
||||||
and cards.cardModelId = cardModels.id %s""" % (priority, where),
|
|
||||||
**kwargs)
|
|
||||||
|
|
||||||
return self.s.all("""
|
|
||||||
select cards.id, facts.tags || " " || models.tags || " " ||
|
|
||||||
cardModels.name %s from cards, facts, models, cardModels where
|
|
||||||
cards.factId == facts.id and facts.modelId == models.id
|
|
||||||
and cards.cardModelId = cardModels.id %s""" % (priority, where))
|
|
||||||
|
|
||||||
def splitTagsList(self, where=""):
|
def splitTagsList(self, where=""):
|
||||||
return self.s.all("""
|
return self.s.all("""
|
||||||
select cards.id, facts.tags, models.tags, cardModels.name
|
select cards.id, facts.tags, models.tags, cardModels.name
|
||||||
|
@ -2168,9 +2035,7 @@ facts.modelId = :id""", id=modelId))
|
||||||
insert into cardTags
|
insert into cardTags
|
||||||
(cardId, tagId, src) values
|
(cardId, tagId, src) values
|
||||||
(:cardId, :tagId, :src)""", d)
|
(:cardId, :tagId, :src)""", d)
|
||||||
self.s.execute(
|
self.deleteUnusedTags()
|
||||||
"delete from tags where priority = 2 and id not in "+
|
|
||||||
"(select distinct tagId from cardTags)")
|
|
||||||
|
|
||||||
def updateTagsForModel(self, model):
|
def updateTagsForModel(self, model):
|
||||||
cards = self.s.all("""
|
cards = self.s.all("""
|
||||||
|
@ -2205,15 +2070,16 @@ and src in (1, 2)""" % ids2str(cardIds))
|
||||||
insert into cardTags
|
insert into cardTags
|
||||||
(cardId, tagId, src) values
|
(cardId, tagId, src) values
|
||||||
(:cardId, :tagId, :src)""", d)
|
(:cardId, :tagId, :src)""", d)
|
||||||
self.s.statement("""
|
self.deleteUnusedTags()
|
||||||
delete from tags where id not in (select distinct tagId from cardTags)
|
|
||||||
and priority = 2
|
|
||||||
""")
|
|
||||||
|
|
||||||
# Tags: adding/removing in bulk
|
# Tags: adding/removing in bulk
|
||||||
##########################################################################
|
##########################################################################
|
||||||
# these could be optimized to use the tag cache in the future
|
# these could be optimized to use the tag cache in the future
|
||||||
|
|
||||||
|
def deleteUnusedTags(self):
|
||||||
|
self.s.statement("""
|
||||||
|
delete from tags where id not in (select distinct tagId from cardTags)""")
|
||||||
|
|
||||||
def addTags(self, ids, tags):
|
def addTags(self, ids, tags):
|
||||||
"Add tags in bulk. Caller must .reset()"
|
"Add tags in bulk. Caller must .reset()"
|
||||||
self.startProgress()
|
self.startProgress()
|
||||||
|
@ -2238,7 +2104,6 @@ where id = :id""", pending)
|
||||||
ids2str(factIds))
|
ids2str(factIds))
|
||||||
self.updateCardQACacheFromIds(factIds, type="facts")
|
self.updateCardQACacheFromIds(factIds, type="facts")
|
||||||
self.updateCardTags(cardIds)
|
self.updateCardTags(cardIds)
|
||||||
self.updatePriorities(cardIds)
|
|
||||||
self.flushMod()
|
self.flushMod()
|
||||||
self.finishProgress()
|
self.finishProgress()
|
||||||
self.refreshSession()
|
self.refreshSession()
|
||||||
|
@ -2272,7 +2137,6 @@ where id = :id""", pending)
|
||||||
ids2str(factIds))
|
ids2str(factIds))
|
||||||
self.updateCardQACacheFromIds(factIds, type="facts")
|
self.updateCardQACacheFromIds(factIds, type="facts")
|
||||||
self.updateCardTags(cardIds)
|
self.updateCardTags(cardIds)
|
||||||
self.updatePriorities(cardIds)
|
|
||||||
self.flushMod()
|
self.flushMod()
|
||||||
self.finishProgress()
|
self.finishProgress()
|
||||||
self.refreshSession()
|
self.refreshSession()
|
||||||
|
@ -2688,7 +2552,7 @@ select cardId from cardTags where cardTags.tagId in %s""" % ids2str(ids)
|
||||||
self.dueCutoff, self.dueCutoff)
|
self.dueCutoff, self.dueCutoff)
|
||||||
elif token == "suspended":
|
elif token == "suspended":
|
||||||
qquery += ("select id from cards where "
|
qquery += ("select id from cards where "
|
||||||
"priority = -3")
|
"type between -3 and -1")
|
||||||
elif token == "leech":
|
elif token == "leech":
|
||||||
qquery += (
|
qquery += (
|
||||||
"select id from cards where noCount >= (select value "
|
"select id from cards where noCount >= (select value "
|
||||||
|
@ -3249,7 +3113,7 @@ where id = :id""", fid=f.id, cmid=m.cardModels[0].id, id=id)
|
||||||
if quick:
|
if quick:
|
||||||
num = 4
|
num = 4
|
||||||
else:
|
else:
|
||||||
num = 9
|
num = 8
|
||||||
self.startProgress(num)
|
self.startProgress(num)
|
||||||
self.updateProgress(_("Checking integrity..."))
|
self.updateProgress(_("Checking integrity..."))
|
||||||
if self.s.scalar("pragma integrity_check") != "ok":
|
if self.s.scalar("pragma integrity_check") != "ok":
|
||||||
|
@ -3347,9 +3211,6 @@ select id from fields where factId not in (select id from facts)""")
|
||||||
# fix tags
|
# fix tags
|
||||||
self.updateProgress(_("Rebuilding tag cache..."))
|
self.updateProgress(_("Rebuilding tag cache..."))
|
||||||
self.updateCardTags()
|
self.updateCardTags()
|
||||||
# fix any priorities
|
|
||||||
self.updateProgress(_("Updating priorities..."))
|
|
||||||
self.updateAllPriorities(dirty=False)
|
|
||||||
# make sure ordinals are correct
|
# make sure ordinals are correct
|
||||||
self.updateProgress(_("Updating ordinals..."))
|
self.updateProgress(_("Updating ordinals..."))
|
||||||
self.s.statement("""
|
self.s.statement("""
|
||||||
|
@ -3554,15 +3415,17 @@ seq > :s and seq <= :e order by seq desc""", s=start, e=end)
|
||||||
def updateDynamicIndices(self):
|
def updateDynamicIndices(self):
|
||||||
indices = {
|
indices = {
|
||||||
'intervalDesc':
|
'intervalDesc':
|
||||||
'(type, priority desc, interval desc, factId, combinedDue)',
|
'(type, interval desc, factId, combinedDue)',
|
||||||
'intervalAsc':
|
'intervalAsc':
|
||||||
'(type, priority desc, interval, factId, combinedDue)',
|
'(type, interval, factId, combinedDue)',
|
||||||
'randomOrder':
|
'randomOrder':
|
||||||
'(type, priority desc, factId, ordinal, combinedDue)',
|
'(type, factId, ordinal, combinedDue)',
|
||||||
|
# new cards are sorted by due, not combinedDue, so that even if
|
||||||
|
# they are spaced, they retain their original sort order
|
||||||
'dueAsc':
|
'dueAsc':
|
||||||
'(type, priority desc, due, factId, combinedDue)',
|
'(type, due, factId, combinedDue)',
|
||||||
'dueDesc':
|
'dueDesc':
|
||||||
'(type, priority desc, due desc, factId, combinedDue)',
|
'(type, due desc, factId, combinedDue)',
|
||||||
}
|
}
|
||||||
# determine required
|
# determine required
|
||||||
required = []
|
required = []
|
||||||
|
@ -3581,7 +3444,7 @@ seq > :s and seq <= :e order by seq desc""", s=start, e=end)
|
||||||
# add/delete
|
# add/delete
|
||||||
analyze = False
|
analyze = False
|
||||||
for (k, v) in indices.items():
|
for (k, v) in indices.items():
|
||||||
n = "ix_cards_%s2" % k
|
n = "ix_cards_%s" % k
|
||||||
if k in required:
|
if k in required:
|
||||||
if not self.s.scalar(
|
if not self.s.scalar(
|
||||||
"select 1 from sqlite_master where name = :n", n=n):
|
"select 1 from sqlite_master where name = :n", n=n):
|
||||||
|
@ -3590,8 +3453,6 @@ seq > :s and seq <= :e order by seq desc""", s=start, e=end)
|
||||||
(n, v))
|
(n, v))
|
||||||
analyze = True
|
analyze = True
|
||||||
else:
|
else:
|
||||||
# leave old indices for older clients
|
|
||||||
#self.s.statement("drop index if exists ix_cards_%s" % k)
|
|
||||||
self.s.statement("drop index if exists %s" % n)
|
self.s.statement("drop index if exists %s" % n)
|
||||||
if analyze:
|
if analyze:
|
||||||
self.s.statement("analyze")
|
self.s.statement("analyze")
|
||||||
|
@ -3714,7 +3575,6 @@ class DeckStorage(object):
|
||||||
DeckStorage._addIndices(deck)
|
DeckStorage._addIndices(deck)
|
||||||
deck.s.statement("analyze")
|
deck.s.statement("analyze")
|
||||||
deck._initVars()
|
deck._initVars()
|
||||||
deck.updateTagPriorities()
|
|
||||||
else:
|
else:
|
||||||
if backup:
|
if backup:
|
||||||
DeckStorage.backup(deck, path)
|
DeckStorage.backup(deck, path)
|
||||||
|
@ -3750,18 +3610,13 @@ class DeckStorage(object):
|
||||||
deck.currentModel = deck.models[0]
|
deck.currentModel = deck.models[0]
|
||||||
# ensure the necessary indices are available
|
# ensure the necessary indices are available
|
||||||
deck.updateDynamicIndices()
|
deck.updateDynamicIndices()
|
||||||
# FIXME: temporary code for upgrade
|
|
||||||
# - ensure cards suspended on older clients are recognized
|
|
||||||
deck.s.statement("""
|
|
||||||
update cards set type = type - 3 where type between 0 and 2 and priority = -3""")
|
|
||||||
# - new delay1 handling
|
# - new delay1 handling
|
||||||
if deck.delay1 > 7:
|
if deck.delay1 > 7:
|
||||||
deck.delay1 = 0
|
deck.delay1 = 0
|
||||||
# unsuspend buried/rev early - can remove priorities in the future
|
# unsuspend buried/rev early
|
||||||
ids = deck.s.column0(
|
ids = deck.s.column0(
|
||||||
"select id from cards where type > 2 or priority between -2 and -1")
|
"select id from cards where type > 2")
|
||||||
if ids:
|
if ids:
|
||||||
deck.updatePriorities(ids)
|
|
||||||
deck.s.statement(
|
deck.s.statement(
|
||||||
"update cards set type = relativeDelay where type > 2")
|
"update cards set type = relativeDelay where type > 2")
|
||||||
deck.s.commit()
|
deck.s.commit()
|
||||||
|
@ -4002,7 +3857,6 @@ order by priority desc, due desc""")
|
||||||
if deck.version == 2:
|
if deck.version == 2:
|
||||||
# compensate for bug in 0.9.7 by rebuilding isDue and priorities
|
# compensate for bug in 0.9.7 by rebuilding isDue and priorities
|
||||||
deck.s.statement("update cards set isDue = 0")
|
deck.s.statement("update cards set isDue = 0")
|
||||||
deck.updateAllPriorities(dirty=False)
|
|
||||||
# compensate for bug in early 0.9.x where fieldId was not unique
|
# compensate for bug in early 0.9.x where fieldId was not unique
|
||||||
deck.s.statement("update fields set id = random()")
|
deck.s.statement("update fields set id = random()")
|
||||||
deck.version = 3
|
deck.version = 3
|
||||||
|
@ -4197,7 +4051,6 @@ where interval < 1""")
|
||||||
if deck.version < 27:
|
if deck.version < 27:
|
||||||
DeckStorage._addIndices(deck)
|
DeckStorage._addIndices(deck)
|
||||||
deck.updateCardTags()
|
deck.updateCardTags()
|
||||||
deck.updateAllPriorities(dirty=False)
|
|
||||||
deck.version = 27
|
deck.version = 27
|
||||||
deck.s.commit()
|
deck.s.commit()
|
||||||
if deck.version < 28:
|
if deck.version < 28:
|
||||||
|
@ -4284,7 +4137,6 @@ nextFactor, reps, thinkingTime, yesCount, noCount from reviewHistory""")
|
||||||
deck.rebuildCounts()
|
deck.rebuildCounts()
|
||||||
# suspended tag obsolete - don't do this yet
|
# suspended tag obsolete - don't do this yet
|
||||||
deck.suspended = re.sub(u" ?Suspended ?", u"", deck.suspended)
|
deck.suspended = re.sub(u" ?Suspended ?", u"", deck.suspended)
|
||||||
deck.updateTagPriorities()
|
|
||||||
deck.version = 39
|
deck.version = 39
|
||||||
deck.s.commit()
|
deck.s.commit()
|
||||||
if deck.version < 40:
|
if deck.version < 40:
|
||||||
|
@ -4406,10 +4258,6 @@ this message. (ERR-0101)""") % {
|
||||||
for d in ("ix_cards_duePriority",
|
for d in ("ix_cards_duePriority",
|
||||||
"ix_cards_priorityDue"):
|
"ix_cards_priorityDue"):
|
||||||
deck.s.statement("drop index if exists %s" % d)
|
deck.s.statement("drop index if exists %s" % d)
|
||||||
# remove old dynamic indices
|
|
||||||
for d in ("intervalDesc", "intervalAsc", "randomOrder",
|
|
||||||
"dueAsc", "dueDesc"):
|
|
||||||
deck.s.statement("drop index if exists ix_cards_%s" % d)
|
|
||||||
deck.s.execute("analyze")
|
deck.s.execute("analyze")
|
||||||
deck.version = 64
|
deck.version = 64
|
||||||
deck.s.commit()
|
deck.s.commit()
|
||||||
|
@ -4420,6 +4268,16 @@ this message. (ERR-0101)""") % {
|
||||||
deck.rebuildTypes()
|
deck.rebuildTypes()
|
||||||
deck.version = 65
|
deck.version = 65
|
||||||
deck.s.commit()
|
deck.s.commit()
|
||||||
|
# skip a few to allow for updates to stable tree
|
||||||
|
if deck.version < 70:
|
||||||
|
# update dynamic indices given we don't use priority anymore
|
||||||
|
for d in ("intervalDesc", "intervalAsc", "randomOrder",
|
||||||
|
"dueAsc", "dueDesc"):
|
||||||
|
deck.s.statement("drop index if exists ix_cards_%s2" % d)
|
||||||
|
deck.s.statement("drop index if exists ix_cards_%s" % d)
|
||||||
|
deck.s.execute("analyze")
|
||||||
|
deck.version = 70
|
||||||
|
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:
|
||||||
|
|
|
@ -140,7 +140,6 @@ delete from stats""")
|
||||||
copyLocalMedia(client.deck, server.deck)
|
copyLocalMedia(client.deck, server.deck)
|
||||||
# need to save manually
|
# need to save manually
|
||||||
self.newDeck.rebuildCounts()
|
self.newDeck.rebuildCounts()
|
||||||
self.newDeck.updateAllPriorities()
|
|
||||||
self.exportedCards = self.newDeck.cardCount
|
self.exportedCards = self.newDeck.cardCount
|
||||||
self.newDeck.utcOffset = -1
|
self.newDeck.utcOffset = -1
|
||||||
self.newDeck.s.commit()
|
self.newDeck.s.commit()
|
||||||
|
|
|
@ -55,7 +55,7 @@ class Importer(object):
|
||||||
if self.updateKey is not None:
|
if self.updateKey is not None:
|
||||||
return self.doUpdate()
|
return self.doUpdate()
|
||||||
random = self.deck.newCardOrder == NEW_CARDS_RANDOM
|
random = self.deck.newCardOrder == NEW_CARDS_RANDOM
|
||||||
num = 7
|
num = 6
|
||||||
if random:
|
if random:
|
||||||
num += 1
|
num += 1
|
||||||
self.deck.startProgress(num)
|
self.deck.startProgress(num)
|
||||||
|
@ -64,8 +64,6 @@ class Importer(object):
|
||||||
if self.importCards(c):
|
if self.importCards(c):
|
||||||
self.deck.updateProgress()
|
self.deck.updateProgress()
|
||||||
self.deck.updateCardTags(self.cardIds)
|
self.deck.updateCardTags(self.cardIds)
|
||||||
self.deck.updateProgress()
|
|
||||||
self.deck.updatePriorities(self.cardIds)
|
|
||||||
if random:
|
if random:
|
||||||
self.deck.updateProgress()
|
self.deck.updateProgress()
|
||||||
self.deck.randomizeNewCards(self.cardIds)
|
self.deck.randomizeNewCards(self.cardIds)
|
||||||
|
@ -74,7 +72,7 @@ class Importer(object):
|
||||||
self.deck.setModified()
|
self.deck.setModified()
|
||||||
|
|
||||||
def doUpdate(self):
|
def doUpdate(self):
|
||||||
self.deck.startProgress(8)
|
self.deck.startProgress(7)
|
||||||
# grab the data from the external file
|
# grab the data from the external file
|
||||||
self.deck.updateProgress(_("Updating..."))
|
self.deck.updateProgress(_("Updating..."))
|
||||||
cards = self.foreignCards()
|
cards = self.foreignCards()
|
||||||
|
@ -145,8 +143,6 @@ update fields set value = :v where factId = :fid and fieldModelId = :fmid""",
|
||||||
ids2str(fids))
|
ids2str(fids))
|
||||||
self.deck.updateCardTags(cids)
|
self.deck.updateCardTags(cids)
|
||||||
self.deck.updateProgress()
|
self.deck.updateProgress()
|
||||||
self.deck.updatePriorities(cids)
|
|
||||||
self.deck.updateProgress()
|
|
||||||
self.deck.updateCardsFromFactIds(fids)
|
self.deck.updateCardsFromFactIds(fids)
|
||||||
self.total = len(fids)
|
self.total = len(fids)
|
||||||
self.deck.setModified()
|
self.deck.setModified()
|
||||||
|
|
|
@ -532,14 +532,14 @@ class DeckStats(object):
|
||||||
return self.deck.s.scalar(
|
return self.deck.s.scalar(
|
||||||
"select sum(1/round(max(interval, 1)+0.5)) from cards "
|
"select sum(1/round(max(interval, 1)+0.5)) from cards "
|
||||||
"where cards.reps > 0 "
|
"where cards.reps > 0 "
|
||||||
"and priority > 0") or 0
|
"and type >= 0") or 0
|
||||||
|
|
||||||
def getWorkloadPeriod(self, period):
|
def getWorkloadPeriod(self, period):
|
||||||
cutoff = time.time() + 86400 * period
|
cutoff = time.time() + 86400 * period
|
||||||
return (self.deck.s.scalar("""
|
return (self.deck.s.scalar("""
|
||||||
select count(id) from cards
|
select count(id) from cards
|
||||||
where combinedDue < :cutoff
|
where combinedDue < :cutoff
|
||||||
and priority > 0 and relativeDelay in (0,1)""", cutoff=cutoff) or 0) / float(period)
|
and type >= 0 and relativeDelay in (0,1)""", cutoff=cutoff) or 0) / float(period)
|
||||||
|
|
||||||
def getPastWorkloadPeriod(self, period):
|
def getPastWorkloadPeriod(self, period):
|
||||||
cutoff = time.time() - 86400 * period
|
cutoff = time.time() - 86400 * period
|
||||||
|
|
|
@ -167,8 +167,6 @@ class SyncTools(object):
|
||||||
self.postSyncRefresh()
|
self.postSyncRefresh()
|
||||||
cardIds = [x[0] for x in payload['added-cards']]
|
cardIds = [x[0] for x in payload['added-cards']]
|
||||||
self.deck.updateCardTags(cardIds)
|
self.deck.updateCardTags(cardIds)
|
||||||
# rebuild priorities on server
|
|
||||||
self.rebuildPriorities(cardIds, self.serverExcludedTags)
|
|
||||||
return reply
|
return reply
|
||||||
|
|
||||||
def applyPayloadReply(self, reply):
|
def applyPayloadReply(self, reply):
|
||||||
|
@ -186,10 +184,8 @@ class SyncTools(object):
|
||||||
if 'sources' in reply:
|
if 'sources' in reply:
|
||||||
self.updateSources(reply['sources'])
|
self.updateSources(reply['sources'])
|
||||||
self.postSyncRefresh()
|
self.postSyncRefresh()
|
||||||
# rebuild priorities on client
|
|
||||||
cardIds = [x[0] for x in reply['added-cards']]
|
cardIds = [x[0] for x in reply['added-cards']]
|
||||||
self.deck.updateCardTags(cardIds)
|
self.deck.updateCardTags(cardIds)
|
||||||
self.rebuildPriorities(cardIds)
|
|
||||||
if self.missingFacts() != 0:
|
if self.missingFacts() != 0:
|
||||||
raise Exception(
|
raise Exception(
|
||||||
"Facts missing after sync. Please run Tools>Advanced>Check DB.")
|
"Facts missing after sync. Please run Tools>Advanced>Check DB.")
|
||||||
|
@ -199,10 +195,6 @@ class SyncTools(object):
|
||||||
"select count() from cards where factId "+
|
"select count() from cards where factId "+
|
||||||
"not in (select id from facts)");
|
"not in (select id from facts)");
|
||||||
|
|
||||||
def rebuildPriorities(self, cardIds, suspend=[]):
|
|
||||||
self.deck.updateAllPriorities(partial=True, dirty=False)
|
|
||||||
self.deck.updatePriorities(cardIds, suspend=suspend, dirty=False)
|
|
||||||
|
|
||||||
def postSyncRefresh(self):
|
def postSyncRefresh(self):
|
||||||
"Flush changes to DB, and reload object associations."
|
"Flush changes to DB, and reload object associations."
|
||||||
self.deck.s.flush()
|
self.deck.s.flush()
|
||||||
|
|
|
@ -18,6 +18,8 @@ from anki.db import *
|
||||||
# Tables
|
# Tables
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
|
# priority is no longer used
|
||||||
|
|
||||||
def initTagTables(s):
|
def initTagTables(s):
|
||||||
try:
|
try:
|
||||||
s.statement("""
|
s.statement("""
|
||||||
|
|
|
@ -84,7 +84,6 @@ def test_localsync_deck():
|
||||||
assert deck1.lastSync == deck2.lastSync
|
assert deck1.lastSync == deck2.lastSync
|
||||||
# ensure values are being synced
|
# ensure values are being synced
|
||||||
deck1.lowPriority += u",foo"
|
deck1.lowPriority += u",foo"
|
||||||
deck1.updateAllPriorities()
|
|
||||||
deck1.setModified()
|
deck1.setModified()
|
||||||
client.sync()
|
client.sync()
|
||||||
assert "foo" in deck2.lowPriority
|
assert "foo" in deck2.lowPriority
|
||||||
|
|
Loading…
Reference in a new issue