restore inactive tags with a more efficient query

This commit is contained in:
Damien Elmes 2010-11-02 02:32:59 +09:00
parent 37c15a320e
commit 73119c93cf

View file

@ -157,12 +157,14 @@ class Deck(object):
self.lastSessionStart = 0 self.lastSessionStart = 0
self.queueLimit = 200 self.queueLimit = 200
# if most recent deck var not defined, make sure defaults are set # if most recent deck var not defined, make sure defaults are set
if not self.s.scalar("select 1 from deckVars where key = 'revActive'"): if not self.s.scalar("select 1 from deckVars where key = 'revInactive'"):
self.setVarDefault("suspendLeeches", True) self.setVarDefault("suspendLeeches", True)
self.setVarDefault("leechFails", 16) self.setVarDefault("leechFails", 16)
self.setVarDefault("perDay", True) self.setVarDefault("perDay", True)
self.setVarDefault("newActive", "") self.setVarDefault("newActive", "")
self.setVarDefault("revActive", "") self.setVarDefault("revActive", "")
self.setVarDefault("newInactive", self.suspended)
self.setVarDefault("revInactive", self.suspended)
self.updateCutoff() self.updateCutoff()
self.setupStandardScheduler() self.setupStandardScheduler()
@ -210,35 +212,45 @@ class Deck(object):
self.rebuildRevCount() self.rebuildRevCount()
self.rebuildNewCount() self.rebuildNewCount()
def _cardLimit(self, active, sql): def _cardLimit(self, active, inactive, sql):
yes = parseTags(self.getVar(active)) yes = parseTags(self.getVar(active))
no = parseTags(self.getVar(inactive))
if yes: if yes:
yids = tagIds(self.s, yes).values() yids = tagIds(self.s, yes).values()
nids = tagIds(self.s, no).values()
return sql.replace( return sql.replace(
"where ", "where ",
"where +c.id in (select cardId from cardTags where " "where +c.id in (select cardId from cardTags where "
"tagId in %s) and " % ids2str(yids)) "tagId in %s and tagId not in %s) and " % (
ids2str(yids),
ids2str(nids)))
elif no:
nids = tagIds(self.s, no).values()
return sql.replace(
"where ",
"where +c.id not in (select cardId from cardTags where "
"tagId in %s) and " % ids2str(nids))
else: else:
return sql return sql
def _rebuildFailedCount(self): def _rebuildFailedCount(self):
self.failedSoonCount = self.s.scalar( self.failedSoonCount = self.s.scalar(
self.cardLimit( self.cardLimit(
"revActive", "revActive", "revInactive",
"select count(*) from cards c where type = 0 " "select count(*) from cards c where type = 0 "
"and combinedDue < :lim"), lim=self.dueCutoff) "and combinedDue < :lim"), lim=self.dueCutoff)
def _rebuildRevCount(self): def _rebuildRevCount(self):
self.revCount = self.s.scalar( self.revCount = self.s.scalar(
self.cardLimit( self.cardLimit(
"revActive", "revActive", "revInactive",
"select count(*) from cards c where type = 1 " "select count(*) from cards c where type = 1 "
"and combinedDue < :lim"), lim=self.dueCutoff) "and combinedDue < :lim"), lim=self.dueCutoff)
def _rebuildNewCount(self): def _rebuildNewCount(self):
self.newCount = self.s.scalar( self.newCount = self.s.scalar(
self.cardLimit( self.cardLimit(
"newActive", "newActive", "newInactive",
"select count(*) from cards c where type = 2 " "select count(*) from cards c where type = 2 "
"and combinedDue < :lim"), lim=self.dueCutoff) "and combinedDue < :lim"), lim=self.dueCutoff)
self.updateNewCountToday() self.updateNewCountToday()
@ -252,7 +264,7 @@ class Deck(object):
if self.failedSoonCount and not self.failedQueue: if self.failedSoonCount and not self.failedQueue:
self.failedQueue = self.s.all( self.failedQueue = self.s.all(
self.cardLimit( self.cardLimit(
"revActive", """ "revActive", "revInactive", """
select c.id, factId, combinedDue from cards c where select c.id, factId, combinedDue from cards c where
type = 0 and combinedDue < :lim order by combinedDue type = 0 and combinedDue < :lim order by combinedDue
limit %d""" % self.queueLimit), lim=self.dueCutoff) limit %d""" % self.queueLimit), lim=self.dueCutoff)
@ -262,7 +274,7 @@ limit %d""" % self.queueLimit), lim=self.dueCutoff)
if self.revCount and not self.revQueue: if self.revCount and not self.revQueue:
self.revQueue = self.s.all( self.revQueue = self.s.all(
self.cardLimit( self.cardLimit(
"revActive", """ "revActive", "revInactive", """
select c.id, factId from cards c where select c.id, factId from cards c where
type = 1 and combinedDue < :lim order by %s type = 1 and combinedDue < :lim order by %s
limit %d""" % (self.revOrder(), self.queueLimit)), lim=self.dueCutoff) limit %d""" % (self.revOrder(), self.queueLimit)), lim=self.dueCutoff)
@ -272,7 +284,7 @@ limit %d""" % (self.revOrder(), self.queueLimit)), lim=self.dueCutoff)
if self.newCount and not self.newQueue: if self.newCount and not self.newQueue:
self.newQueue = self.s.all( self.newQueue = self.s.all(
self.cardLimit( self.cardLimit(
"newActive", """ "newActive", "newInactive", """
select c.id, factId from cards c where select c.id, factId from cards c where
type = 2 and combinedDue < :lim order by %s type = 2 and combinedDue < :lim order by %s
limit %d""" % (self.newOrder(), self.queueLimit)), lim=self.dueCutoff) limit %d""" % (self.newOrder(), self.queueLimit)), lim=self.dueCutoff)
@ -1038,7 +1050,7 @@ At this time tomorrow:<br>
This may be in the past if the deck is not finished. This may be in the past if the deck is not finished.
If the deck has no (enabled) cards, return None. If the deck has no (enabled) cards, return None.
Ignore new cards.""" Ignore new cards."""
return self.s.scalar(self.cardLimit("revActive", """ return self.s.scalar(self.cardLimit("revActive", "revInactive", """
select combinedDue from cards c where type in (0,1) select combinedDue from cards c where type in (0,1)
order by combinedDue order by combinedDue
limit 1""")) limit 1"""))