diff --git a/rslib/src/search/parser.rs b/rslib/src/search/parser.rs index c58e90b90..fe0b6b3cc 100644 --- a/rslib/src/search/parser.rs +++ b/rslib/src/search/parser.rs @@ -358,7 +358,7 @@ fn parse_flag(s: &str) -> ParseResult> { } /// eg rated:3 or rated:10:2 -/// second arg must be between 0-4 +/// second arg must be between 1-4 fn parse_rated(val: &str) -> ParseResult> { let mut it = val.splitn(2, ':'); @@ -383,7 +383,10 @@ fn parse_rated(val: &str) -> ParseResult> { /// eg resched:3 fn parse_resched(val: &str) -> ParseResult> { let mut it = val.splitn(1, ':'); - let days = it.next().unwrap().parse()?; + + let n: u32 = it.next().unwrap().parse()?; + let days = n.max(1).min(365); + let ease = EaseKind::Manually; Ok(SearchNode::Rated { days, ease }) diff --git a/rslib/src/search/sqlwriter.rs b/rslib/src/search/sqlwriter.rs index 3b63c2472..2dafd9386 100644 --- a/rslib/src/search/sqlwriter.rs +++ b/rslib/src/search/sqlwriter.rs @@ -732,6 +732,15 @@ mod test { ); assert_eq!(s(ctx, "rated:0").0, s(ctx, "rated:1").0); + // resched + assert_eq!( + s(ctx, "resched:400").0, + format!( + "(c.id in (select cid from revlog where id>{} and ease = 0))", + (timing.next_day_at - (86_400 * 365)) * 1_000 + ) + ); + // props assert_eq!(s(ctx, "prop:lapses=3").0, "(lapses = 3)".to_string()); assert_eq!(s(ctx, "prop:ease>=2.5").0, "(factor >= 2500)".to_string());