File Coverage

blib/lib/WebService/Solr/Document.pm
Criterion Covered Total %
statement 59 60 98.3
branch 15 16 93.7
condition 2 3 66.6
subroutine 15 15 100.0
pod 9 9 100.0
total 100 103 97.0


line stmt bran cond sub pod time code
1             package WebService::Solr::Document;
2              
3 4     4   14208 use WebService::Solr::Field;
  4         9  
  4         110  
4 4     4   21 use XML::Easy::Element;
  4         5  
  4         63  
5 4     4   15 use XML::Easy::Content;
  4         3  
  4         60  
6 4     4   15 use XML::Easy::Text ();
  4         14  
  4         63  
7 4     4   13 use Scalar::Util 'blessed';
  4         5  
  4         2362  
8              
9             sub new {
10 13     13 1 3764 my ( $class, @fields ) = @_;
11              
12 13         26 my $self = {
13             fields => [ _parse_fields( @fields ) ]
14             };
15              
16 13         42 return bless $self, $class;
17             }
18              
19             sub boost {
20 15     15 1 1608 my $self = shift;
21 15 100       29 $self->{ boost } = $_[ 0 ] if @_;
22 15         41 return $self->{ boost };
23             }
24              
25             sub fields {
26 19     19 1 299 my $self = shift;
27 19 100       32 $self->{ fields } = $_[ 0 ] if @_;
28 19 100       33 return wantarray ? @{ $self->{ fields } } : $self->{ fields };
  17         29  
29             }
30              
31             sub add_fields {
32 1     1 1 7 my ( $self, @fields ) = @_;
33 1         2 $self->fields( [ $self->fields, _parse_fields( @fields ) ] );
34             }
35              
36             sub _parse_fields {
37 14     14   19 my @fields = @_;
38 14         10 my @new_fields;
39              
40             # handle field objects, array refs and normal k => v pairs
41 14         28 while ( my $f = shift @fields ) {
42 40 100       97 if ( blessed $f ) {
    100          
43 20         14 push @new_fields, $f;
44 20         40 next;
45             }
46             elsif ( ref $f ) {
47 13         24 push @new_fields, WebService::Solr::Field->new( @$f );
48 13         23 next;
49             }
50              
51 7         8 my $v = shift @fields;
52 7 100 66     35 my @values = ( ref $v and !blessed $v ) ? @$v : $v;
53             push @new_fields,
54 7         10 map { WebService::Solr::Field->new( $f => "$_" ) } @values;
  11         75  
55             }
56              
57 14         35 return @new_fields;
58             }
59              
60             sub field_names {
61 1     1 1 4 my ( $self ) = @_;
62 1         3 my %names = map { $_->name => 1 } $self->fields;
  5         9  
63 1         11 return keys %names;
64             }
65              
66             sub value_for {
67 4     4 1 1451 my ( $self, $key ) = @_;
68              
69 4         8 for my $field ( $self->fields ) {
70 4 50       9 if ( $field->name eq $key ) {
71 4         8 return $field->value;
72             }
73             }
74              
75 0         0 return;
76             }
77              
78             sub values_for {
79 4     4 1 1420 my ( $self, $key ) = @_;
80 4         9 return map { $_->value } grep { $_->name eq $key } $self->fields;
  6         12  
  21         29  
81             }
82              
83             sub to_element {
84 7     7 1 6 my $self = shift;
85 7 100       8 my %attr = ( $self->boost ? ( boost => $self->boost ) : () );
86              
87 7         13 my @elements = map { ( '' => $_->to_element ) } $self->fields;
  25         41  
88              
89 7         169 return XML::Easy::Element->new( 'doc', \%attr,
90             XML::Easy::Content->new( [ @elements, '' ] ),
91             );
92             }
93              
94             sub to_xml {
95 7     7 1 882 my $self = shift;
96              
97 7         13 return XML::Easy::Text::xml10_write_element( $self->to_element );
98             }
99              
100             1;
101              
102             __END__