optimize card q/a generation and model fetching

This commit is contained in:
Damien Elmes 2011-03-22 14:07:05 +09:00
parent c63b4085c6
commit 45d1b788ea
3 changed files with 33 additions and 8 deletions

View file

@ -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()

View file

@ -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]

View file

@ -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
################################################## ##################################################