File Coverage

blib/lib/KinoSearch1/Index/IndexReader.pm
Criterion Covered Total %
statement 44 55 80.0
branch 4 4 100.0
condition n/a
subroutine 13 24 54.1
pod 1 12 8.3
total 62 95 65.2


line stmt bran cond sub pod time code
1             package KinoSearch1::Index::IndexReader;
2 34     34   31298 use strict;
  34         67  
  34         1233  
3 34     34   197 use warnings;
  34         59  
  34         922  
4 34     34   712 use KinoSearch1::Util::ToolSet;
  34         65  
  34         5914  
5 34     34   205 use base qw( KinoSearch1::Util::Class );
  34         63  
  34         4581  
6              
7             BEGIN {
8 34     34   379 __PACKAGE__->init_instance_vars(
9             # constructor params / members
10             invindex => undef,
11             seg_infos => undef,
12             close_invindex => 1,
13             invindex_owner => 1,
14             );
15 34         291 __PACKAGE__->ready_get(qw( invindex ));
16             }
17              
18 34     34   1801 use KinoSearch1::Store::FSInvIndex;
  34         84  
  34         811  
19 34     34   22207 use KinoSearch1::Index::SegReader;
  34         116  
  34         1203  
20 34     34   21232 use KinoSearch1::Index::MultiReader;
  34         115  
  34         1631  
21 34     34   20944 use KinoSearch1::Index::SegInfos;
  34         311  
  34         1481  
22 34         25153 use KinoSearch1::Index::IndexFileNames qw(
23             WRITE_LOCK_NAME WRITE_LOCK_TIMEOUT
24             COMMIT_LOCK_NAME COMMIT_LOCK_TIMEOUT
25 34     34   308 );
  34         76  
26              
27             sub new {
28 65     65 1 461 my $temp = shift->SUPER::new(@_);
29 65         283 return $temp->_open_multi_or_segreader;
30             }
31              
32             # Returns a subclass of IndexReader: either a MultiReader or a SegReader,
33             # depending on whether an invindex contains more than one segment.
34             sub _open_multi_or_segreader {
35 65     65   135 my $self = shift;
36              
37             # confirm an InvIndex object or make one using a supplied filepath.
38 65 100       388 if ( !a_isa_b( $self->{invindex}, 'KinoSearch1::Store::InvIndex' ) ) {
39 1         9 $self->{invindex} = KinoSearch1::Store::FSInvIndex->new(
40             path => $self->{invindex} );
41             }
42 65         164 my $invindex = $self->{invindex};
43              
44             # read the segments file and decide what to do
45 65         108 my $reader;
46             $invindex->run_while_locked(
47             lock_name => COMMIT_LOCK_NAME,
48             timeout => COMMIT_LOCK_TIMEOUT,
49             do_body => sub {
50 65     65   471 my $seg_infos = KinoSearch1::Index::SegInfos->new;
51 65         307 $seg_infos->read_infos($invindex);
52              
53             # create a SegReader for each segment in the invindex
54 65         151 my @seg_readers;
55 65         302 for my $sinfo ( $seg_infos->infos ) {
56 94         457 push @seg_readers,
57             KinoSearch1::Index::SegReader->new(
58             seg_name => $sinfo->get_seg_name,
59             invindex => $invindex,
60             );
61             }
62             # if there's one SegReader use it; otherwise make a MultiReader
63             $reader
64 65 100       774 = @seg_readers == 1
65             ? $seg_readers[0]
66             : KinoSearch1::Index::MultiReader->new(
67             invindex => $invindex,
68             sub_readers => \@seg_readers,
69             );
70             },
71 65         602 );
72              
73 65         1078 return $reader;
74             }
75              
76             =begin comment
77              
78             my $num = $reader->max_doc;
79              
80             Return the highest document number available to the reader.
81              
82             =end comment
83             =cut
84              
85 0     0 0   sub max_doc { shift->abstract_death }
86              
87             =begin comment
88              
89             my $num = $reader->num_docs;
90              
91             Return the number of (non-deleted) documents available to the reader.
92              
93             =end comment
94             =cut
95              
96 0     0 0   sub num_docs { shift->abstract_death }
97              
98             =begin comment
99              
100             my $term_docs = $reader->term_docs($term);
101              
102             Given a Term, return a TermDocs subclass.
103              
104             =end comment
105             =cut
106              
107 0     0 0   sub term_docs { shift->abstract_death }
108              
109             =begin comment
110              
111             my $norms_reader = $reader->norms_reader($field_name);
112              
113             Given a field name, return a NormsReader object.
114              
115             =end comment
116             =cut
117              
118 0     0 0   sub norms_reader { shift->abstract_death }
119              
120             =begin comment
121              
122             $reader->delete_docs_by_term( $term );
123              
124             Delete all the documents available to the reader that index the given Term.
125              
126             =end comment
127             =cut
128              
129 0     0 0   sub delete_docs_by_term { shift->abstract_death }
130              
131             =begin comment
132              
133             $boolean = $reader->has_deletions
134              
135             Return true if any documents have been marked as deleted.
136              
137             =end comment
138             =cut
139              
140 0     0 0   sub has_deletions { shift->abstract_death }
141              
142             =begin comment
143              
144             my $enum = $reader->terms($term);
145              
146             Given a Term, return a TermEnum subclass. The Enum will be be pre-located via
147             $enum->seek($term) to the right spot.
148              
149             =end comment
150             =cut
151              
152 0     0 0   sub terms { shift->abstract_death }
153              
154             =begin comment
155              
156             my $field_names = $reader->get_field_names(
157             indexed => $indexed_fields_only,
158             );
159              
160             Return a hashref which is a list of field names. If the parameter 'indexed'
161             is true, return only the names of fields which are indexed.
162              
163             =end comment
164             =cut
165              
166 0     0 0   sub get_field_names { shift->abstract_death }
167              
168             =begin comment
169              
170             my $infos = $reader->generate_field_infos;
171              
172             Return a new FieldInfos object, describing all the fields held by the reader.
173             The FieldInfos object will be consolidated, and thus may not be representative
174             of every field in every segment if there are conflicting definitions.
175              
176             =end comment
177             =cut
178              
179 0     0 0   sub generate_field_infos { shift->abstract_death }
180              
181             =begin comment
182              
183             my @sparse_segreaders = $reader->segreaders_to_merge;
184             my @all_segreaders = $reader->segreaders_to_merge('all');
185              
186             Find segments which are good candidates for merging, as they don't contain
187             many valid documents. Returns an array of SegReaders. If passed an argument,
188             return all SegReaders.
189              
190             =end comment
191             =cut
192              
193 0     0 0   sub segreaders_to_merge { shift->abstract_death }
194              
195             =begin comment
196              
197             $reader->close;
198              
199             Release all resources.
200              
201             =end comment
202             =cut
203              
204 0     0 0   sub close { shift->abstract_death }
205              
206             1;
207              
208             __END__