]> Sergey Matveev's repositories - public-inbox.git/commitdiff
search: expand "d:" to "dt:" for precision with approxidate
authorEric Wong <e@80x24.org>
Fri, 16 Apr 2021 23:43:06 +0000 (18:43 -0500)
committerEric Wong <e@80x24.org>
Sat, 17 Apr 2021 02:24:44 +0000 (22:24 -0400)
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.

v2: fix "d:YYYYMMDD..$NEEDS_APPROXIDATE" case

lib/PublicInbox/Search.pm
t/search.t

index ab04d43023e777efa5c987dc481191de446431b6..fbcff2c38fff410ab81f399901e14af3b55841c4 100644 (file)
@@ -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,27 @@ 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') {
+                               for (@r) {
+                                       s/\0%Y%m%d/\0%Y%m%d%H%M%S/;
+                                       s/\A([0-9]{8})\z/${1}000000/;
+                               }
                        }
                }
        } elsif ($pfx eq 'dt') {
index 124c9acfdf18c74ec5d6ea532cfb6b2b431c7e62..47a67f7fb5e94eace65f3bf3d30a68232da7c2fa 100644 (file)
@@ -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,13 @@ 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');
+
+       $orig = $qs = 'd:20101002..now';
+       $s->query_approxidate($g, $qs);
+       like($qs, qr/\Adt:20101002000000\.\.[0-9]{14}\z/,
+               'approxidate on range-end only');
 
        $ENV{TEST_EXPENSIVE} or
                skip 'TEST_EXPENSIVE not set for argv overflow check', 1;