From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-3.9 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 1E4A91F990 for ; Thu, 6 Aug 2020 21:43:47 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] imap: search support BODY key Date: Thu, 6 Aug 2020 21:43:46 +0000 Message-Id: <20200806214346.1221-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: This is specified in RFC 3501 but was accidentally omitted :x I probably got it confused with TEXT, so add a comment about TEXT being "everything" in the message. --- lib/PublicInbox/IMAPsearchqp.pm | 3 +++ t/imap_searchqp.t | 3 +++ 2 files changed, 6 insertions(+) diff --git a/lib/PublicInbox/IMAPsearchqp.pm b/lib/PublicInbox/IMAPsearchqp.pm index 4ea99ea5..5c82faa5 100644 --- a/lib/PublicInbox/IMAPsearchqp.pm +++ b/lib/PublicInbox/IMAPsearchqp.pm @@ -18,6 +18,7 @@ my %MM = map {; $MoY[$_-1] => sprintf('%02u', $_) } (1..12); my %IH2X = ( SUBJECT => 's:', BODY => 'b:', + # TEXT => undef, # => everything FROM => 'f:', TO => 't:', CC => 'c:', @@ -182,6 +183,7 @@ search_key1 : "ALL" | "RECENT" | "UNSEEN" | "NEW" | CC_string | BCC_string | SUBJECT_string + | BODY_string | TEXT_string | UID_set | MSN_set @@ -239,6 +241,7 @@ TO_string : "TO" string { $q->ih2x('TO', $item{string}) } CC_string : "CC" string { $q->ih2x('CC', $item{string}) } BCC_string : "BCC" string { $q->ih2x('BCC', $item{string}) } SUBJECT_string : "SUBJECT" string { $q->ih2x('SUBJECT', $item{string}) } +BODY_string : "BODY" string { $q->ih2x('BODY', $item{string}) } TEXT_string : "TEXT" string { $q->ih2x(undef, $item{string}) } op_subq_enter : '(' { $q->subq_enter } sub_query : op_subq_enter search_key1(s) ')' { $q->subq_leave } diff --git a/t/imap_searchqp.t b/t/imap_searchqp.t index d62f314a..adf7b205 100644 --- a/t/imap_searchqp.t +++ b/t/imap_searchqp.t @@ -14,6 +14,9 @@ my $imap = bless {}, 'PublicInbox::IMAP'; my $q; my $parse = sub { PublicInbox::IMAPsearchqp::parse($imap, $_[0]) }; +$q = $parse->(qq{BODY oops}); +is($q->{xap}, 'b:"oops"', 'BODY key supported'); + $q = $parse->(qq{OR HEADER TO Brian (OR FROM Ryan (OR TO Joe CC Scott))}); is($q->{sql}, undef, 'not using SQLite for complex query'); is($q->{xap}, '(t:"brian" OR (f:"ryan" OR (t:"joe" OR c:"scott")))',