File Coverage

blib/lib/WebService/Solr.pm
Criterion Covered Total %
statement 42 114 36.8
branch 0 20 0.0
condition 0 14 0.0
subroutine 14 29 48.2
pod 13 13 100.0
total 69 190 36.3


line stmt bran cond sub pod time code
1             package WebService::Solr;
2              
3 2     2   32665 use Moo;
  2         21556  
  2         7  
4              
5 2     2   3714 use Types::Standard qw(InstanceOf Object Bool HashRef Maybe);
  2         151889  
  2         22  
6 2     2   1771 use Scalar::Util qw(blessed);
  2         3  
  2         95  
7 2     2   1022 use Encode qw(encode);
  2         15571  
  2         135  
8 2     2   981 use URI;
  2         8534  
  2         54  
9 2     2   1027 use LWP::UserAgent;
  2         61471  
  2         62  
10 2     2   866 use WebService::Solr::Response;
  2         5  
  2         66  
11 2     2   13 use HTTP::Request;
  2         2  
  2         49  
12 2     2   7 use HTTP::Headers;
  2         3  
  2         35  
13 2     2   6 use XML::Easy::Element;
  2         2  
  2         30  
14 2     2   6 use XML::Easy::Content;
  2         2  
  2         26  
15 2     2   6 use XML::Easy::Text ();
  2         3  
  2         25  
16 2     2   41 use Carp qw(confess);
  2         2  
  2         1949  
17              
18             has 'url' => (
19             is => 'ro',
20             isa => InstanceOf['URI'],
21             default => sub { URI->new( 'http://localhost:8983/solr' ) }
22             );
23              
24             has 'agent' =>
25             ( is => 'ro', isa => Object, default => sub { LWP::UserAgent->new } );
26              
27             has 'autocommit' => ( is => 'ro', isa => Bool, default => 1 );
28              
29             has 'default_params' => (
30             is => 'ro',
31             isa => HashRef,
32             default => sub { { wt => 'json' } }
33             );
34              
35             around default_params => sub {
36             my ($orig, $self, @args) = @_;
37             my $ret = $self->$orig(@args);
38             return wantarray ? %$ret : $ret;
39             };
40              
41             has 'last_response' => (
42             is => 'rw',
43             isa => Maybe[InstanceOf['WebService::Solr::Response']],
44             );
45              
46             our $VERSION = '0.41_01';
47              
48             sub BUILDARGS {
49 0     0 1   my ( $self, $url, $options ) = @_;
50 0   0       $options ||= {};
51              
52 0 0         if ( $url ) {
53 0 0         $options->{ url } = ref $url ? $url : URI->new( $url );
54             }
55              
56 0 0         if ( exists $options->{ default_params } ) {
57             $options->{ default_params }
58 0           = { %{ $options->{ default_params } }, wt => 'json', };
  0            
59             }
60              
61 0           return $options;
62             }
63              
64             sub add {
65 0     0 1   my ( $self, $doc, $params ) = @_;
66 0 0         my @docs = ref $doc eq 'ARRAY' ? @$doc : ( $doc );
67              
68             my @elements = map {
69 0 0         ( '',
  0 0          
70             blessed $_
71             ? $_->to_element
72             : WebService::Solr::Document->new(
73             ref $_ eq 'HASH' ? %$_ : @$_
74             )->to_element
75             )
76             } @docs;
77              
78 0   0       $params ||= {};
79 0           my $e
80             = XML::Easy::Element->new( 'add', $params,
81             XML::Easy::Content->new( [ @elements, '' ] ),
82             );
83 0           my $xml = XML::Easy::Text::xml10_write_element( $e );
84              
85 0           my $response = $self->_send_update( $xml );
86 0           return $response->ok;
87             }
88              
89             sub update {
90 0     0 1   return shift->add( @_ );
91             }
92              
93             sub commit {
94 0     0 1   my ( $self, $params ) = @_;
95 0   0       $params ||= {};
96 0           my $e = XML::Easy::Element->new( 'commit', $params, [ '' ] );
97 0           my $xml = XML::Easy::Text::xml10_write_element( $e );
98 0           my $response = $self->_send_update( $xml, {}, 0 );
99 0           return $response->ok;
100             }
101              
102             sub rollback {
103 0     0 1   my ( $self ) = @_;
104 0           my $response = $self->_send_update( '', {}, 0 );
105 0           return $response->ok;
106             }
107              
108             sub optimize {
109 0     0 1   my ( $self, $params ) = @_;
110 0   0       $params ||= {};
111 0           my $e = XML::Easy::Element->new( 'optimize', $params, [ '' ] );
112 0           my $xml = XML::Easy::Text::xml10_write_element( $e );
113 0           my $response = $self->_send_update( $xml, {}, 0 );
114 0           return $response->ok;
115             }
116              
117             sub delete {
118 0     0 1   my ( $self, $options ) = @_;
119              
120 0           my $xml = '';
121 0           for my $k ( keys %$options ) {
122 0           my $v = $options->{ $k };
123             $xml .= join(
124             '',
125             map {
126 0 0         XML::Easy::Text::xml10_write_element(
  0            
127             XML::Easy::Element->new( $k, {}, [ $_ ] ) )
128             } ref $v ? @$v : $v
129             );
130             }
131              
132 0           my $response = $self->_send_update( "${xml}" );
133 0           return $response->ok;
134             }
135              
136             sub delete_by_id {
137 0     0 1   my ( $self, $id ) = @_;
138 0           return $self->delete( { id => $id } );
139             }
140              
141             sub delete_by_query {
142 0     0 1   my ( $self, $query ) = @_;
143 0           return $self->delete( { query => $query } );
144             }
145              
146             sub ping {
147 0     0 1   my ( $self ) = @_;
148 0           $self->last_response( WebService::Solr::Response->new(
149             $self->agent->get( $self->_gen_url( 'admin/ping' ) ) ) );
150 0           return $self->last_response->is_success;
151             }
152              
153             sub search {
154 0     0 1   my ( $self, $query, $params ) = @_;
155 0   0       $params ||= {};
156 0           $params->{ 'q' } = $query;
157 0           return $self->generic_solr_request( 'select', $params );
158             }
159              
160             sub auto_suggest {
161 0     0 1   shift->generic_solr_request( 'autoSuggest', @_ );
162             }
163              
164             sub generic_solr_request {
165 0     0 1   my ( $self, $path, $params ) = @_;
166 0   0       $params ||= {};
167 0           return $self->last_response(
168             WebService::Solr::Response->new(
169             $self->agent->post(
170             $self->_gen_url( $path ),
171             Content_Type => 'application/x-www-form-urlencoded; charset=utf-8',
172             Content => { $self->default_params, %$params } ) ) );
173             }
174              
175             sub _gen_url {
176 0     0     my ( $self, $handler ) = @_;
177              
178 0           my $url = $self->url->clone;
179 0           $url->path( $url->path . "/$handler" );
180 0           return $url;
181             }
182              
183             sub _send_update {
184 0     0     my ( $self, $xml, $params, $autocommit ) = @_;
185 0 0         $autocommit = $self->autocommit unless defined $autocommit;
186              
187 0   0       $params ||= {};
188 0           my $url = $self->_gen_url( 'update' );
189 0           $url->query_form( { $self->default_params, %$params } );
190 0           my $req = HTTP::Request->new(
191             POST => $url,
192             HTTP::Headers->new( Content_Type => 'text/xml; charset=utf-8' ),
193             '' . encode( 'utf8', "$xml" )
194             );
195              
196 0           my $http_response = $self->agent->request( $req );
197 0 0         if ( $http_response->is_error ) {
198 0           confess($http_response->status_line . ': ' . $http_response->content);
199             }
200              
201 0           $self->last_response( WebService::Solr::Response->new( $http_response ) );
202              
203 0 0         $self->commit if $autocommit;
204              
205 0           return $self->last_response;
206             }
207              
208 2     2   9 no Moo;
  2         2  
  2         9  
209              
210             1;
211              
212             __END__