File Coverage

blib/lib/Plucene/Index/SegmentTermEnum.pm
Criterion Covered Total %
statement 47 50 94.0
branch 5 6 83.3
condition 3 3 100.0
subroutine 11 14 78.5
pod 9 9 100.0
total 75 82 91.4


line stmt bran cond sub pod time code
1             package Plucene::Index::SegmentTermEnum;
2              
3             =head1 NAME
4              
5             Plucene::Index::SegmentTermEnum - Segment term enum
6              
7             =head1 SYNOPSIS
8              
9             my $seg_term_enum = Plucene::Index::SegmentTermEnum
10             ->new( Plucene::Store::InputStream $i,
11             Plucene::Index::FieldInfos $fi,
12             $is_index);
13              
14             my $clone = $seg_term_info->clone;
15              
16             my Plucene::Index::Term $term = $seg_term_enum->read_term;
17              
18             $seg_term_info->seek($ptr, $position, $term, $term_info);
19             $seg_term_enum->prev;
20             $seg_term_enum->next;
21              
22             =head1 DESCRIPTION
23              
24             This is the segment term enum class.
25              
26             =head1 METHODS
27              
28             =cut
29              
30 19     19   112 use strict;
  19         40  
  19         662  
31 19     19   201 use warnings;
  19         44  
  19         753  
32              
33 19     19   9376 use Plucene::Index::TermInfo;
  19         52  
  19         161  
34 19     19   10035 use Plucene::Index::Term;
  19         55  
  19         493  
35              
36 19     19   666 use base 'Class::Accessor::Fast';
  19         36  
  19         18353  
37              
38             __PACKAGE__->mk_accessors(qw(term term_info index_pointer size position));
39              
40             =head2 new
41              
42             my $seg_term_enum = Plucene::Index::SegmentTermEnum
43             ->new( Plucene::Store::InputStream $i,
44             Plucene::Index::FieldInfos $fi,
45             $is_index);
46              
47             =head2 term / term_info / index_pointer / size / position
48             / doc_freq / freq_pointer / prox_pointer
49              
50             Get / set these attributes.
51            
52             =cut
53              
54 4     4 1 34 sub doc_freq { shift->{term_info}->doc_freq(@_) }
55 0     0 1 0 sub freq_pointer { shift->{term_info}->freq_pointer(@_) }
56 0     0 1 0 sub prox_pointer { shift->{term_info}->prox_pointer(@_) }
57              
58             # term_info must return a clone
59              
60             sub new {
61 1090     1090 1 2290 my ($class, $i, $fis, $is_i) = @_;
62 1090         6649 bless {
63             input => $i,
64             field_infos => $fis,
65             is_index => $is_i,
66             position => -1,
67             term => Plucene::Index::Term->new(),
68             term_info => Plucene::Index::TermInfo->new(),
69             size => $i->read_int
70             }, $class;
71             }
72              
73             =head2 clone
74              
75             my $clone = $seg_term_info->clone;
76              
77             =cut
78              
79             sub clone {
80 279     279 1 397 my $self = shift;
81 279         1565 my $clone = bless { %$self, input => $self->{input}->clone, }, ref $self;
82 279 50       1742 $clone->{buffer} = $self->{term}->text if $self->{term};
83 279         3191 return $clone;
84             }
85              
86             =head2 seek
87              
88             $seg_term_info->seek($ptr, $position, $term, $term_info);
89              
90             =cut
91              
92             sub seek {
93 904     904 1 1771 my ($self, $ptr, $p, $t, $ti) = @_;
94 904         9247 $self->{input}->seek($ptr, 0);
95 904         1735 $self->{position} = $p;
96 904         1794 $self->{term} = $t;
97 904         3504 undef $self->{prev};
98 904         4017 $self->{term_info} = $ti->clone;
99 904         4646 $self->{buffer} = $t->text;
100             }
101              
102             =head2 prev / next
103              
104             $seg_term_enum->prev;
105             $seg_term_enum->next;
106              
107             =cut
108              
109 0     0 1 0 sub prev { return $_[0]->{prev} }
110              
111             sub next {
112 70045     70045 1 127810 my $self = shift;
113 70045 100       199840 if ($self->{position}++ >= $self->{size} - 1) {
114 819         1630 undef $self->{term};
115 819         5429 return;
116             }
117 69226         121995 $self->{prev} = $self->{term};
118 69226         161243 $self->{term} = $self->read_term();
119 69226         825787 $self->{term_info}->{doc_freq} = $self->{input}->read_vint;
120 69226         220040 $self->{term_info}->{freq_pointer} += $self->{input}->read_vlong;
121 69226         234984 $self->{term_info}->{prox_pointer} += $self->{input}->read_vlong;
122 69226 100       178814 $self->{index_pointer} += $self->{input}->read_vlong if $self->{is_index};
123 69226         327575 return 1;
124             }
125              
126             =head2 read_term
127              
128             my Plucene::Index::Term $term = $seg_term_enum->read_term;
129              
130             =cut
131              
132             sub read_term {
133 69226     69226 1 86699 my $self = shift;
134 69226         199957 my $start = $self->{input}->read_vint();
135 69226         196709 my $length = $self->{input}->read_vint();
136 69226   100     173248 $self->{buffer} ||= " " x $length;
137 69226         273719 $self->{input}->read(substr($self->{buffer}, $start, $length), $length);
138 69226         201575 $self->{buffer} = substr($self->{buffer}, 0, $start + $length);
139 69226         234573 return bless {
140             text => $self->{buffer},
141             field => $self->{field_infos}->field_name($self->{input}->read_vint),
142             } => 'Plucene::Index::Term';
143             }
144              
145             1;