diff --git a/anki/find.py b/anki/find.py index f86a9ce04..0755e1db1 100644 --- a/anki/find.py +++ b/anki/find.py @@ -15,6 +15,7 @@ SEARCH_FIELD = 5 SEARCH_MODEL = 6 SEARCH_DECK = 7 SEARCH_PROP = 8 +SEARCH_RATED = 9 # Tools ########################################################################## @@ -122,6 +123,8 @@ and c.nid=n.id %s""" % (q, order) self._findDeck(token, isNeg) elif type == SEARCH_PROP: self._findProp(token, isNeg) + elif type == SEARCH_RATED: + self._findRated(token, isNeg) else: self._findText(token, isNeg, c) @@ -164,6 +167,23 @@ and c.nid=n.id %s""" % (q, order) else: self.lims['valid'] = False + def _findRated(self, val, neg): + r = val.split(":") + if len(r) != 2 or r[0] not in ("1", "2", "3", "4"): + self.lims['valid'] = False + return + try: + days = int(r[1]) + except ValueError: + self.lims['valid'] = False + return + # bound the search + days = min(days, 31) + lim = self.col.sched.dayCutoff - 86400*days + self.lims['preds'].append( + "c.id in (select cid from revlog where ease=%s and id>%d)" % + (r[0], (lim*1000))) + def _findProp(self, val, neg): # extract m = re.match("(^.+?)(<=|>=|=|<|>)(.+?$)", val) @@ -418,6 +438,9 @@ n.mid in %s and n.id %s in %s""" % ( elif token['value'].startswith("prop:"): token['value'] = token['value'][5:].lower() type = SEARCH_PROP + elif token['value'].startswith("rated:"): + token['value'] = token['value'][6:].lower() + type = SEARCH_RATED elif token['value'].startswith("nid:") and len(token['value']) > 4: dec = token['value'][4:] try: diff --git a/tests/test_find.py b/tests/test_find.py index 2fa247d91..6c59d4949 100644 --- a/tests/test_find.py +++ b/tests/test_find.py @@ -160,6 +160,19 @@ def test_findCards(): assert len(deck.findCards("prop:ease=2.2")) == 1 assert len(deck.findCards("prop:ease>2")) == 1 assert len(deck.findCards("-prop:ease>2")) > 1 + # recently failed + assert len(deck.findCards("rated:1:1")) == 0 + assert len(deck.findCards("rated:2:1")) == 0 + c = deck.sched.getCard() + deck.sched.answerCard(c, 2) + assert len(deck.findCards("rated:1:1")) == 0 + assert len(deck.findCards("rated:2:1")) == 1 + c = deck.sched.getCard() + deck.sched.answerCard(c, 1) + assert len(deck.findCards("rated:1:1")) == 1 + assert len(deck.findCards("rated:2:1")) == 1 + assert len(deck.findCards("rated:2:0")) == 0 + assert len(deck.findCards("rated:2:2")) == 1 def test_findReplace(): deck = getEmptyDeck()