- Search::Xapian::sortable_unserialise($doc->get_value($col));
-}
-
-sub load_doc {
- my ($class, $doc) = @_;
- my $data = $doc->get_data;
- my $ts = get_val($doc, &PublicInbox::Search::TS);
- $data = $enc_utf8->decode($data);
- my ($subj, $from, $refs, $to, $cc) = split(/\n/, $data);
- bless {
- doc => $doc,
- subject => $subj,
- ts => $ts,
- from => $from,
- references => $refs,
- to => $to,
- cc => $cc,
- }, $class;
+ # sortable_unserialise is defined by PublicInbox::Search::load_xapian()
+ sortable_unserialise($doc->get_value($col));
+}
+
+sub to_doc_data {
+ my ($self, $oid, $mid0) = @_;
+ $oid = '' unless defined $oid;
+ join("\n",
+ $self->subject,
+ $self->from,
+ $self->references,
+ $self->to,
+ $self->cc,
+ $oid,
+ $mid0,
+ $self->{bytes} || '',
+ $self->{lines} || ''
+ );
+}
+
+sub load_from_data ($$) {
+ my ($self) = $_[0]; # data = $_[1]
+ (
+ $self->{subject},
+ $self->{from},
+ $self->{references},
+
+ # To: and Cc: are stored to optimize HDR/XHDR in NNTP since
+ # some NNTP clients will use that for message displays.
+ # NNTP only, and only stored in Over(view), not Xapian
+ $self->{to},
+ $self->{cc},
+
+ $self->{blob},
+ $self->{mid},
+
+ # NNTP only
+ $self->{bytes},
+ $self->{lines}
+ ) = split(/\n/, $_[1]);
+}
+
+sub load_expand {
+ my ($self, $doc) = @_;
+ my $data = $doc->get_data or return;
+ $self->{ts} = get_val($doc, PublicInbox::Search::TS());
+ my $dt = get_val($doc, PublicInbox::Search::DT());
+ my ($yyyy, $mon, $dd, $hh, $mm, $ss) = unpack('A4A2A2A2A2A2', $dt);
+ $self->{ds} = timegm($ss, $mm, $hh, $dd, $mon - 1, $yyyy);
+ utf8::decode($data);
+ load_from_data($self, $data);
+ $self;
+}
+
+sub psgi_cull ($) {
+ my ($self) = @_;
+ from_name($self); # fill in {from_name} so we can delete {from}
+
+ # 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)};
+ $self;
+}
+
+# Only called by PSGI interface, not NNTP
+sub from_mitem {
+ my ($mitem, $srch) = @_;
+ return $srch->retry_reopen(\&from_mitem, $mitem) if $srch;
+ my $self = bless {}, __PACKAGE__;
+ psgi_cull(load_expand($self, $mitem->get_document));