Add search keyword introduced

Filters for cards that had their first review within the last x days.
This commit is contained in:
RumovZ 2021-04-18 12:14:18 +02:00
parent 262b50445c
commit 5ec2e11de3
3 changed files with 22 additions and 0 deletions

View file

@ -73,6 +73,7 @@ pub enum SearchNode {
CardTemplate(TemplateKind),
Deck(String),
DeckId(DeckId),
IntroducedInDays(u32),
NotetypeId(NotetypeId),
Notetype(String),
Rated {
@ -333,6 +334,7 @@ fn search_node_for_text_with_argument<'a>(
"prop" => parse_prop(val)?,
"added" => parse_added(val)?,
"edited" => parse_edited(val)?,
"introduced" => parse_introduced(val)?,
"rated" => parse_rated(val)?,
"is" => parse_state(val)?,
"did" => parse_did(val)?,
@ -527,6 +529,11 @@ fn parse_edited(s: &str) -> ParseResult<SearchNode> {
parse_u32(s, "edited:").map(|n| SearchNode::EditedInDays(n.max(1)))
}
/// eg introduced:1
fn parse_introduced(s: &str) -> ParseResult<SearchNode> {
parse_u32(s, "introduced:").map(|n| SearchNode::IntroducedInDays(n.max(1)))
}
/// eg rated:3 or rated:10:2
/// second arg must be between 1-4
fn parse_rated(s: &str) -> ParseResult<SearchNode> {

View file

@ -128,6 +128,7 @@ impl SqlWriter<'_> {
// other
SearchNode::AddedInDays(days) => self.write_added(*days)?,
SearchNode::EditedInDays(days) => self.write_edited(*days)?,
SearchNode::IntroducedInDays(days) => self.write_introduced(*days)?,
SearchNode::CardTemplate(template) => match template {
TemplateKind::Ordinal(_) => self.write_template(template),
TemplateKind::Name(name) => {
@ -492,6 +493,18 @@ impl SqlWriter<'_> {
Ok(())
}
fn write_introduced(&mut self, days: u32) -> Result<()> {
let timing = self.col.timing_today()?;
let cutoff = (timing.next_day_at.0 - (86_400 * (days as i64))) * 1_000;
write!(
self.sql,
"(select min(id) > {} from revlog where cid = c.id)",
cutoff
)
.unwrap();
Ok(())
}
fn write_regex(&mut self, word: &str) {
self.sql.push_str("n.flds regexp ?");
self.args.push(format!(r"(?i){}", word));
@ -546,6 +559,7 @@ impl SearchNode {
fn required_table(&self) -> RequiredTable {
match self {
SearchNode::AddedInDays(_) => RequiredTable::Cards,
SearchNode::IntroducedInDays(_) => RequiredTable::Cards,
SearchNode::Deck(_) => RequiredTable::Cards,
SearchNode::DeckId(_) => RequiredTable::Cards,
SearchNode::Rated { .. } => RequiredTable::Cards,

View file

@ -83,6 +83,7 @@ fn write_search_node(node: &SearchNode) -> String {
SingleField { field, text, is_re } => write_single_field(field, text, *is_re),
AddedInDays(u) => format!("added:{}", u),
EditedInDays(u) => format!("edited:{}", u),
IntroducedInDays(u) => format!("introduced:{}", u),
CardTemplate(t) => write_template(t),
Deck(s) => maybe_quote(&format!("deck:{}", s)),
DeckId(DeckIdType(i)) => format!("did:{}", i),