]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Search.pm
search: remove unnecessary abstractions and functionality
[public-inbox.git] / lib / PublicInbox / Search.pm
index 86354b571f88541fe2d271c92c220204a151bf97..67837f4f77300e6ef76333c623cb07eeca24ea30 100644 (file)
@@ -16,7 +16,7 @@ use constant YYYYMMDD => 4; # for searching in the WWW UI
 
 use Search::Xapian qw/:standard/;
 use PublicInbox::SearchMsg;
-use Email::MIME;
+use PublicInbox::MIME;
 use PublicInbox::MID qw/mid_clean id_compress/;
 
 # This is English-only, everything else is non-standard and may be confused as
@@ -39,7 +39,10 @@ use constant {
        # 10 - optimize doc for NNTP overviews
        # 11 - merge threads when vivifying ghosts
        # 12 - change YYYYMMDD value column to numeric
-       SCHEMA_VERSION => 12,
+       # 13 - fix threading for empty References/In-Reply-To
+       #      (commit 83425ef12e4b65cdcecd11ddcb38175d4a91d5a0)
+       # 14 - fix ghost root vivification
+       SCHEMA_VERSION => 14,
 
        # n.b. FLAG_PURE_NOT is expensive not suitable for a public website
        # as it could become a denial-of-service vector
@@ -53,8 +56,6 @@ my %bool_pfx_internal = (
 );
 
 my %bool_pfx_external = (
-       # do we still need these? probably not..
-       path => 'XPATH',
        mid => 'Q', # uniQue id (Message-ID)
 );
 
@@ -89,7 +90,7 @@ are also supported
 EOF
        'b:' => 'match within message body, including text attachments',
        'nq:' => 'match non-quoted text within message body',
-       'quot:' => 'match quoted text within message body',
+       'q:' => 'match quoted text within message body',
        'n:' => 'match filename of attachment(s)',
        't:' => 'match within the To header',
        'c:' => 'match within the Cc header',
@@ -104,11 +105,7 @@ chomp @HELP;
 # da (diff a/ removed lines)
 # db (diff b/ added lines)
 
-my %all_pfx = (%bool_pfx_internal, %bool_pfx_external, %prob_prefix);
-
-sub xpfx { $all_pfx{$_[0]} }
-
-my $mail_query = Search::Xapian::Query->new(xpfx('type') . 'mail');
+my $mail_query = Search::Xapian::Query->new('T' . 'mail');
 
 sub xdir {
        my (undef, $git_dir) = @_;
@@ -143,11 +140,11 @@ sub get_thread {
        my $smsg = eval { $self->lookup_message($mid) };
 
        return { total => 0, msgs => [] } unless $smsg;
-       my $qtid = Search::Xapian::Query->new(xpfx('thread').$smsg->thread_id);
+       my $qtid = Search::Xapian::Query->new('G' . $smsg->thread_id);
        my $path = $smsg->path;
        if (defined $path && $path ne '') {
                my $path = id_compress($smsg->path);
-               my $qsub = Search::Xapian::Query->new(xpfx('path').$path);
+               my $qsub = Search::Xapian::Query->new('XPATH' . $path);
                $qtid = Search::Xapian::Query->new(OP_OR, $qtid, $qsub);
        }
        $opts ||= {};
@@ -276,7 +273,7 @@ sub lookup_message {
        my ($self, $mid) = @_;
        $mid = mid_clean($mid);
 
-       my $doc_id = $self->find_unique_doc_id('mid', $mid);
+       my $doc_id = $self->find_unique_doc_id('Q' . $mid);
        my $smsg;
        if (defined $doc_id) {
                # raises on error:
@@ -296,9 +293,9 @@ sub lookup_mail { # no ghosts!
 }
 
 sub find_unique_doc_id {
-       my ($self, $term, $value) = @_;
+       my ($self, $termval) = @_;
 
-       my ($begin, $end) = $self->find_doc_ids($term, $value);
+       my ($begin, $end) = $self->find_doc_ids($termval);
 
        return undef if $begin->equal($end); # not found
 
@@ -306,26 +303,20 @@ sub find_unique_doc_id {
 
        # sanity check
        $begin->inc;
-       $begin->equal($end) or die "Term '$term:$value' is not unique\n";
+       $begin->equal($end) or die "Term '$termval' is not unique\n";
        $rv;
 }
 
 # returns begin and end PostingIterator
 sub find_doc_ids {
-       my ($self, $term, $value) = @_;
-
-       $self->find_doc_ids_for_term(xpfx($term) . $value);
-}
-
-# returns begin and end PostingIterator
-sub find_doc_ids_for_term {
-       my ($self, $term) = @_;
+       my ($self, $termval) = @_;
        my $db = $self->{xdb};
 
-       ($db->postlist_begin($term), $db->postlist_end($term));
+       ($db->postlist_begin($termval), $db->postlist_end($termval));
 }
 
 # normalize subjects so they are suitable as pathnames for URLs
+# XXX: consider for removal
 sub subject_path {
        my $subj = pop;
        $subj = subject_normalized($subj);
@@ -343,32 +334,6 @@ sub subject_normalized {
        $subj;
 }
 
-# for doc data
-sub subject_summary {
-       my $subj = pop;
-       my $max = 68;
-       if (length($subj) > $max) {
-               my @subj = split(/\s+/, $subj);
-               $subj = '';
-               my $l;
-
-               while ($l = shift @subj) {
-                       my $new = $subj . $l . ' ';
-                       last if length($new) >= $max;
-                       $subj = $new;
-               }
-               if ($subj ne '') {
-                       my $r = scalar @subj ? ' ...' : '';
-                       $subj =~ s/ \z/$r/s;
-               } else {
-                       # subject has one REALLY long word, and NOT spam? wtf
-                       @subj = ($l =~ /\A(.{1,72})/);
-                       $subj = $subj[0] . ' ...';
-               }
-       }
-       $subj;
-}
-
 sub enquire {
        my ($self) = @_;
        $self->{enquire} ||= Search::Xapian::Enquire->new($self->{xdb});