File Coverage

lib/CPAN/IndexPod.pm
Criterion Covered Total %
statement 13 15 86.6
branch n/a
condition n/a
subroutine 5 5 100.0
pod n/a
total 18 20 90.0


line stmt bran cond sub pod time code
1             package CPAN::IndexPod;
2 1     1   704 use strict;
  1         2  
  1         47  
3 1     1   6 use warnings;
  1         3  
  1         38  
4 1     1   1038 use File::Find::Rule;
  1         9449  
  1         10  
5 1     1   855 use KinoSearch;
  1         43612  
  1         59  
6 1     1   680 use KinoSearch::InvIndexer;
  0            
  0            
7             use KinoSearch::Analysis::PolyAnalyzer;
8             use KinoSearch::QueryParser::QueryParser;
9             use KinoSearch::Searcher;
10             use Pod::Simple;
11             use Pod::Simple::PullParser;
12             use base qw(Class::Accessor);
13             __PACKAGE__->mk_accessors(qw(unpacked kinosearch));
14              
15             our $VERSION = '0.25';
16              
17             sub search {
18             my ( $self, $query_string ) = @_;
19              
20             my $analyzer
21             = KinoSearch::Analysis::PolyAnalyzer->new( language => 'en' );
22              
23             my $query_parser = KinoSearch::QueryParser::QueryParser->new(
24             analyzer => $analyzer,
25             default_field => 'value',
26             default_boolop => 'OR',
27             );
28             my $searcher = KinoSearch::Searcher->new(
29             invindex => $self->kinosearch,
30             analyzer => $analyzer,
31             );
32             my $query = $query_parser->parse($query_string);
33             my $hits = $searcher->search( query => $query );
34             $hits->seek( 0, 1000 );
35              
36             my %scores;
37             while ( my $hit = $hits->fetch_hit_hashref ) {
38             my $filename = $hit->{key};
39             my $score = $hit->{score};
40             $scores{$filename} = $score;
41             }
42              
43             return sort { $scores{$b} <=> $scores{$a} || $a cmp $b } keys %scores;
44             }
45              
46             sub index {
47             my $self = shift;
48             my $unpacked = $self->unpacked;
49              
50             my $analyzer
51             = KinoSearch::Analysis::PolyAnalyzer->new( language => 'en' );
52             my $invindexer = KinoSearch::InvIndexer->new(
53             invindex => $self->kinosearch,
54             create => 1,
55             analyzer => $analyzer,
56             );
57              
58             $invindexer->spec_field( name => 'key', indexed => 0, vectorized => 0 );
59             $invindexer->spec_field( name => 'value', stored => 0, vectorized => 0 );
60              
61             chdir($unpacked) || die "Could not chdir to $unpacked: $!";
62              
63             my $rule = File::Find::Rule->new;
64             my @files = $rule->file->in(".");
65              
66             foreach my $filename (@files) {
67             next if $filename =~ /\.svn/;
68             eval {
69             my $parser;
70             $parser = Pod::Simple::PullParser->new;
71             $parser->set_source($filename);
72              
73             my $title = $parser->get_title;
74             return unless $title;
75              
76             my $synopsis = $parser->_get_titled_section(
77             'SYNOPSIS',
78             max_token => 400,
79             max_content_length => 3_000,
80             desperate => 1,
81             );
82              
83             my $description = $parser->get_description;
84              
85             my $doc = $invindexer->new_doc;
86             $doc->set_value( key => $filename );
87             $doc->set_value( value => "$title synopsis $description" );
88             $invindexer->add_doc($doc);
89              
90             # warn "added $filename => $title synopsis $description";
91             };
92             }
93              
94             $invindexer->finish( optimize => 1 );
95             }
96              
97             1;
98              
99             __END__