/usr/lib/perl5/KinoSearch1/Index/IndexReader.pm is in libkinosearch1-perl 1.00-1build3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 | package KinoSearch1::Index::IndexReader;
use strict;
use warnings;
use KinoSearch1::Util::ToolSet;
use base qw( KinoSearch1::Util::Class );
BEGIN {
__PACKAGE__->init_instance_vars(
# constructor params / members
invindex => undef,
seg_infos => undef,
close_invindex => 1,
invindex_owner => 1,
);
__PACKAGE__->ready_get(qw( invindex ));
}
use KinoSearch1::Store::FSInvIndex;
use KinoSearch1::Index::SegReader;
use KinoSearch1::Index::MultiReader;
use KinoSearch1::Index::SegInfos;
use KinoSearch1::Index::IndexFileNames qw(
WRITE_LOCK_NAME WRITE_LOCK_TIMEOUT
COMMIT_LOCK_NAME COMMIT_LOCK_TIMEOUT
);
sub new {
my $temp = shift->SUPER::new(@_);
return $temp->_open_multi_or_segreader;
}
# Returns a subclass of IndexReader: either a MultiReader or a SegReader,
# depending on whether an invindex contains more than one segment.
sub _open_multi_or_segreader {
my $self = shift;
# confirm an InvIndex object or make one using a supplied filepath.
if ( !a_isa_b( $self->{invindex}, 'KinoSearch1::Store::InvIndex' ) ) {
$self->{invindex} = KinoSearch1::Store::FSInvIndex->new(
path => $self->{invindex} );
}
my $invindex = $self->{invindex};
# read the segments file and decide what to do
my $reader;
$invindex->run_while_locked(
lock_name => COMMIT_LOCK_NAME,
timeout => COMMIT_LOCK_TIMEOUT,
do_body => sub {
my $seg_infos = KinoSearch1::Index::SegInfos->new;
$seg_infos->read_infos($invindex);
# create a SegReader for each segment in the invindex
my @seg_readers;
for my $sinfo ( $seg_infos->infos ) {
push @seg_readers,
KinoSearch1::Index::SegReader->new(
seg_name => $sinfo->get_seg_name,
invindex => $invindex,
);
}
# if there's one SegReader use it; otherwise make a MultiReader
$reader
= @seg_readers == 1
? $seg_readers[0]
: KinoSearch1::Index::MultiReader->new(
invindex => $invindex,
sub_readers => \@seg_readers,
);
},
);
return $reader;
}
=begin comment
my $num = $reader->max_doc;
Return the highest document number available to the reader.
=end comment
=cut
sub max_doc { shift->abstract_death }
=begin comment
my $num = $reader->num_docs;
Return the number of (non-deleted) documents available to the reader.
=end comment
=cut
sub num_docs { shift->abstract_death }
=begin comment
my $term_docs = $reader->term_docs($term);
Given a Term, return a TermDocs subclass.
=end comment
=cut
sub term_docs { shift->abstract_death }
=begin comment
my $norms_reader = $reader->norms_reader($field_name);
Given a field name, return a NormsReader object.
=end comment
=cut
sub norms_reader { shift->abstract_death }
=begin comment
$reader->delete_docs_by_term( $term );
Delete all the documents available to the reader that index the given Term.
=end comment
=cut
sub delete_docs_by_term { shift->abstract_death }
=begin comment
$boolean = $reader->has_deletions
Return true if any documents have been marked as deleted.
=end comment
=cut
sub has_deletions { shift->abstract_death }
=begin comment
my $enum = $reader->terms($term);
Given a Term, return a TermEnum subclass. The Enum will be be pre-located via
$enum->seek($term) to the right spot.
=end comment
=cut
sub terms { shift->abstract_death }
=begin comment
my $field_names = $reader->get_field_names(
indexed => $indexed_fields_only,
);
Return a hashref which is a list of field names. If the parameter 'indexed'
is true, return only the names of fields which are indexed.
=end comment
=cut
sub get_field_names { shift->abstract_death }
=begin comment
my $infos = $reader->generate_field_infos;
Return a new FieldInfos object, describing all the fields held by the reader.
The FieldInfos object will be consolidated, and thus may not be representative
of every field in every segment if there are conflicting definitions.
=end comment
=cut
sub generate_field_infos { shift->abstract_death }
=begin comment
my @sparse_segreaders = $reader->segreaders_to_merge;
my @all_segreaders = $reader->segreaders_to_merge('all');
Find segments which are good candidates for merging, as they don't contain
many valid documents. Returns an array of SegReaders. If passed an argument,
return all SegReaders.
=end comment
=cut
sub segreaders_to_merge { shift->abstract_death }
=begin comment
$reader->close;
Release all resources.
=end comment
=cut
sub close { shift->abstract_death }
1;
__END__
=begin devdocs
=head1 NAME
KinoSearch1::Index::IndexReader - base class for objects which read invindexes
=head1 DESCRIPTION
There are two subclasses of the abstract base class IndexReader: SegReader,
which reads a single segment, and MultiReader, which condenses the output of
several SegReaders. Since each segment is a self-contained inverted index, a
SegReader is in effect a complete index reader.
The constructor for IndexReader returns either a SegReader if the index has
only one segment, or a MultiReader if there are multiple segments.
=head1 COPYRIGHT
Copyright 2005-2010 Marvin Humphrey
=head1 LICENSE, DISCLAIMER, BUGS, etc.
See L<KinoSearch1> version 1.00.
=end devdocs
=cut
|