implement sort fields; make sure they're updated on upgrade

This commit is contained in:
Damien Elmes 2011-03-12 20:46:08 +09:00
parent 93dcfceffe
commit d95cc6c44b
5 changed files with 51 additions and 28 deletions

View file

@ -22,6 +22,9 @@ REV_CARDS_OLD_FIRST = 0
REV_CARDS_NEW_FIRST = 1 REV_CARDS_NEW_FIRST = 1
REV_CARDS_RANDOM = 2 REV_CARDS_RANDOM = 2
# maximum characters to store in sort cache
SORT_FIELD_LEN = 20
# Labels # Labels
########################################################################## ##########################################################################

View file

@ -627,9 +627,13 @@ where id = :id""", vals)
def currentModel(self): def currentModel(self):
return self.getModel(self.conf['currentModelId']) return self.getModel(self.conf['currentModelId'])
def allModels(self): def models(self):
return [self.getModel(id) for id in self.db.list( "Return a dict of mid -> model."
"select id from models")] mods = {}
for m in [self.getModel(id) for id in self.db.list(
"select id from models")]:
mods[m.id] = m
return mods
def getModel(self, mid): def getModel(self, mid):
return anki.models.Model(self, mid) return anki.models.Model(self, mid)
@ -860,9 +864,7 @@ where tid in %s""" % strids, now=time.time())
where = "" where = ""
else: else:
raise Exception() raise Exception()
mods = {} mods = self.models()
for m in self.allModels():
mods[m.id] = m
groups = dict(self.db.all("select id, name from groups")) groups = dict(self.db.all("select id, name from groups"))
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)]
@ -908,24 +910,32 @@ from cards c, facts f, models m, groups g
where c.fid == f.id and f.mid == m.id and c.gid = g.id where c.fid == f.id and f.mid == m.id and c.gid = g.id
%s""" % where) %s""" % where)
# Field checksum bulk update # Field checksums and sorting fields
########################################################################## ##########################################################################
def updateFieldChecksums(self, fids): def _fieldData(self, sfids):
"Update all field checksums, after find&replace, etc." return self.db.execute(
"select id, mid, flds from facts where id in "+sfids)
def updateFieldCache(self, fids, csum=True):
"Update field checksums and sort cache, after find&replace, etc."
sfids = ids2str(fids) sfids = ids2str(fids)
mods = {} mods = self.models()
for m in self.allModels():
mods[m.id] = m
r = [] r = []
for row in self._qaData(where="and f.id in "+sfids): r2 = []
fields = splitFields(row[6]) for (fid, mid, flds) in self._fieldData(sfids):
model = mods[row[2]] fields = splitFields(flds)
model = mods[mid]
if csum:
for c, f in enumerate(model.fields): for c, f in enumerate(model.fields):
if f['uniq'] and fields[c]: if f['uniq'] and fields[c]:
r.append((row[1], model.id, fieldChecksum(fields[c]))) r.append((fid, mid, fieldChecksum(fields[c])))
r2.append((stripHTML(fields[model.sortIdx()])[
:SORT_FIELD_LEN], fid))
if csum:
self.db.execute("delete from fsums where fid in "+sfids) self.db.execute("delete from fsums where fid in "+sfids)
self.db.executemany("insert into fsums values (?,?,?)", r) self.db.executemany("insert into fsums values (?,?,?)", r)
self.db.executemany("update facts set sfld = ? where id = ?", r2)
# Tags # Tags
########################################################################## ##########################################################################

View file

@ -40,7 +40,7 @@ select mid, crt, mod, tags, flds, data from facts where id = ?""", self.id)
def flush(self): def flush(self):
self.mod = intTime() self.mod = intTime()
# facts table # facts table
sfld = self._fields[self.model.sortField()] sfld = self._fields[self.model.sortIdx()]
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.crt, self.id, self.mid, self.crt,

View file

@ -10,6 +10,7 @@ from anki.lang import _
########################################################################## ##########################################################################
defaultConf = { defaultConf = {
'sortf': 0,
} }
defaultField = { defaultField = {
@ -75,6 +76,9 @@ insert or replace into models values (?, ?, ?, ?, ?, ?, ?)""",
self.genCSS()) self.genCSS())
self.id = ret.lastrowid self.id = ret.lastrowid
def fids(self):
return self.deck.db.list("select id from facts where mid = ?", self.id)
# Fields # Fields
################################################## ##################################################
@ -89,9 +93,13 @@ insert or replace into models values (?, ?, ?, ?, ?, ?, ?)""",
"Mapping of field name -> (ord, conf)." "Mapping of field name -> (ord, conf)."
return dict([(f['name'], (c, f)) for c, f in enumerate(self.fields)]) return dict([(f['name'], (c, f)) for c, f in enumerate(self.fields)])
def sortField(self): def sortIdx(self):
print "sortField() fixme" return self.conf['sortf']
return 0
def setSortIdx(self, idx):
assert idx > 0 and idx < len(self.fields)
self.conf['sortf'] = idx
self.deck.updateFieldCache(self.fids(), csum=False)
# Templates # Templates
################################################## ##################################################

View file

@ -307,10 +307,12 @@ originalPath from media2""")
# models # models
########### ###########
import anki.models
_moveTable(db, "models") _moveTable(db, "models")
db.execute(""" db.execute("""
insert into models select id, cast(modified as int), insert into models select id, cast(modified as int),
name, "{}", "{}", "{}", "" from models2""") name, "{}", "{}", ?, "" from models2""", simplejson.dumps(
anki.models.defaultConf))
db.execute("drop table models2") db.execute("drop table models2")
# reviewHistory -> revlog # reviewHistory -> revlog
@ -454,9 +456,9 @@ questionAlign, lastFontColour, allowEmptyAnswer, typeAnswer from cardModels"""):
def _rewriteModelIds(deck): def _rewriteModelIds(deck):
# rewrite model/template/field ids # rewrite model/template/field ids
models = deck.allModels() models = deck.models()
deck.db.execute("delete from models") deck.db.execute("delete from models")
for c, m in enumerate(models): for c, m in enumerate(models.values()):
old = m.id old = m.id
m.id = c+1 m.id = c+1
m.flush() m.flush()
@ -468,7 +470,7 @@ def _postSchemaUpgrade(deck):
# fix up model/template ids # fix up model/template ids
_rewriteModelIds(deck) _rewriteModelIds(deck)
# update uniq cache # update uniq cache
deck.updateFieldChecksums(deck.db.list("select id from facts")) deck.updateFieldCache(deck.db.list("select id from facts"))
# remove old views # remove old views
for v in ("failedCards", "revCardsOld", "revCardsNew", for v in ("failedCards", "revCardsOld", "revCardsNew",
"revCardsDue", "revCardsRandom", "acqCardsRandom", "revCardsDue", "revCardsRandom", "acqCardsRandom",