File Coverage

lib/Apache/Solr/Document.pm
Criterion Covered Total %
statement 9 69 13.0
branch 0 28 0.0
condition 0 4 0.0
subroutine 3 16 18.7
pod 11 12 91.6
total 23 129 17.8


line stmt bran cond sub pod time code
1             # Copyrights 2012-2025 by [Mark Overmeer].
2             # For other contributors see ChangeLog.
3             # See the manual pages for details on the licensing terms.
4             # Pod stripped from pm file by OODoc 2.03.
5             # This code is part of distribution Apache-Solr. Meta-POD processed with
6             # OODoc into POD and HTML manual-pages. See README.md
7             # Copyright Mark Overmeer. Licensed under the same terms as Perl itself.
8              
9             package Apache::Solr::Document;{
10             our $VERSION = '1.11';
11             }
12              
13              
14 6     6   1542 use warnings;
  6         24  
  6         364  
15 6     6   29 use strict;
  6         33  
  6         189  
16              
17 6     6   26 use Log::Report qw(solr);
  6         8  
  6         60  
18              
19              
20 0     0 1   sub new(@) { my $c = shift; (bless {}, $c)->init({@_}) }
  0            
21             sub init($)
22 0     0 0   { my ($self, $args) = @_;
23              
24 0   0       $self->{ASD_boost} = $args->{boost} || 1.0;
25 0           $self->{ASD_fields} = []; # ordered
26 0           $self->{ASD_fields_h} = {}; # grouped by name
27 0           $self->addFields($args->{fields});
28 0           $self;
29             }
30              
31              
32             sub fromResult($$)
33 0     0 1   { my ($class, $data, $rank) = @_;
34 0           my (@f, %fh);
35            
36 0           while(my($k, $v) = each %$data)
37 0 0         { my @v = map +{name => $k, content => $_}, ref $v eq 'ARRAY' ? @$v : $v;
38 0           push @f, @v;
39 0           $fh{$k} = \@v;
40             }
41              
42 0           my $self = $class->new;
43 0           $self->{ASD_rank} = $rank;
44 0           $self->{ASD_fields} = \@f;
45 0           $self->{ASD_fields_h} = \%fh;
46 0           $self;
47             }
48              
49             #---------------
50              
51             sub boost(;$)
52 0     0 1   { my $self = shift;
53 0 0         @_ or return $self->{ASD_boost};
54 0 0         my $f = $self->field(shift) or return;
55 0 0         @_ ? $f->{boost} = shift : $f->{boost};
56             }
57              
58 0     0 1   sub fieldNames() { my %c; $c{$_->{name}}++ for shift->fields; sort keys %c }
  0            
  0            
59              
60              
61 0     0 1   sub uniqueId() {shift->content($Apache::Solr::uniqueKey)}
62              
63              
64 0     0 1   sub rank() {shift->{ASD_rank}}
65              
66              
67             sub fields(;$)
68 0     0 1   { my $self = shift;
69 0           my $f = $self->{ASD_fields};
70 0 0         @_ or return @$f;
71 0           my $name = shift;
72 0           my $fh = $self->{ASD_fields_h}{$name}; # grouped by name
73 0 0         $fh ? @$fh : ();
74             }
75              
76              
77             sub field($)
78 0     0 1   { my $fh = $_[0]->{ASD_fields_h}{$_[1]};
79 0 0         $fh ? $fh->[0] : undef;
80             }
81              
82              
83             sub content($)
84 0     0 1   { my $f = $_[0]->field($_[1]);
85 0 0         $f ? $f->{content} : undef;
86             }
87              
88             our $AUTOLOAD;
89             sub AUTOLOAD
90 0     0     { my $self = shift;
91 0           (my $fn = $AUTOLOAD) =~ s/.*\:\://;
92              
93 0 0         $fn =~ /^_(.*)/ ? $self->content($1)
    0          
94             : $fn eq 'DESTROY' ? undef
95             : panic "Unknown method $AUTOLOAD (hint: fields start with '_')";
96             }
97              
98              
99             sub addField($$%)
100 0     0 1   { my $self = shift;
101 0           my $name = shift;
102 0 0         defined $_[0] or return;
103              
104             my $field = { # important to minimalize copying of content
105             name => $name,
106             content => (
107             !ref $_[0] ? shift
108 0 0         : ref $_[0] eq 'SCALAR' ? ${shift()}
  0 0          
109             : shift
110             ),
111             };
112 0           my %args = @_;
113 0   0       $field->{boost} = $args{boost} || 1.0;
114 0           $field->{update} = $args{update};
115              
116 0           push @{$self->{ASD_fields}}, $field;
  0            
117 0           push @{$self->{ASD_fields_h}{$name}}, $field;
  0            
118 0           $field;
119             }
120              
121              
122             sub addFields($%)
123 0     0 1   { my ($self, $h, @args) = @_;
124             # pass content by ref to avoid a copy of potentially huge field.
125 0 0         if(ref $h eq 'ARRAY')
126 0           { for(my $i=0; $i < @$h; $i+=2)
127 0           { $self->addField($h->[$i] => \$h->[$i+1], @args);
128             }
129             }
130             else
131 0           { $self->addField($_ => \$h->{$_}, @args) for sort keys %$h;
132             }
133 0           $self;
134             }
135              
136             #--------------------------
137              
138             1;