Merge remote-tracking branch 'origin/new/bug_6720'
[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 = ref($filters->{recordtype}) eq 'ARRAY'
42                     ? $filters->{recordtype}[0]
43                     : $filters->{recordtype}
44                 if defined $filters && defined $filters->{recordtype};
45
46     if ( $facets ) {
47         $self->searchengine->options->{"facet"}          = 'true';
48         $self->searchengine->options->{"facet.mincount"} = 1;
49         $self->searchengine->options->{"facet.limit"}    = 10; # TODO create a new systempreference C4::Context->preference("numFacetsDisplay")
50         my @facetable_indexes = map { 'str_' . $_->{code} } @{$self->searchengine->config->facetable_indexes};
51         $self->searchengine->options->{"facet.field"}    = \@facetable_indexes;
52     }
53     $self->searchengine->options->{sort} = $sort;
54     $self->searchengine->options->{fl} = $fl;
55
56     # Construct filters
57     $self->searchengine->options->{fq} = [
58         map {
59             my $idx = $_;
60             ref($filters->{$idx}) eq 'ARRAY'
61                 ?
62                     '('
63                     . join( ' AND ',
64                         map {
65                             my $filter_str = $_;
66                             utf8::decode($filter_str);
67                             my $quotes_existed = ( $filter_str =~ m/^".*"$/ );
68                             $filter_str =~ s/^"(.*)"$/$1/; #remove quote around value if exist
69                             $filter_str =~ s/[^\\]\K"/\\"/g;
70                             $filter_str = qq{"$filter_str"} # Add quote around value if not exist
71                                 if not $filter_str =~ /^".*"$/
72                                     and $quotes_existed;
73                             qq{$idx:$filter_str};
74                         } @{ $filters->{$idx} } )
75                     . ')'
76                 : "$idx:$filters->{$idx}";
77         } keys %$filters
78     ];
79
80     my $sq = Data::SearchEngine::Query->new(
81         page  => $page,
82         count => $count,
83         query => $q,
84     );
85
86     # Get results
87     my $results = eval { $self->searchengine->search( $sq ) };
88
89     # Get error if exists
90     if ( $@ ) {
91         my $err = $@;
92
93         $err =~ s#^[^\n]*\n##; # Delete first line
94         if ( $err =~ "400 URL must be absolute" ) {
95             $err = "Your system preference 'SolrAPI' is not set correctly";
96         }
97         elsif ( not $err =~ 'Connection refused' ) {
98             my $document = XMLin( $err );
99             $err = "$$document{body}{h2} : $$document{body}{pre}";
100         }
101         $results->{error} = $err;
102     }
103     return $results;
104 }
105
106 sub dosmth {'bou' }
107
108 1;