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;