]> Sergey Matveev's repositories - public-inbox.git/commitdiff
smsg: remove remaining accessor methods
authorEric Wong <e@yhbt.net>
Mon, 1 Jun 2020 10:06:56 +0000 (10:06 +0000)
committerEric Wong <e@yhbt.net>
Wed, 3 Jun 2020 04:04:21 +0000 (04:04 +0000)
We'll continue to favor simpler data models that can be
used directly rather than wasting time and memory with
accessor APIs.

The ->from, ->to, -cc, ->mid, ->subject, >references methods can
all be trivially replaced by hash lookups since all their values
are stored in doc_data.  Most remaining callers of those methods
were test cases, anyways.

->from_name is only used in the PSGI code, so we can just
use ->psgi_cull to take care of populating the {from_name}
field.

lib/PublicInbox/ExtMsg.pm
lib/PublicInbox/Mbox.pm
lib/PublicInbox/NNTP.pm
lib/PublicInbox/OverIdx.pm
lib/PublicInbox/Smsg.pm
t/altid.t
t/altid_v2.t
t/search.t
t/v2writable.t

index 1d17c2ce673c230ecfe69fbdaf0a0008be7abaa1..d7917b34fb420788d64ea6bdbbd68dc1d8e4d436 100644 (file)
@@ -30,7 +30,7 @@ our @EXT_URL = map { ascii_html($_) } (
 sub PARTIAL_MAX () { 100 }
 
 sub mids_from_mset { # Search::retry_reopen callback
-       [ map { PublicInbox::Smsg::from_mitem($_)->mid } $_[0]->items ];
+       [ map { PublicInbox::Smsg::from_mitem($_)->{mid} } $_[0]->items ];
 }
 
 sub search_partial ($$) {
index 94e61d4d2ffdd99b3a5c5a9b2d14f2ca5bbfc1d5..b46dacfdc8835e70a63b5ec591db40487385d9bf 100644 (file)
@@ -151,7 +151,7 @@ sub thread_mbox {
        return [404, [qw(Content-Type text/plain)], []] if !@$msgs;
        $ctx->{prev} = $msgs->[-1];
        $ctx->{over} = $over; # bump refcnt
-       PublicInbox::MboxGz->response($ctx, \&thread_cb, $msgs->[0]->subject);
+       PublicInbox::MboxGz->response($ctx, \&thread_cb, $msgs->[0]->{subject});
 }
 
 sub emit_range {
index a37910d173966bc3b31307077b08101e8e7e9fab..ac13c7df8ceadef40695c944bc14846c1d09f0eb 100644 (file)
@@ -296,7 +296,7 @@ sub newnews_i {
        my $msgs = $over->query_ts($ts, $$prev);
        if (scalar @$msgs) {
                more($self, '<' .
-                       join(">\r\n<", map { $_->mid } @$msgs ).
+                       join(">\r\n<", map { $_->{mid} } @$msgs ).
                        '>');
                $$prev = $msgs->[-1]->{num};
        } else {
index a078f80451fbc06407938e82494d0030bcfcc41f..c7f45a6c910a91b98ca3500c0b06ed5e4a8c35c5 100644 (file)
@@ -257,7 +257,7 @@ sub add_overview {
        my $hdr = $mime->header_obj;
        my $mids = mids_for_index($hdr);
        my $refs = parse_references($smsg, $hdr, $mids);
-       my $subj = $smsg->subject;
+       my $subj = $smsg->{subject};
        my $xpath;
        if ($subj ne '') {
                $xpath = subject_path($subj);
index a7ee2e409391d4729d800b45c31d20563ff29fe6..e8f9c9a3681bd8519997e77729a06949e6ba5ce6 100644 (file)
@@ -28,7 +28,7 @@ sub to_doc_data {
        join("\n",
                $self->{subject},
                $self->{from},
-               $self->references,
+               $self->{references} // '',
                $self->{to},
                $self->{cc},
                $self->{blob},
@@ -74,11 +74,15 @@ sub load_expand {
 
 sub psgi_cull ($) {
        my ($self) = @_;
-       from_name($self); # fill in {from_name} so we can delete {from}
+
+       # ghosts don't have ->{from}
+       my $from = delete($self->{from}) // '';
+       my @n = PublicInbox::Address::names($from);
+       $self->{from_name} = join(', ', @n);
 
        # drop NNTP-only fields which aren't relevant to PSGI results:
        # saves ~80K on a 200 item search result:
-       delete @$self{qw(from ts to cc bytes lines)};
+       delete @$self{qw(ts to cc bytes lines)};
        $self;
 }
 
@@ -90,11 +94,6 @@ sub from_mitem {
        psgi_cull(load_expand($self, $mitem->get_document));
 }
 
-sub __hdr ($$) {
-       my ($self, $field) = @_;
-       $self->{lc($field)};
-}
-
 # for Import and v1 non-SQLite WWW code paths
 sub populate {
        my ($self, $hdr, $v2w) = @_;
@@ -128,10 +127,6 @@ sub populate {
        $self->{mid} //= eval { mids($hdr)->[0] } // '';
 }
 
-sub subject ($) { __hdr($_[0], 'Subject') }
-sub to ($) { __hdr($_[0], 'To') }
-sub cc ($) { __hdr($_[0], 'Cc') }
-
 # no strftime, that is locale-dependent and not for RFC822
 my @DoW = qw(Sun Mon Tue Wed Thu Fri Sat);
 my @MoY = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
@@ -146,32 +141,6 @@ sub date ($) {
 
 }
 
-sub from ($) {
-       my ($self) = @_;
-       my $from = __hdr($self, 'From');
-       if (defined $from && !defined $self->{from_name}) {
-               my @n = PublicInbox::Address::names($from);
-               $self->{from_name} = join(', ', @n);
-       }
-       $from;
-}
-
-sub from_name {
-       my ($self) = @_;
-       my $from_name = $self->{from_name};
-       return $from_name if defined $from_name;
-       $self->from;
-       $self->{from_name};
-}
-
-sub references {
-       my ($self) = @_;
-       my $x = $self->{references};
-       defined $x ? $x : '';
-}
-
-sub mid { $_[0]->{mid} }
-
 our $REPLY_RE = qr/^re:\s+/i;
 
 sub subject_normalized ($) {
index 670a39633755149c3260bb5c3b7470e1fabfeb3e..f3c01520c6db9afbb4cb0442d73ce6bfa282b8bc 100644 (file)
--- a/t/altid.t
+++ b/t/altid.t
@@ -47,7 +47,8 @@ EOF
 {
        my $ro = PublicInbox::Search->new($ibx);
        my $msgs = $ro->query("gmane:1234");
-       is_deeply([map { $_->mid } @$msgs], ['a@example.com'], 'got one match');
+       $msgs = [ map { $_->{mid} } @$msgs ];
+       is_deeply($msgs, ['a@example.com'], 'got one match');
 
        $msgs = $ro->query("gmane:666");
        is_deeply([], $msgs, 'body did NOT match');
index 28a047d992eff345fe10d1c0dc85a72b1cf9b2a6..01ed9ed48dbc377a56bf9bf8c8265142faa62b37 100644 (file)
@@ -42,7 +42,8 @@ EOF
 $v2w->done;
 
 my $msgs = $ibx->search->reopen->query("gmane:1234");
-is_deeply([map { $_->mid } @$msgs], ['a@example.com'], 'got one match');
+$msgs = [ map { $_->{mid} } @$msgs ];
+is_deeply($msgs, ['a@example.com'], 'got one match');
 $msgs = $ibx->search->query("gmane:666");
 is_deeply([], $msgs, 'body did NOT match');
 
index 9d74f5e0532d281c4702f879473e155c901ed29a..6cf2bc2d6b428938d1cb2ab6c9f7c355cc540f8d 100644 (file)
@@ -92,7 +92,7 @@ EOF
 
 sub filter_mids {
        my ($msgs) = @_;
-       sort(map { $_->mid } @$msgs);
+       sort(map { $_->{mid} } @$msgs);
 }
 
 {
@@ -100,7 +100,7 @@ sub filter_mids {
        $ro->reopen;
        my $found = $ro->query('m:root@s');
        is(scalar(@$found), 1, "message found");
-       is($found->[0]->mid, 'root@s', 'mid set correctly') if scalar(@$found);
+       is($found->[0]->{mid}, 'root@s', 'mid set correctly') if @$found;
 
        my ($res, @res);
        my @exp = sort qw(root@s last@s);
@@ -176,7 +176,7 @@ EOF
        # body
        $res = $ro->query('goodbye');
        is(scalar(@$res), 1, "goodbye message found");
-       is($res->[0]->mid, 'last@s', 'got goodbye message body') if scalar(@$res);
+       is($res->[0]->{mid}, 'last@s', 'got goodbye message body') if @$res;
 
        # datestamp
        $res = $ro->query('dt:20101002000001..20101002000001');
@@ -257,12 +257,13 @@ fade
 EOF
        my $res = $rw->query("theatre");
        is(scalar(@$res), 2, "got both matches");
-       is($res->[0]->mid, 'nquote@a', "non-quoted scores higher") if scalar(@$res);
-       is($res->[1]->mid, 'quote@a', "quoted result still returned") if scalar(@$res);
-
+       if (@$res == 2) {
+               is($res->[0]->{mid}, 'nquote@a', 'non-quoted scores higher');
+               is($res->[1]->{mid}, 'quote@a', 'quoted result still returned');
+       }
        $res = $rw->query("illusions");
        is(scalar(@$res), 1, "got a match for quoted text");
-       is($res->[0]->mid, 'quote@a',
+       is($res->[0]->{mid}, 'quote@a',
                "quoted result returned if nothing else") if scalar(@$res);
 });
 
@@ -283,8 +284,10 @@ EOF
        ok($doc_id > 0, "doc_id defined with circular reference");
        my $smsg = $rw->query('m:circle@a', {limit=>1})->[0];
        is(defined($smsg), 1, 'found m:circl@a');
-       is($smsg->references, '', "no references created") if defined($smsg);
-       is($smsg->subject, $s, 'long subject not rewritten') if defined($smsg);
+       if (defined $smsg) {
+               is($smsg->{references}, '', "no references created");
+               is($smsg->{subject}, $s, 'long subject not rewritten');
+       }
 });
 
 $ibx->with_umask(sub {
@@ -293,7 +296,10 @@ $ibx->with_umask(sub {
        ok($doc_id > 0, 'message indexed doc_id with UTF-8');
        my $msg = $rw->query('m:testmessage@example.com', {limit => 1})->[0];
        is(defined($msg), 1, 'found testmessage@example.com');
-       is($mime->header('Subject'), $msg->subject, 'UTF-8 subject preserved') if defined($msg);
+       if (defined $msg) {
+               is($mime->header('Subject'), $msg->{subject},
+                       'UTF-8 subject preserved');
+       }
 });
 
 {
@@ -311,14 +317,14 @@ $ibx->with_umask(sub {
        is($mset->size, 6, 'searched To: successfully');
        foreach my $m ($mset->items) {
                my $smsg = $ro->{over_ro}->get_art($m->get_docid);
-               like($smsg->to, qr/\blist\@example\.com\b/, 'to appears');
+               like($smsg->{to}, qr/\blist\@example\.com\b/, 'to appears');
        }
 
        $mset = $ro->query('tc:list@example.com', {mset => 1});
        is($mset->size, 6, 'searched To+Cc: successfully');
        foreach my $m ($mset->items) {
                my $smsg = $ro->{over_ro}->get_art($m->get_docid);
-               my $tocc = join("\n", $smsg->to, $smsg->cc);
+               my $tocc = join("\n", $smsg->{to}, $smsg->{cc});
                like($tocc, qr/\blist\@example\.com\b/, 'tocc appears');
        }
 
@@ -327,7 +333,7 @@ $ibx->with_umask(sub {
                is($mset->items, 1, "searched $pfx successfully for Cc:");
                foreach my $m ($mset->items) {
                        my $smsg = $ro->{over_ro}->get_art($m->get_docid);
-                       like($smsg->cc, qr/\bfoo\@example\.com\b/,
+                       like($smsg->{cc}, qr/\bfoo\@example\.com\b/,
                                'cc appears');
                }
        }
@@ -337,7 +343,7 @@ $ibx->with_umask(sub {
                is(scalar(@$res), 1,
                        "searched $pfx successfully for From:");
                foreach my $smsg (@$res) {
-                       like($smsg->from_name, qr/Laggy Sender/,
+                       like($smsg->{from_name}, qr/Laggy Sender/,
                                "From appears with $pfx");
                }
        }
@@ -354,18 +360,18 @@ $ibx->with_umask(sub {
 
        $res = $ro->query('q:theatre');
        is(scalar(@$res), 1, 'only one quoted body');
-       like($res->[0]->from_name, qr/\AQuoter/,
+       like($res->[0]->{from_name}, qr/\AQuoter/,
                'got quoted body') if (scalar(@$res));
 
        $res = $ro->query('nq:theatre');
        is(scalar @$res, 1, 'only one non-quoted body');
-       like($res->[0]->from_name, qr/\ANon-Quoter/,
+       like($res->[0]->{from_name}, qr/\ANon-Quoter/,
                'got non-quoted body') if (scalar(@$res));
 
        foreach my $pfx (qw(b: bs:)) {
                $res = $ro->query($pfx . 'theatre');
                is(scalar @$res, 2, "searched both bodies for $pfx");
-               like($res->[0]->from_name, qr/\ANon-Quoter/,
+               like($res->[0]->{from_name}, qr/\ANon-Quoter/,
                        "non-quoter first for $pfx") if scalar(@$res);
        }
 }
@@ -379,16 +385,16 @@ $ibx->with_umask(sub {
        is(scalar @$n, 1, 'got result for n:');
        my $res = $ro->query('part_deux.txt');
        is(scalar @$res, 1, 'got result without n:');
-       is($n->[0]->mid, $res->[0]->mid,
+       is($n->[0]->{mid}, $res->[0]->{mid},
                'same result with and without') if scalar(@$res);
        my $txt = $ro->query('"inside another"');
        is(scalar @$txt, 1, 'found inside another');
-       is($txt->[0]->mid, $res->[0]->mid,
+       is($txt->[0]->{mid}, $res->[0]->{mid},
                'search inside text attachments works') if scalar(@$txt);
 
        my $art;
        if (scalar(@$n) >= 1) {
-               my $mid = $n->[0]->mid;
+               my $mid = $n->[0]->{mid};
                my ($id, $prev);
                $art = $ro->{over_ro}->next_by_mid($mid, \$id, \$prev);
                ok($art, 'article exists in OVER DB');
index fa5c786e151112fb2f03a4ed863be8b47bead16b..2bd7a40097811ea5f79a938f581461e56a46dc1c 100644 (file)
@@ -224,12 +224,13 @@ EOF
        like($tip, qr/\A[a-f0-9]+ test removal\n\z/s,
                'commit message propagated to git');
        is_deeply(\@after, \@before, 'only one commit written to git');
-       is($ibx->mm->num_for($smsg->mid), undef, 'no longer in Msgmap by mid');
+       my $mid = $smsg->{mid};
+       is($ibx->mm->num_for($mid), undef, 'no longer in Msgmap by mid');
        my $num = $smsg->{num};
        like($num, qr/\A\d+\z/, 'numeric number in return message');
        is($ibx->mm->mid_for($num), undef, 'no longer in Msgmap by num');
        my $srch = $ibx->search->reopen;
-       my $mset = $srch->query('m:'.$smsg->mid, { mset => 1});
+       my $mset = $srch->query('m:'.$mid, { mset => 1});
        is($mset->size, 0, 'no longer found in Xapian');
        my @log1 = (@log, qw(-1 --pretty=raw --raw -r --no-renames));
        is($srch->{over_ro}->get_art($num), undef,