Merge remote-tracking branch 'origin/new/bug_7805'
[koha.git] / Koha / SearchEngine / Solr / Index.pm
1 package Koha::SearchEngine::Solr::Index;
2 use Moose::Role;
3 with 'Koha::SearchEngine::IndexRole';
4
5 use Data::SearchEngine::Solr;
6 use Data::Dump qw(dump);
7 use List::MoreUtils qw(uniq);
8
9 use Koha::SearchEngine::Solr;
10 use C4::AuthoritiesMarc;
11 use C4::Biblio;
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 optimize {
21     my ( $self ) = @_;
22     return $self->searchengine->_solr->optimize;
23 }
24
25 sub index_record {
26     my ($self, $recordtype, $recordids) = @_;
27
28     my $indexes = $self->searchengine->config->indexes;
29     my @records;
30
31     my $recordids_str = ref($recordids) eq 'ARRAY'
32                     ? join " ", @$recordids
33                     : $recordids;
34     warn "IndexRecord called with $recordtype $recordids_str";
35
36     for my $id ( @$recordids ) {
37         my $record;
38
39         $record = GetAuthority( $id )  if $recordtype eq "authority";
40         $record = GetMarcBiblio( $id ) if $recordtype eq "biblio";
41
42         next unless ( $record );
43
44         my $index_values = {
45             recordid => $id,
46             recordtype => $recordtype,
47         };
48
49         warn "Indexing $recordtype $id";
50
51         for my $index ( @$indexes ) {
52             next if $index->{ressource_type} ne $recordtype;
53             my @values;
54             eval {
55                 my $mappings = $index->{mappings};
56                 for my $tag_subf_code ( sort @$mappings ) {
57                     my ( $f, $sf ) = split /\$/, $tag_subf_code;
58                     for my $field ( $record->field( $f ) ) {
59                         if ( $field->is_control_field ) {
60                             push @values, $field->data;
61                         } else {
62                             my @sfvals = $sf eq '*'
63                                        ? map { $_->[1] } $field->subfields
64                                        : map { $_      } $field->subfield( $sf );
65
66                             for ( @sfvals ) {
67                                 $_ = NormalizeDate( $_ ) if $index->{type} eq 'date';
68                                 push @values, $_ if $_;
69                             }
70                         }
71                     }
72                 }
73                 @values = uniq (@values); #Removes duplicates
74
75                 $index_values->{$index->{type}."_".$index->{code}} = \@values;
76                 if ( $index->{sortable} ){
77                     $index_values->{"srt_" . $index->{type} . "_".$index->{code}} = $values[0];
78                 }
79                 # Add index str for facets if it's not exist
80                 if ( $index->{facetable} and @values > 0 and $index->{type} ne 'str' ) {
81                     $index_values->{"str_" . $index->{code}} = $values[0];
82                 }
83             };
84             if ( $@ ) {
85                 chomp $@;
86                 warn  "Error during indexation : recordid $id, index $index->{code} ( $@ )";
87             }
88         }
89
90         my $solrrecord = Data::SearchEngine::Item->new(
91             id    => "${recordtype}_$id",
92             score => 1,
93             values => $index_values,
94         );
95         push @records, $solrrecord;
96     }
97     $self->searchengine->add( \@records );
98 }
99
100 1;