Merge remote-tracking branch 'jcamins/bug_8281_qa'
[koha.git] / Koha / SearchEngine / Solr / Config.pm
1 package Koha::SearchEngine::Solr::Config;
2
3 use Modern::Perl;
4 use Moose::Role;
5 use YAML;
6
7 with 'Koha::SearchEngine::ConfigRole';
8
9 has index_config => (
10     is => 'rw',
11     lazy => 1,
12     builder => '_load_index_config_file',
13 );
14
15 has solr_config => (
16     is => 'rw',
17     lazy => 1,
18     builder => '_load_solr_config_file',
19 );
20
21 has index_filename => (
22     is => 'rw',
23     lazy => 1,
24     default => C4::Context->config("installdir") . qq{/etc/searchengine/solr/indexes.yaml},
25 );
26 has solr_filename => (
27     is => 'rw',
28     lazy => 1,
29     default => C4::Context->config("installdir") . qq{/etc/searchengine/solr/config.yaml},
30 );
31
32 sub _load_index_config_file {
33     my ( $self, $filename ) = @_;
34     $self->index_filename( $filename ) if defined $filename;
35     die "The config index file (" . $self->index_filename . ") for Solr is not exist" if not -e $self->index_filename;
36
37     return YAML::LoadFile($self->index_filename);
38 }
39
40 sub _load_solr_config_file {
41     my ( $self ) = @_;
42     die "The solr config index file (" . $self->solr_filename . ") for Solr is not exist" if not -e $self->solr_filename;
43
44     return YAML::LoadFile($self->solr_filename);
45 }
46
47 sub set_config_filename {
48     my ( $self, $filename ) = @_;
49     $self->index_config( $self->_load_index_config_file( $filename ) );
50 }
51
52 sub SolrAPI {
53     my ( $self ) = @_;
54     return $self->solr_config->{SolrAPI};
55 }
56 sub indexes { # FIXME Return index list if param not an hashref (string ressource_type)
57     my ( $self, $indexes ) = @_;
58     return $self->write( { indexes => $indexes } ) if defined $indexes;
59     return $self->index_config->{indexes};
60 }
61
62 sub index {
63     my ( $self, $code ) = @_;
64     my @index = map { ( $_->{code} eq $code ) ? $_ : () } @{$self->index_config->{indexes}};
65     return $index[0];
66 }
67
68 sub ressource_types {
69     my ( $self  ) = @_;
70     my $config = $self->index_config;
71     return $config->{ressource_types};
72 }
73
74 sub sortable_indexes {
75     my ( $self ) = @_;
76     my @sortable_indexes = map { $_->{sortable} ? $_ : () } @{ $self->index_config->{indexes} };
77     return \@sortable_indexes;
78 }
79
80 sub facetable_indexes {
81     my ( $self ) = @_;
82     my @facetable_indexes = map { $_->{facetable} ? $_ : () } @{ $self->index_config->{indexes} };
83     return \@facetable_indexes;
84 }
85
86 sub reload {
87     my ( $self ) = @_;
88     $self->index_config( $self->_load_index_config_file );
89 }
90 sub write {
91     my ( $self, $values ) = @_;
92     my $r;
93     while ( my ( $k, $v ) = each %$values ) {
94         $r->{$k} = $v;
95     }
96
97     if ( not grep /^ressource_type$/, keys %$values ) {
98         $r->{ressource_types} = $self->ressource_types;
99     }
100
101     if ( not grep /^indexes$/, keys %$values ) {
102         $r->{indexes} = $self->indexes;
103     }
104
105     eval {
106         YAML::DumpFile( $self->index_filename, $r );
107     };
108     if ( $@ ) {
109         die "Failed to dump the index config into the specified file ($@)";
110     }
111
112     $self->reload;
113 }
114
115 1;