mirror of
https://github.com/ankitects/anki.git
synced 2025-09-24 00:36:38 -04:00
Merge branch 'master' into htmlcache
Conflicts: anki/deck.py
This commit is contained in:
commit
014896478f
4 changed files with 33 additions and 36 deletions
|
@ -60,7 +60,6 @@ cardsTable = Table(
|
||||||
Column('noCount', Integer, nullable=False, default=0),
|
Column('noCount', Integer, nullable=False, default=0),
|
||||||
# caching
|
# caching
|
||||||
Column('spaceUntil', Float, nullable=False, default=0),
|
Column('spaceUntil', Float, nullable=False, default=0),
|
||||||
Column('relativeDelay', Float, nullable=False, default=0),
|
|
||||||
Column('isDue', Boolean, nullable=False, default=0),
|
Column('isDue', Boolean, nullable=False, default=0),
|
||||||
Column('type', Integer, nullable=False, default=2),
|
Column('type', Integer, nullable=False, default=2),
|
||||||
Column('combinedDue', Integer, nullable=False, default=0))
|
Column('combinedDue', Integer, nullable=False, default=0))
|
||||||
|
@ -163,8 +162,14 @@ class Card(object):
|
||||||
return findTag(tag, parseTags(self.allTags()))
|
return findTag(tag, parseTags(self.allTags()))
|
||||||
|
|
||||||
def fromDB(self, s, id):
|
def fromDB(self, s, id):
|
||||||
r = s.first("select * from cards where id = :id",
|
r = s.first("""select
|
||||||
id=id)
|
id, factId, cardModelId, created, modified, tags, ordinal, question, answer,
|
||||||
|
priority, interval, lastInterval, due, lastDue, factor,
|
||||||
|
lastFactor, firstAnswered, reps, successive, averageTime, reviewTime,
|
||||||
|
youngEase0, youngEase1, youngEase2, youngEase3, youngEase4,
|
||||||
|
matureEase0, matureEase1, matureEase2, matureEase3, matureEase4,
|
||||||
|
yesCount, noCount, spaceUntil, isDue, type, combinedDue
|
||||||
|
from cards where id = :id""", id=id)
|
||||||
if not r:
|
if not r:
|
||||||
return
|
return
|
||||||
(self.id,
|
(self.id,
|
||||||
|
@ -201,7 +206,6 @@ class Card(object):
|
||||||
self.yesCount,
|
self.yesCount,
|
||||||
self.noCount,
|
self.noCount,
|
||||||
self.spaceUntil,
|
self.spaceUntil,
|
||||||
self.relativeDelay,
|
|
||||||
self.isDue,
|
self.isDue,
|
||||||
self.type,
|
self.type,
|
||||||
self.combinedDue) = r
|
self.combinedDue) = r
|
||||||
|
@ -242,7 +246,6 @@ matureEase4=:matureEase4,
|
||||||
yesCount=:yesCount,
|
yesCount=:yesCount,
|
||||||
noCount=:noCount,
|
noCount=:noCount,
|
||||||
spaceUntil = :spaceUntil,
|
spaceUntil = :spaceUntil,
|
||||||
relativeDelay = :interval / (strftime("%s", "now") - :due + 1),
|
|
||||||
isDue = :isDue,
|
isDue = :isDue,
|
||||||
type = :type,
|
type = :type,
|
||||||
combinedDue = max(:spaceUntil, :due)
|
combinedDue = max(:spaceUntil, :due)
|
||||||
|
|
43
anki/deck.py
43
anki/deck.py
|
@ -34,8 +34,7 @@ PRIORITY_NORM = 2
|
||||||
PRIORITY_LOW = 1
|
PRIORITY_LOW = 1
|
||||||
PRIORITY_NONE = 0
|
PRIORITY_NONE = 0
|
||||||
MATURE_THRESHOLD = 21
|
MATURE_THRESHOLD = 21
|
||||||
# need interval > 0 to ensure relative delay is ordered properly
|
NEW_INTERVAL = 0
|
||||||
NEW_INTERVAL = 0.001
|
|
||||||
NEW_CARDS_LAST = 1
|
NEW_CARDS_LAST = 1
|
||||||
NEW_CARDS_DISTRIBUTE = 0
|
NEW_CARDS_DISTRIBUTE = 0
|
||||||
|
|
||||||
|
@ -46,7 +45,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=12),
|
Column('version', Integer, nullable=False, default=13),
|
||||||
Column('currentModelId', Integer, ForeignKey("models.id")),
|
Column('currentModelId', Integer, ForeignKey("models.id")),
|
||||||
# syncing
|
# syncing
|
||||||
Column('syncName', UnicodeText),
|
Column('syncName', UnicodeText),
|
||||||
|
@ -280,7 +279,6 @@ where id != :id and factId = :factId""",
|
||||||
entry = CardHistoryEntry(card, ease, lastDelay)
|
entry = CardHistoryEntry(card, ease, lastDelay)
|
||||||
entry.writeSQL(self.s)
|
entry.writeSQL(self.s)
|
||||||
self.modified = now
|
self.modified = now
|
||||||
#print "ans", time.time() - t
|
|
||||||
|
|
||||||
# Queue/cache management
|
# Queue/cache management
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
@ -462,7 +460,7 @@ factor = 2.5, reps = 0, successive = 0, averageTime = 0, reviewTime = 0,
|
||||||
youngEase0 = 0, youngEase1 = 0, youngEase2 = 0, youngEase3 = 0,
|
youngEase0 = 0, youngEase1 = 0, youngEase2 = 0, youngEase3 = 0,
|
||||||
youngEase4 = 0, matureEase0 = 0, matureEase1 = 0, matureEase2 = 0,
|
youngEase4 = 0, matureEase0 = 0, matureEase1 = 0, matureEase2 = 0,
|
||||||
matureEase3 = 0,matureEase4 = 0, yesCount = 0, noCount = 0,
|
matureEase3 = 0,matureEase4 = 0, yesCount = 0, noCount = 0,
|
||||||
spaceUntil = 0, relativeDelay = 0, isDue = 0, type = 2,
|
spaceUntil = 0, isDue = 0, type = 2,
|
||||||
combinedDue = created, modified = :now, due = created
|
combinedDue = created, modified = :now, due = created
|
||||||
where id in %s""" % ids2str(ids), now=time.time(), new=NEW_INTERVAL)
|
where id in %s""" % ids2str(ids), now=time.time(), new=NEW_INTERVAL)
|
||||||
self.flushMod()
|
self.flushMod()
|
||||||
|
@ -624,12 +622,12 @@ suspended</a> cards.''') % {
|
||||||
|
|
||||||
def suspendedCardCount(self):
|
def suspendedCardCount(self):
|
||||||
return self.s.scalar("""
|
return self.s.scalar("""
|
||||||
select count(id) from cards where type in (0,1,2) and isDue in (0,1)
|
"select count(id) from cards where type in (0,1,2) and priority = 0")
|
||||||
and priority = 0""")
|
and priority = 0""")
|
||||||
|
|
||||||
def seenCardCount(self):
|
def seenCardCount(self):
|
||||||
return self.s.scalar(
|
return self.s.scalar(
|
||||||
"select count(id) from cards where type in (0, 1)")
|
"select count(id) from cards where type = 2")
|
||||||
|
|
||||||
# Counts related to due cards
|
# Counts related to due cards
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
@ -645,6 +643,7 @@ and priority = 0""")
|
||||||
return self.s.scalar("""
|
return self.s.scalar("""
|
||||||
select count(cards.id) from cards where
|
select count(cards.id) from cards where
|
||||||
type in (1,2) and isDue = 0 and priority in (1,2,3,4) and due < :now""",
|
type in (1,2) and isDue = 0 and priority in (1,2,3,4) and due < :now""",
|
||||||
|
priority in (1,2,3,4) and due < :now and spaceUntil > :now""",
|
||||||
now=time.time())
|
now=time.time())
|
||||||
|
|
||||||
def isEmpty(self):
|
def isEmpty(self):
|
||||||
|
@ -1655,11 +1654,8 @@ alter table decks add column newCount integer not null default 0""")
|
||||||
"Add indices to the DB."
|
"Add indices to the DB."
|
||||||
# card queues
|
# card queues
|
||||||
deck.s.statement("""
|
deck.s.statement("""
|
||||||
create index if not exists ix_cards_checkDueOrder on cards
|
create index if not exists ix_cards_combinedDue on cards
|
||||||
(type, isDue, priority desc, combinedDue desc)""")
|
(type, isDue, combinedDue, priority)""")
|
||||||
deck.s.statement("""
|
|
||||||
create index if not exists ix_cards_failedOrder on cards
|
|
||||||
(type, isDue, priority desc, due)""")
|
|
||||||
deck.s.statement("""
|
deck.s.statement("""
|
||||||
create index if not exists ix_cards_revisionOrder on cards
|
create index if not exists ix_cards_revisionOrder on cards
|
||||||
(type, isDue, priority desc, interval desc)""")
|
(type, isDue, priority desc, interval desc)""")
|
||||||
|
@ -1668,7 +1664,7 @@ create index if not exists ix_cards_newRandomOrder on cards
|
||||||
(type, isDue, priority desc, factId, ordinal)""")
|
(type, isDue, priority desc, factId, ordinal)""")
|
||||||
deck.s.statement("""
|
deck.s.statement("""
|
||||||
create index if not exists ix_cards_newOrderedOrder on cards
|
create index if not exists ix_cards_newOrderedOrder on cards
|
||||||
(type, isDue, priority desc, due)""")
|
(type, isDue, priority desc, combinedDue)""")
|
||||||
# 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)""")
|
||||||
|
@ -1699,7 +1695,7 @@ create index if not exists ix_mediaDeleted_factId on mediaDeleted (mediaId)""")
|
||||||
def _addViews(deck):
|
def _addViews(deck):
|
||||||
"Add latest version of SQL views to DB."
|
"Add latest version of SQL views to DB."
|
||||||
s = deck.s
|
s = deck.s
|
||||||
# old tables
|
# old views
|
||||||
s.statement("drop view if exists failedCards")
|
s.statement("drop view if exists failedCards")
|
||||||
s.statement("drop view if exists acqCards")
|
s.statement("drop view if exists acqCards")
|
||||||
s.statement("drop view if exists futureCards")
|
s.statement("drop view if exists futureCards")
|
||||||
|
@ -1714,15 +1710,16 @@ create index if not exists ix_mediaDeleted_factId on mediaDeleted (mediaId)""")
|
||||||
create view failedCardsNow as
|
create view failedCardsNow as
|
||||||
select * from cards
|
select * from cards
|
||||||
where type = 0 and isDue = 1
|
where type = 0 and isDue = 1
|
||||||
order by due
|
and +priority in (1,2,3,4)
|
||||||
|
order by type, isDue, combinedDue
|
||||||
""")
|
""")
|
||||||
s.statement("""
|
s.statement("""
|
||||||
create view failedCardsSoon as
|
create view failedCardsSoon as
|
||||||
select * from cards
|
select * from cards
|
||||||
where type = 0 and priority in (1,2,3,4)
|
where type = 0 and +priority in (1,2,3,4)
|
||||||
and combinedDue <= (select max(delay0, delay1) +
|
and combinedDue <= (select max(delay0, delay1) +
|
||||||
strftime("%s", "now")+1 from decks)
|
strftime("%s", "now")+1 from decks where id = 1)
|
||||||
order by modified
|
order by type, isDue, combinedDue
|
||||||
""")
|
""")
|
||||||
s.statement("""
|
s.statement("""
|
||||||
create view revCards as
|
create view revCards as
|
||||||
|
@ -1738,7 +1735,7 @@ order by priority desc, factId, ordinal""")
|
||||||
create view acqCardsOrdered as
|
create view acqCardsOrdered 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, combinedDue""")
|
||||||
_addViews = staticmethod(_addViews)
|
_addViews = staticmethod(_addViews)
|
||||||
|
|
||||||
def _upgradeDeck(deck, path):
|
def _upgradeDeck(deck, path):
|
||||||
|
@ -1750,8 +1747,6 @@ order by priority desc, due""")
|
||||||
deck.s.statement("""
|
deck.s.statement("""
|
||||||
alter table cards add column spaceUntil float not null default 0""")
|
alter table cards add column spaceUntil float not null default 0""")
|
||||||
deck.s.statement("""
|
deck.s.statement("""
|
||||||
alter table cards add column relativeDelay float not null default 0.0""")
|
|
||||||
deck.s.statement("""
|
|
||||||
alter table cards add column isDue boolean not null default 0""")
|
alter table cards add column isDue boolean not null default 0""")
|
||||||
deck.s.statement("""
|
deck.s.statement("""
|
||||||
alter table cards add column type integer not null default 0""")
|
alter table cards add column type integer not null default 0""")
|
||||||
|
@ -1881,7 +1876,7 @@ alter table models add column source integer not null default 0""")
|
||||||
DeckStorage._setUTCOffset(deck)
|
DeckStorage._setUTCOffset(deck)
|
||||||
deck.version = 11
|
deck.version = 11
|
||||||
deck.s.commit()
|
deck.s.commit()
|
||||||
if deck.version < 12: #True: # False: #True: #deck.version < 12:
|
if deck.version < 12:
|
||||||
deck.s.statement("drop index if exists ix_cards_revisionOrder")
|
deck.s.statement("drop index if exists ix_cards_revisionOrder")
|
||||||
deck.s.statement("drop index if exists ix_cards_newRandomOrder")
|
deck.s.statement("drop index if exists ix_cards_newRandomOrder")
|
||||||
deck.s.statement("drop index if exists ix_cards_newOrderedOrder")
|
deck.s.statement("drop index if exists ix_cards_newOrderedOrder")
|
||||||
|
@ -1892,12 +1887,14 @@ alter table models add column source integer not null default 0""")
|
||||||
deck.s.statement("drop index if exists ix_cards_priority")
|
deck.s.statement("drop index if exists ix_cards_priority")
|
||||||
DeckStorage._addViews(deck)
|
DeckStorage._addViews(deck)
|
||||||
DeckStorage._addIndices(deck)
|
DeckStorage._addIndices(deck)
|
||||||
|
deck.s.statement("analyze")
|
||||||
|
if deck.version < 13:
|
||||||
deck.rebuildCounts()
|
deck.rebuildCounts()
|
||||||
deck.rebuildQueue()
|
deck.rebuildQueue()
|
||||||
# regenerate question/answer cache
|
# regenerate question/answer cache
|
||||||
for m in deck.models:
|
for m in deck.models:
|
||||||
deck.updateCardsFromModel(m)
|
deck.updateCardsFromModel(m)
|
||||||
deck.version = 12
|
deck.version = 13
|
||||||
deck.s.commit()
|
deck.s.commit()
|
||||||
return deck
|
return deck
|
||||||
_upgradeDeck = staticmethod(_upgradeDeck)
|
_upgradeDeck = staticmethod(_upgradeDeck)
|
||||||
|
|
|
@ -77,7 +77,7 @@ class AnkiExporter(Exporter):
|
||||||
delete from reviewHistory""")
|
delete from reviewHistory""")
|
||||||
self.newDeck.s.statement("""
|
self.newDeck.s.statement("""
|
||||||
update cards set
|
update cards set
|
||||||
interval = 0.001,
|
interval = 0,
|
||||||
lastInterval = 0,
|
lastInterval = 0,
|
||||||
due = created,
|
due = created,
|
||||||
lastDue = 0,
|
lastDue = 0,
|
||||||
|
@ -101,7 +101,6 @@ yesCount = 0,
|
||||||
noCount = 0,
|
noCount = 0,
|
||||||
spaceUntil = 0,
|
spaceUntil = 0,
|
||||||
isDue = 1,
|
isDue = 1,
|
||||||
relativeDelay = 0,
|
|
||||||
type = 2,
|
type = 2,
|
||||||
combinedDue = created,
|
combinedDue = created,
|
||||||
modified = :now
|
modified = :now
|
||||||
|
|
10
anki/sync.py
10
anki/sync.py
|
@ -526,8 +526,7 @@ priority, interval, lastInterval, due, lastDue, factor,
|
||||||
firstAnswered, reps, successive, averageTime, reviewTime, youngEase0,
|
firstAnswered, reps, successive, averageTime, reviewTime, youngEase0,
|
||||||
youngEase1, youngEase2, youngEase3, youngEase4, matureEase0,
|
youngEase1, youngEase2, youngEase3, youngEase4, matureEase0,
|
||||||
matureEase1, matureEase2, matureEase3, matureEase4, yesCount, noCount,
|
matureEase1, matureEase2, matureEase3, matureEase4, yesCount, noCount,
|
||||||
question, answer, lastFactor, spaceUntil, isDue, type, combinedDue,
|
question, answer, lastFactor, spaceUntil, isDue, type, combinedDue)
|
||||||
relativeDelay)
|
|
||||||
values
|
values
|
||||||
(:id, :factId, :cardModelId, :created, :modified, :tags, :ordinal,
|
(:id, :factId, :cardModelId, :created, :modified, :tags, :ordinal,
|
||||||
:priority, :interval, :lastInterval, :due, :lastDue, :factor,
|
:priority, :interval, :lastInterval, :due, :lastDue, :factor,
|
||||||
|
@ -535,7 +534,7 @@ values
|
||||||
:youngEase1, :youngEase2, :youngEase3, :youngEase4, :matureEase0,
|
:youngEase1, :youngEase2, :youngEase3, :youngEase4, :matureEase0,
|
||||||
:matureEase1, :matureEase2, :matureEase3, :matureEase4, :yesCount,
|
:matureEase1, :matureEase2, :matureEase3, :matureEase4, :yesCount,
|
||||||
:noCount, :question, :answer, :lastFactor, :spaceUntil, :isDue,
|
:noCount, :question, :answer, :lastFactor, :spaceUntil, :isDue,
|
||||||
:type, :combinedDue, 0)""", dlist)
|
:type, :combinedDue)""", dlist)
|
||||||
self.deck.s.statement(
|
self.deck.s.statement(
|
||||||
"delete from cardsDeleted where cardId in %s" %
|
"delete from cardsDeleted where cardId in %s" %
|
||||||
ids2str([c[0] for c in cards]))
|
ids2str([c[0] for c in cards]))
|
||||||
|
@ -803,11 +802,10 @@ priority, interval, lastInterval, due, lastDue, factor,
|
||||||
firstAnswered, reps, successive, averageTime, reviewTime, youngEase0,
|
firstAnswered, reps, successive, averageTime, reviewTime, youngEase0,
|
||||||
youngEase1, youngEase2, youngEase3, youngEase4, matureEase0,
|
youngEase1, youngEase2, youngEase3, youngEase4, matureEase0,
|
||||||
matureEase1, matureEase2, matureEase3, matureEase4, yesCount, noCount,
|
matureEase1, matureEase2, matureEase3, matureEase4, yesCount, noCount,
|
||||||
question, answer, lastFactor, spaceUntil, isDue, type, combinedDue,
|
question, answer, lastFactor, spaceUntil, isDue, type, combinedDue)
|
||||||
relativeDelay)
|
|
||||||
values
|
values
|
||||||
(:id, :factId, :cardModelId, :created, :t, "", :ordinal,
|
(:id, :factId, :cardModelId, :created, :t, "", :ordinal,
|
||||||
1, 0.001, 0, :created, 0, 2.5,
|
1, 0, 0, :created, 0, 2.5,
|
||||||
0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0,
|
||||||
|
|
Loading…
Reference in a new issue