package Plucene::Index::SegmentInfos; =head1 NAME Plucene::Index::SegmentInfos - A collection of SegmentInfo objects =head1 SYNOPSIS my $segmentinfos = Plucene::Index::SegmentInfos->new; $segmentinfos->read($dir); $segmentinfos->write($dir); $segmentinfos->add_element(Plucene::Index::SegmentInfo $segment_info); my Plucene::Index::SegmentInfo @segment_info = $segmentinfos->segments; =head1 DESCRIPTION This is a collection of Plucene::Index::SegmentInfo objects =head1 METHODS =cut use strict; use warnings; use Carp; use Plucene::Index::SegmentInfo; use Plucene::Store::InputStream; use Plucene::Store::OutputStream; use File::Slurp; =head2 new my $segmentinfos = Plucene::Index::SegmentInfos->new; This will create a new (empty) Plucene::Index::SegmentInfos object. =cut sub new { bless { segments => [] }, shift } =head2 read $segmentinfos->read($dir); This will read the segments file from the passed directory. =cut sub read { my ($self, $directory) = @_; my ($count, @unpack) = unpack "NN/(w/aN)", read_file("$directory/segments"); my @segs; while (my ($name, $count) = splice @unpack, 0, 2) { push @segs, bless { name => $name, doc_count => $count, dir => $directory, } => 'Plucene::Index::SegmentInfo'; } $self->{segments} = \@segs; $self->{counter} = $count; } =head2 write $segmentinfos->write($dir); This will write the segments info file out. =cut sub write { my ($self, $directory) = @_; my $segfile = "$directory/segments"; my $tempfile = "${segfile}.new"; my @segs = $self->segments; my $template = "NN" . ("w/a*N" x @segs); my $packed = pack $template, $self->{counter} || 0, scalar @segs, map { $_->name => $_->doc_count } @segs; write_file($tempfile => $packed); rename($tempfile => $segfile); } =head2 add_element $segmentinfos->add_element(Plucene::Index::SegmentInfo $segment_info); This will add the passed Plucene::Index::SegmentInfo object.. =cut sub add_element { push @{ $_[0]->{segments} }, $_[1] } =head2 info my Plucene::Index::SegmentInfo $info = $segmentinfos->info($segment_no); This will return the Plucene::Index::SegmentInfo object at the passed segment number. =cut sub info { $_[0]->{segments}->[ $_[1] ] } =head2 segments my Plucene::Index::SegmentInfo @segment_info = $segmentinfos->segments; This returns all the Plucene::Index::SegmentInfo onjects in this segment. =cut sub segments { @{ $_[0]->{segments} } } 1;