From 87bc1e69b0c637fc4427364ea1ca4c8d56c1130b Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Sun, 10 Jan 2021 16:16:17 +0100 Subject: [PATCH 1/5] Coerce added/edited:0 to 1, constrain rated:n to 1 <= 365 --- rslib/src/search/parser.rs | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/rslib/src/search/parser.rs b/rslib/src/search/parser.rs index 9e03abcc5..ea0ff441b 100644 --- a/rslib/src/search/parser.rs +++ b/rslib/src/search/parser.rs @@ -273,8 +273,8 @@ fn search_node_for_text_with_argument<'a>( val: &'a str, ) -> ParseResult> { Ok(match key.to_ascii_lowercase().as_str() { - "added" => SearchNode::AddedInDays(val.parse()?), - "edited" => SearchNode::EditedInDays(val.parse()?), + "added" => parse_added(val)?, + "edited" => parse_edited(val)?, "deck" => SearchNode::Deck(unescape(val)?), "note" => SearchNode::NoteType(unescape(val)?), "tag" => SearchNode::Tag(unescape(val)?), @@ -309,6 +309,20 @@ fn check_id_list(s: &str) -> ParseResult<&str> { } } +/// eg added:1 +fn parse_added(s: &str) -> ParseResult> { + let n: u32 = s.parse()?; + let days = n.max(1); + Ok(SearchNode::AddedInDays(days)) +} + +/// eg edited:1 +fn parse_edited(s: &str) -> ParseResult> { + let n: u32 = s.parse()?; + let days = n.max(1); + Ok(SearchNode::EditedInDays(n)) +} + /// eg is:due fn parse_state(s: &str) -> ParseResult> { use StateKind::*; @@ -339,7 +353,10 @@ fn parse_flag(s: &str) -> ParseResult> { /// second arg must be between 0-4 fn parse_rated(val: &str) -> ParseResult> { let mut it = val.splitn(2, ':'); - let days = it.next().unwrap().parse()?; + + let n: u32 = it.next().unwrap().parse()?; + let days = n.max(1).min(365); + let ease = match it.next() { Some(v) => { let n: u8 = v.parse()?; From 8f01887fe78bbfb1dcc5c00a8b52c92ec52f48dc Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Sun, 10 Jan 2021 16:23:53 +0100 Subject: [PATCH 2/5] Remove coercion in write_rated --- rslib/src/search/parser.rs | 2 +- rslib/src/search/sqlwriter.rs | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/rslib/src/search/parser.rs b/rslib/src/search/parser.rs index ea0ff441b..0e9d343df 100644 --- a/rslib/src/search/parser.rs +++ b/rslib/src/search/parser.rs @@ -320,7 +320,7 @@ fn parse_added(s: &str) -> ParseResult> { fn parse_edited(s: &str) -> ParseResult> { let n: u32 = s.parse()?; let days = n.max(1); - Ok(SearchNode::EditedInDays(n)) + Ok(SearchNode::EditedInDays(days)) } /// eg is:due diff --git a/rslib/src/search/sqlwriter.rs b/rslib/src/search/sqlwriter.rs index a29502d63..553039271 100644 --- a/rslib/src/search/sqlwriter.rs +++ b/rslib/src/search/sqlwriter.rs @@ -216,8 +216,7 @@ impl SqlWriter<'_> { fn write_rated(&mut self, days: u32, ease: Option) -> Result<()> { let today_cutoff = self.col.timing_today()?.next_day_at; - let days = days.min(365) as i64; - let target_cutoff_ms = (today_cutoff - 86_400 * days) * 1_000; + let target_cutoff_ms = (today_cutoff - 86_400 * i64::from(days)) * 1_000; write!( self.sql, "c.id in (select cid from revlog where id>{}", From 250b89be6048d3137575c07fa51331e03270a8d6 Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Sun, 10 Jan 2021 16:25:52 +0100 Subject: [PATCH 3/5] Adjust pyblib test_find --- pylib/tests/test_find.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pylib/tests/test_find.py b/pylib/tests/test_find.py index e7adfafec..e82163b48 100644 --- a/pylib/tests/test_find.py +++ b/pylib/tests/test_find.py @@ -193,6 +193,7 @@ def test_findCards(): assert len(col.findCards("-prop:ease>2")) > 1 # recently failed if not isNearCutoff(): + # rated assert len(col.findCards("rated:1:1")) == 0 assert len(col.findCards("rated:1:2")) == 0 c = col.sched.getCard() @@ -204,13 +205,14 @@ def test_findCards(): assert len(col.findCards("rated:1:1")) == 1 assert len(col.findCards("rated:1:2")) == 1 assert len(col.findCards("rated:1")) == 2 - assert len(col.findCards("rated:0:2")) == 0 assert len(col.findCards("rated:2:2")) == 1 + assert len(col.findCards("rated:0")) == len(col.findCards("rated:1")) + # added - assert len(col.findCards("added:0")) == 0 col.db.execute("update cards set id = id - 86400*1000 where id = ?", id) assert len(col.findCards("added:1")) == col.cardCount() - 1 assert len(col.findCards("added:2")) == col.cardCount() + assert len(col.findCards("added:0")) == len(col.findCards("added:1")) else: print("some find tests disabled near cutoff") # empty field From adf969d37f36cb6975304a1aa68507d112db7c14 Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Sun, 10 Jan 2021 16:29:10 +0100 Subject: [PATCH 4/5] Add a few rslib unit tests --- rslib/src/search/sqlwriter.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rslib/src/search/sqlwriter.rs b/rslib/src/search/sqlwriter.rs index 553039271..41b2c02d0 100644 --- a/rslib/src/search/sqlwriter.rs +++ b/rslib/src/search/sqlwriter.rs @@ -637,6 +637,10 @@ mod test { s(ctx, "added:3").0, format!("(c.id > {})", (timing.next_day_at - (86_400 * 3)) * 1_000) ); + assert_eq!( + s(ctx, "added:0").0, + s(ctx, "added:1").0, + ); // deck assert_eq!( @@ -727,6 +731,10 @@ mod test { (timing.next_day_at - (86_400 * 365)) * 1_000 ) ); + assert_eq!( + s(ctx, "rated:0").0, + s(ctx, "rated:1").0 + ); // props assert_eq!(s(ctx, "prop:lapses=3").0, "(lapses = 3)".to_string()); From 0b955c369958222d5554a5da6ae73ef37a7a3f72 Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Sun, 10 Jan 2021 16:38:20 +0100 Subject: [PATCH 5/5] Fix formatting --- rslib/src/search/sqlwriter.rs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/rslib/src/search/sqlwriter.rs b/rslib/src/search/sqlwriter.rs index 41b2c02d0..caac139e9 100644 --- a/rslib/src/search/sqlwriter.rs +++ b/rslib/src/search/sqlwriter.rs @@ -637,10 +637,7 @@ mod test { s(ctx, "added:3").0, format!("(c.id > {})", (timing.next_day_at - (86_400 * 3)) * 1_000) ); - assert_eq!( - s(ctx, "added:0").0, - s(ctx, "added:1").0, - ); + assert_eq!(s(ctx, "added:0").0, s(ctx, "added:1").0,); // deck assert_eq!( @@ -731,10 +728,7 @@ mod test { (timing.next_day_at - (86_400 * 365)) * 1_000 ) ); - assert_eq!( - s(ctx, "rated:0").0, - s(ctx, "rated:1").0 - ); + assert_eq!(s(ctx, "rated:0").0, s(ctx, "rated:1").0); // props assert_eq!(s(ctx, "prop:lapses=3").0, "(lapses = 3)".to_string());