From a3d9a25d18428b40fef6f00b33e4c769e1d71916 Mon Sep 17 00:00:00 2001 From: Abdo Date: Thu, 28 Apr 2022 07:09:51 +0300 Subject: [PATCH] Extends the SearchNode interface to support field and unqualified searches (#1821) * Add field search option to SearchNode * Add unqualified/literal search option to SearchNode * Rename text to literal_text * Interpret field name parameter literally --- proto/anki/search.proto | 8 ++++++++ rslib/src/backend/search/search_node.rs | 11 ++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/proto/anki/search.proto b/proto/anki/search.proto index 5b9280928..4048d255a 100644 --- a/proto/anki/search.proto +++ b/proto/anki/search.proto @@ -68,6 +68,12 @@ message SearchNode { repeated SearchNode nodes = 1; Joiner joiner = 2; } + message Field { + string field_name = 1; + string text = 2; + bool is_re = 3; + } + oneof filter { Group group = 1; SearchNode negated = 2; @@ -88,6 +94,8 @@ message SearchNode { string tag = 17; string note = 18; uint32 introduced_in_days = 19; + Field field = 20; + string literal_text = 21; } } diff --git a/rslib/src/backend/search/search_node.rs b/rslib/src/backend/search/search_node.rs index 469cc7391..8df1477e7 100644 --- a/rslib/src/backend/search/search_node.rs +++ b/rslib/src/backend/search/search_node.rs @@ -9,7 +9,7 @@ use crate::{ search::{ parse_search, Negated, Node, PropertyKind, RatingKind, SearchNode, StateKind, TemplateKind, }, - text::escape_anki_wildcards_for_search_node, + text::{escape_anki_wildcards, escape_anki_wildcards_for_search_node}, }; impl TryFrom for Node { @@ -98,6 +98,15 @@ impl TryFrom for Node { Node::Group(nodes) } } + Filter::Field(field) => Node::Search(SearchNode::SingleField { + field: escape_anki_wildcards(&field.field_name), + text: escape_anki_wildcards(&field.text), + is_re: field.is_re, + }), + Filter::LiteralText(text) => { + let text = escape_anki_wildcards(&text); + Node::Search(SearchNode::UnqualifiedText(text)) + } } } else { Node::Search(SearchNode::WholeCollection)