Bug 7387 : Adding a caching plugin for Template::Toolkit
[koha.git] / Koha / SearchEngine / Solr / Search.pm
1 package Koha::SearchEngine::Solr::Search;
2 use Moose::Role;
3 with 'Koha::SearchEngine::SearchRole';
4
5 use Data::Dump qw(dump);
6 use XML::Simple;
7
8 use Data::SearchEngine::Solr;
9 use Data::Pagination;
10 use Data::SearchEngine::Query;
11 use Koha::SearchEngine::Solr;
12
13 has searchengine => (
14     is => 'rw',
15     isa => 'Koha::SearchEngine::Solr',
16     default => sub { Koha::SearchEngine::Solr->new },
17     lazy => 1
18 );
19
20 sub search {
21     my ( $self, $q, $filters, $params ) = @_;
22
23     $q         ||= '*:*';
24     $filters   ||= {};
25     my $page   = defined $params->{page}   ? $params->{page}   : 1;
26     my $count  = defined $params->{count}  ? $params->{count}  : 999999999;
27     my $sort   = defined $params->{sort}   ? $params->{sort}   : 'score desc';
28     my $facets = defined $params->{facets} ? $params->{facets} : 0;
29
30     # Construct fl from $params->{fl}
31     # If "recordid" or "id" not exist, we push them
32     my $fl = join ",",
33         defined $params->{fl}
34             ? (
35                 @{$params->{fl}},
36                 grep ( /^recordid$/, @{$params->{fl}} ) ? () : "recordid",
37                 grep ( /^id$/, @{$params->{fl}} ) ? () : "id"
38               )
39             : ( "recordid", "id" );
40
41     my $recordtype;
42     $recordtype = ref($filters->{recordtype}) eq 'ARRAY'
43                     ? $filters->{recordtype}[0]
44                     : $filters->{recordtype}
45                 if defined $filters && defined $filters->{recordtype};
46
47     if ( $facets ) {
48         $self->searchengine->options->{"facet"}          = 'true';
49         $self->searchengine->options->{"facet.mincount"} = 1;
50         $self->searchengine->options->{"facet.limit"}    = 10; # TODO create a new systempreference C4::Context->preference("numFacetsDisplay")
51         my @facetable_indexes = map { 'str_' . $_->{code} } @{$self->searchengine->config->facetable_indexes};
52         $self->searchengine->options->{"facet.field"}    = \@facetable_indexes;
53     }
54     $self->searchengine->options->{sort} = $sort;
55     $self->searchengine->options->{fl} = $fl;
56
57     # Construct filters
58     $self->searchengine->options->{fq} = [
59         map {
60             my $idx = $_;
61             ref($filters->{$idx}) eq 'ARRAY'
62                 ?
63                     '('
64                     . join( ' AND ',
65                         map {
66                             my $filter_str = $_;
67                             utf8::decode($filter_str);
68                             my $quotes_existed = ( $filter_str =~ m/^".*"$/ );
69                             $filter_str =~ s/^"(.*)"$/$1/; #remove quote around value if exist
70                             $filter_str =~ s/[^\\]\K"/\\"/g;
71                             $filter_str = qq{"$filter_str"} # Add quote around value if not exist
72                                 if not $filter_str =~ /^".*"$/
73                                     and $quotes_existed;
74                             qq{$idx:$filter_str};
75                         } @{ $filters->{$idx} } )
76                     . ')'
77                 : "$idx:$filters->{$idx}";
78         } keys %$filters
79     ];
80
81     my $sq = Data::SearchEngine::Query->new(
82         page  => $page,
83         count => $count,
84         query => $q,
85     );
86
87     # Get results
88     my $results = eval { $self->searchengine->search( $sq ) };
89
90     # Get error if exists
91     if ( $@ ) {
92         my $err = $@;
93
94         $err =~ s#^[^\n]*\n##; # Delete first line
95         if ( $err =~ "400 URL must be absolute" ) {
96             $err = "Your system preference 'SolrAPI' is not set correctly";
97         }
98         elsif ( not $err =~ 'Connection refused' ) {
99             my $document = XMLin( $err );
100             $err = "$$document{body}{h2} : $$document{body}{pre}";
101         }
102         $results->{error} = $err;
103     }
104     return $results;
105 }
106
107 sub dosmth {'bou' }
108
109 1;