/usr/share/perl5/Plucene/Index/SegmentsTermEnum.pm is in libplucene-perl 1.25-3.
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 | package Plucene::Index::SegmentsTermEnum;
=head1 NAME
Plucene::Index::SegmentsTermEnum
=head1 METHODS
=head2 new / term / doc_freq / next
as per TermEnum
=cut
# This only appears to be used with doing wildcard searches.
use strict;
use warnings;
use Tie::Array::Sorted;
use Plucene::Index::SegmentMergeInfo;
sub term { $_[0]->{term} }
sub doc_freq { $_[0]->{doc_freq} }
sub new {
my ($class, $readers, $starts, $t) = @_;
tie my @queue, "Tie::Array::Sorted";
for my $i (0 .. $#{$readers}) {
my $reader = $readers->[$i];
my $term_enum = $reader->terms($t);
my $smi =
Plucene::Index::SegmentMergeInfo->new($starts->[$i], $term_enum,
$reader);
if (!$t ? $smi->next : $term_enum->term) { # ???
push @queue, $smi;
}
}
my $self = bless { queue => \@queue }, $class;
if ($t and @queue) {
my $top = $queue[0];
$self->{term} = $top->term_enum->term;
$self->{doc_freq} = $top->term_enum->doc_freq;
}
return $self;
}
sub next {
my $self = shift;
my $top = $self->{queue}[0];
if (!$top) {
undef $self->{term};
return;
}
$self->{term} = $top->term;
$self->{doc_freq} = 0;
while ($top && $self->{term}->eq($top->term)) {
$self->{doc_freq} += $top->term_enum->doc_freq;
# This might look funny, but it's right. The pop takes $top off
# the queue, and when it has ->next called on it, its comparison
# value changes; the queue is tied as a Tie::Array::Sorted, so
# when it gets added back on, it may be put somewhere else.
pop @{ $self->{queue} };
if ($top->next) {
unshift @{ $self->{queue} }, $top;
}
$top = $self->{queue}[0];
}
return 1;
}
1;
|