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-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,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 A33EC1F4B4 for ; Fri, 16 Apr 2021 23:43:06 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] search: expand "d:" to "dt:" for precision with approxidate Date: Fri, 16 Apr 2021 18:43:06 -0500 Message-Id: <20210416234306.28897-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: If a user specifies "d:" with a higher precision than it was traditionally able to handle, switch transparently to "dt:". This lowers the learning curve and improves DWIM-ness. --- lib/PublicInbox/Search.pm | 18 +++++++++++++++--- t/search.t | 9 +++++---- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/lib/PublicInbox/Search.pm b/lib/PublicInbox/Search.pm index ab04d430..e0e8164d 100644 --- a/lib/PublicInbox/Search.pm +++ b/lib/PublicInbox/Search.pm @@ -275,7 +275,9 @@ sub date_parse_prepare { # expand "d:20101002" => "d:20101002..20101003" and like # n.b. git doesn't do YYYYMMDD w/o '-', it needs YYYY-MM-DD + # We upgrade "d:" to "dt:" to iff using approxidate if ($pfx eq 'd') { + my $fmt = "\0%Y%m%d"; if (!defined($r[1])) { if ($r[0] =~ /\A([0-9]{4})([0-9]{2})([0-9]{2})\z/) { push @$to_parse, "$1-$2-$3"; @@ -283,14 +285,24 @@ sub date_parse_prepare { # to parse anyways for "d+" below } else { push @$to_parse, $r[0]; + if ($r[0] !~ /\A[0-9]{4}-[0-9]{2}-[0-9]{2}\z/) { + $pfx = 'dt'; + $fmt = "\0%Y%m%d%H%M%S"; + } } - $r[0] = "\0%Y%m%d$#$to_parse\0"; - $r[1] = "\0%Y%m%d+\0"; + $r[0] = "$fmt+$#$to_parse\0"; + $r[1] = "$fmt+\0"; } else { for my $x (@r) { next if $x eq '' || $x =~ /\A[0-9]{8}\z/; push @$to_parse, $x; - $x = "\0%Y%m%d$#$to_parse\0"; + if ($x !~ /\A[0-9]{4}-[0-9]{2}-[0-9]{2}\z/) { + $pfx = 'dt'; + } + $x = "$fmt$#$to_parse\0"; + } + if ($pfx eq 'dt') { + s/\0%Y%m%d/\0%Y%m%d%H%M%S/ for @r; } } } elsif ($pfx eq 'dt') { diff --git a/t/search.t b/t/search.t index 124c9acf..b63a7672 100644 --- a/t/search.t +++ b/t/search.t @@ -561,9 +561,9 @@ SKIP: { is(strftime('%Y-%m-%d', gmtime($1//0)), '2010-10-02', 'rt: end expand'); $q = $s->query_argv_to_string($g, [qw(something dt:2010-10-02..)]); like($q, qr/\Asomething dt:20101002\d{6}\.\./, 'dt: expansion'); - $q = $s->query_argv_to_string($g, [qw(x d:yesterday.. y)]); - is($q, strftime('x d:%Y%m%d.. y', gmtime(time - 86400)), - '"yesterday" handled'); + $q = $s->query_argv_to_string($g, [qw(x dt:yesterday.. y)]); + my $exp = strftime('%Y%m%d', gmtime(time - 86400)); + like($q, qr/x dt:$exp[0-9]{6}\.\. y/, '"yesterday" handled'); $q = $s->query_argv_to_string($g, [qw(x dt:20101002054123)]); is($q, 'x dt:20101002054123..20101003054123', 'single dt: expanded'); $q = $s->query_argv_to_string($g, [qw(x dt:2010-10-02T05:41:23Z)]); @@ -627,7 +627,8 @@ SKIP: { my $x_days_ago = strftime('%Y%m%d', gmtime(time - (5 * 86400))); $orig = $qs = qq[broken d:5.days.ago..]; $s->query_approxidate($g, $qs); - is($qs, qq[broken d:$x_days_ago..], 'date.phrase.with.dots'); + like($qs, qr/\Abroken dt:$x_days_ago[0-9]{6}\.\./, + 'date.phrase.with.dots'); $ENV{TEST_EXPENSIVE} or skip 'TEST_EXPENSIVE not set for argv overflow check', 1;