mirror of
https://github.com/ankitects/anki.git
synced 2025-09-22 16:02:23 -04:00
optimize card q/a generation and model fetching
This commit is contained in:
parent
c63b4085c6
commit
45d1b788ea
3 changed files with 33 additions and 8 deletions
|
@ -22,6 +22,7 @@ class Card(object):
|
||||||
self.deck = deck
|
self.deck = deck
|
||||||
self.timerStarted = None
|
self.timerStarted = None
|
||||||
self._qa = None
|
self._qa = None
|
||||||
|
self._rd = None
|
||||||
if id:
|
if id:
|
||||||
self.id = id
|
self.id = id
|
||||||
self.load()
|
self.load()
|
||||||
|
@ -106,14 +107,30 @@ streak=?, lapses=?, grade=?, cycles=?, edue=? where id = ?""",
|
||||||
|
|
||||||
def _getQA(self, reload=False):
|
def _getQA(self, reload=False):
|
||||||
if not self._qa or reload:
|
if not self._qa or reload:
|
||||||
self._qa = self.deck.renderQA([self.id], "card")[0]
|
gname = self.deck.db.scalar(
|
||||||
|
"select name from groups where id = ?", self.gid)
|
||||||
|
f = self.fact(); m = self.model()
|
||||||
|
data = [self.id, f.id, m.id, self.gid, self.ord, f.stringTags(),
|
||||||
|
f.joinedFields(), ""]
|
||||||
|
self._qa = self.deck._renderQA(self.model(), gname, data)
|
||||||
return self._qa
|
return self._qa
|
||||||
|
|
||||||
|
def _reviewData(self, reload=False):
|
||||||
|
"Fetch the model and fact."
|
||||||
|
if not self._rd or reload:
|
||||||
|
f = self.deck.getFact(self.fid)
|
||||||
|
m = self.deck.getModel(f.mid)
|
||||||
|
self._rd = [f, m]
|
||||||
|
return self._rd
|
||||||
|
|
||||||
def fact(self):
|
def fact(self):
|
||||||
return self.deck.getFact(self.fid)
|
return self._reviewData()[0]
|
||||||
|
|
||||||
|
def model(self, reload=False):
|
||||||
|
return self._reviewData()[1]
|
||||||
|
|
||||||
def template(self):
|
def template(self):
|
||||||
return self.deck.getTemplate(self.fact().mid, self.ord)
|
return self._reviewData()[1].templates[self.ord]
|
||||||
|
|
||||||
def startTimer(self):
|
def startTimer(self):
|
||||||
self.timerStarted = time.time()
|
self.timerStarted = time.time()
|
||||||
|
|
13
anki/deck.py
13
anki/deck.py
|
@ -68,6 +68,7 @@ class _Deck(object):
|
||||||
d = datetime.datetime(d.year, d.month, d.day)
|
d = datetime.datetime(d.year, d.month, d.day)
|
||||||
d += datetime.timedelta(hours=4)
|
d += datetime.timedelta(hours=4)
|
||||||
self.crt = int(time.mktime(d.timetuple()))
|
self.crt = int(time.mktime(d.timetuple()))
|
||||||
|
self.modelCache = {}
|
||||||
self.undoEnabled = False
|
self.undoEnabled = False
|
||||||
self.sessionStartReps = 0
|
self.sessionStartReps = 0
|
||||||
self.sessionStartTime = 0
|
self.sessionStartTime = 0
|
||||||
|
@ -172,11 +173,13 @@ qconf=?, conf=?, data=?""",
|
||||||
def getFact(self, id):
|
def getFact(self, id):
|
||||||
return anki.facts.Fact(self, id=id)
|
return anki.facts.Fact(self, id=id)
|
||||||
|
|
||||||
def getTemplate(self, mid, ord):
|
|
||||||
return self.getModel(mid).templates[ord]
|
|
||||||
|
|
||||||
def getModel(self, mid):
|
def getModel(self, mid):
|
||||||
return anki.models.Model(self, mid)
|
"Memoizes; call .reset() to reset cache."
|
||||||
|
if mid in self.modelCache:
|
||||||
|
return self.modelCache[mid]
|
||||||
|
m = anki.models.Model(self, mid)
|
||||||
|
self.modelCache[mid] = m
|
||||||
|
return m
|
||||||
|
|
||||||
# Utils
|
# Utils
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
@ -189,6 +192,7 @@ qconf=?, conf=?, data=?""",
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
"Rebuild the queue and reload data after DB modified."
|
"Rebuild the queue and reload data after DB modified."
|
||||||
|
self.modelCache = {}
|
||||||
self.sched.reset()
|
self.sched.reset()
|
||||||
|
|
||||||
# Facts
|
# Facts
|
||||||
|
@ -434,6 +438,7 @@ select id from cards where fid in (select id from facts where mid = ?)""",
|
||||||
return [self._renderQA(mods[row[2]], groups[row[3]], row)
|
return [self._renderQA(mods[row[2]], groups[row[3]], row)
|
||||||
for row in self._qaData(where)]
|
for row in self._qaData(where)]
|
||||||
|
|
||||||
|
# fixme: don't need gid or data
|
||||||
def _renderQA(self, model, gname, data):
|
def _renderQA(self, model, gname, data):
|
||||||
"Returns hash of id, question, answer."
|
"Returns hash of id, question, answer."
|
||||||
# data is [cid, fid, mid, gid, ord, tags, flds, data]
|
# data is [cid, fid, mid, gid, ord, tags, flds, data]
|
||||||
|
|
|
@ -44,7 +44,7 @@ select mid, gid, crt, mod, tags, flds, data from facts where id = ?""", self.id)
|
||||||
self.mod = intTime()
|
self.mod = intTime()
|
||||||
# facts table
|
# facts table
|
||||||
sfld = self._fields[self._model.sortIdx()]
|
sfld = self._fields[self._model.sortIdx()]
|
||||||
tags = canonifyTags(self.tags)
|
tags = self.stringTags()
|
||||||
res = self.deck.db.execute("""
|
res = self.deck.db.execute("""
|
||||||
insert or replace into facts values (?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
insert or replace into facts values (?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
||||||
self.id, self.mid, self.gid, self.crt,
|
self.id, self.mid, self.gid, self.crt,
|
||||||
|
@ -107,6 +107,9 @@ insert or replace into facts values (?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
||||||
def hasTag(self, tag):
|
def hasTag(self, tag):
|
||||||
return hasTag(tag, self.tags)
|
return hasTag(tag, self.tags)
|
||||||
|
|
||||||
|
def stringTags(self):
|
||||||
|
return canonifyTags(self.tags)
|
||||||
|
|
||||||
# Unique/duplicate checks
|
# Unique/duplicate checks
|
||||||
##################################################
|
##################################################
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue