mirror of
https://github.com/ankitects/anki.git
synced 2025-09-19 06:22:22 -04:00
Add search keyword introduced
Filters for cards that had their first review within the last x days.
This commit is contained in:
parent
262b50445c
commit
5ec2e11de3
3 changed files with 22 additions and 0 deletions
|
@ -73,6 +73,7 @@ pub enum SearchNode {
|
||||||
CardTemplate(TemplateKind),
|
CardTemplate(TemplateKind),
|
||||||
Deck(String),
|
Deck(String),
|
||||||
DeckId(DeckId),
|
DeckId(DeckId),
|
||||||
|
IntroducedInDays(u32),
|
||||||
NotetypeId(NotetypeId),
|
NotetypeId(NotetypeId),
|
||||||
Notetype(String),
|
Notetype(String),
|
||||||
Rated {
|
Rated {
|
||||||
|
@ -333,6 +334,7 @@ fn search_node_for_text_with_argument<'a>(
|
||||||
"prop" => parse_prop(val)?,
|
"prop" => parse_prop(val)?,
|
||||||
"added" => parse_added(val)?,
|
"added" => parse_added(val)?,
|
||||||
"edited" => parse_edited(val)?,
|
"edited" => parse_edited(val)?,
|
||||||
|
"introduced" => parse_introduced(val)?,
|
||||||
"rated" => parse_rated(val)?,
|
"rated" => parse_rated(val)?,
|
||||||
"is" => parse_state(val)?,
|
"is" => parse_state(val)?,
|
||||||
"did" => parse_did(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)))
|
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
|
/// eg rated:3 or rated:10:2
|
||||||
/// second arg must be between 1-4
|
/// second arg must be between 1-4
|
||||||
fn parse_rated(s: &str) -> ParseResult<SearchNode> {
|
fn parse_rated(s: &str) -> ParseResult<SearchNode> {
|
||||||
|
|
|
@ -128,6 +128,7 @@ impl SqlWriter<'_> {
|
||||||
// other
|
// other
|
||||||
SearchNode::AddedInDays(days) => self.write_added(*days)?,
|
SearchNode::AddedInDays(days) => self.write_added(*days)?,
|
||||||
SearchNode::EditedInDays(days) => self.write_edited(*days)?,
|
SearchNode::EditedInDays(days) => self.write_edited(*days)?,
|
||||||
|
SearchNode::IntroducedInDays(days) => self.write_introduced(*days)?,
|
||||||
SearchNode::CardTemplate(template) => match template {
|
SearchNode::CardTemplate(template) => match template {
|
||||||
TemplateKind::Ordinal(_) => self.write_template(template),
|
TemplateKind::Ordinal(_) => self.write_template(template),
|
||||||
TemplateKind::Name(name) => {
|
TemplateKind::Name(name) => {
|
||||||
|
@ -492,6 +493,18 @@ impl SqlWriter<'_> {
|
||||||
Ok(())
|
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) {
|
fn write_regex(&mut self, word: &str) {
|
||||||
self.sql.push_str("n.flds regexp ?");
|
self.sql.push_str("n.flds regexp ?");
|
||||||
self.args.push(format!(r"(?i){}", word));
|
self.args.push(format!(r"(?i){}", word));
|
||||||
|
@ -546,6 +559,7 @@ impl SearchNode {
|
||||||
fn required_table(&self) -> RequiredTable {
|
fn required_table(&self) -> RequiredTable {
|
||||||
match self {
|
match self {
|
||||||
SearchNode::AddedInDays(_) => RequiredTable::Cards,
|
SearchNode::AddedInDays(_) => RequiredTable::Cards,
|
||||||
|
SearchNode::IntroducedInDays(_) => RequiredTable::Cards,
|
||||||
SearchNode::Deck(_) => RequiredTable::Cards,
|
SearchNode::Deck(_) => RequiredTable::Cards,
|
||||||
SearchNode::DeckId(_) => RequiredTable::Cards,
|
SearchNode::DeckId(_) => RequiredTable::Cards,
|
||||||
SearchNode::Rated { .. } => RequiredTable::Cards,
|
SearchNode::Rated { .. } => RequiredTable::Cards,
|
||||||
|
|
|
@ -83,6 +83,7 @@ fn write_search_node(node: &SearchNode) -> String {
|
||||||
SingleField { field, text, is_re } => write_single_field(field, text, *is_re),
|
SingleField { field, text, is_re } => write_single_field(field, text, *is_re),
|
||||||
AddedInDays(u) => format!("added:{}", u),
|
AddedInDays(u) => format!("added:{}", u),
|
||||||
EditedInDays(u) => format!("edited:{}", u),
|
EditedInDays(u) => format!("edited:{}", u),
|
||||||
|
IntroducedInDays(u) => format!("introduced:{}", u),
|
||||||
CardTemplate(t) => write_template(t),
|
CardTemplate(t) => write_template(t),
|
||||||
Deck(s) => maybe_quote(&format!("deck:{}", s)),
|
Deck(s) => maybe_quote(&format!("deck:{}", s)),
|
||||||
DeckId(DeckIdType(i)) => format!("did:{}", i),
|
DeckId(DeckIdType(i)) => format!("did:{}", i),
|
||||||
|
|
Loading…
Reference in a new issue