Bug 22474: Clone field config before adding fields to it
authorEre Maijala <ere.maijala@helsinki.fi>
Thu, 7 Mar 2019 14:35:30 +0000 (16:35 +0200)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Thu, 25 Apr 2019 14:04:38 +0000 (15:04 +0100)
Test plain:

1. Reindex both authorities and biblios with the -d flag to recreate the index, e.g. "perl misc/search_tools/rebuild_elastic_search.pl -v -d"
2. Check that authorities only contains authority-specific fields in Elasticsearch e.g. by fetching  http://localhost:9200/koha_dev_authorities/_mappings
3. Reindex both without the -d flag and verify it works, e.g. "perl misc/search_tools/rebuild_elastic_search.pl -v"

Signed-off-by: Björn Nylén <bjorn.nylen@ub.lu.se>
Signed-off-by: Chris Cormack <chris@bigballofwax.co.nz>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
(cherry picked from commit 118f685dbf1519077ece65a47f83bff179efbf9b)
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

C4/Installer/PerlDependencies.pm
Koha/SearchEngine/Elasticsearch.pm

index fc5e99e..2225463 100644 (file)
@@ -889,7 +889,7 @@ our $PERL_DEPS = {
        min_ver  => '0.17'
     },
     'Clone' => {
-        usage    => 'ILL, Test suite',
+        usage    => 'ILL, Test suite, Elasticsearch integration',
         required => '1',
         min_ver  => '0.37',
     },
index 9a9e50b..ff7aba6 100644 (file)
@@ -27,6 +27,7 @@ use Koha::SearchFields;
 use Koha::SearchMarcMaps;
 
 use Carp;
+use Clone qw(clone);
 use JSON;
 use Modern::Perl;
 use Readonly;
@@ -192,13 +193,15 @@ sub get_elasticsearch_mappings {
 
     if (!defined $all_mappings{$self->index}) {
         $sort_fields{$self->index} = {};
+        # Clone the general mapping to break ties with the original hash
         my $mappings = {
-            data => scalar _get_elasticsearch_mapping('general', '')
+            data => clone(_get_elasticsearch_field_config('general', ''))
         };
         my $marcflavour = lc C4::Context->preference('marcflavour');
         $self->_foreach_mapping(
             sub {
                 my ( $name, $type, $facet, $suggestible, $sort, $marc_type ) = @_;
+
                 return if $marc_type ne $marcflavour;
                 # TODO if this gets any sort of complexity to it, it should
                 # be broken out into its own function.
@@ -214,19 +217,19 @@ sub get_elasticsearch_mappings {
                     $es_type = 'stdno';
                 }
 
-                $mappings->{data}{properties}{$name} = _get_elasticsearch_mapping('search', $es_type);
+                $mappings->{data}{properties}{$name} = _get_elasticsearch_field_config('search', $es_type);
 
                 if ($facet) {
-                    $mappings->{data}{properties}{ $name . '__facet' } = _get_elasticsearch_mapping('facet', $es_type);
+                    $mappings->{data}{properties}{ $name . '__facet' } = _get_elasticsearch_field_config('facet', $es_type);
                 }
                 if ($suggestible) {
-                    $mappings->{data}{properties}{ $name . '__suggestion' } = _get_elasticsearch_mapping('suggestible', $es_type);
+                    $mappings->{data}{properties}{ $name . '__suggestion' } = _get_elasticsearch_field_config('suggestible', $es_type);
                 }
                 # Sort is a bit special as it can be true, false, undef.
                 # We care about "true" or "undef",
                 # "undef" means to do the default thing, which is make it sortable.
                 if (!defined $sort || $sort) {
-                    $mappings->{data}{properties}{ $name . '__sort' } = _get_elasticsearch_mapping('sort', $es_type);
+                    $mappings->{data}{properties}{ $name . '__sort' } = _get_elasticsearch_field_config('sort', $es_type);
                     $sort_fields{$self->index}{$name} = 1;
                 }
             }
@@ -238,15 +241,15 @@ sub get_elasticsearch_mappings {
     return $all_mappings{$self->index};
 }
 
-=head2 _get_elasticsearch_mapping
+=head2 _get_elasticsearch_field_config
 
-Get the Elasticsearch mappings for the given purpose and data type.
+Get the Elasticsearch field config for the given purpose and data type.
 
-$mapping = _get_elasticsearch_mapping('search', 'text');
+$mapping = _get_elasticsearch_field_config('search', 'text');
 
 =cut
 
-sub _get_elasticsearch_mapping {
+sub _get_elasticsearch_field_config {
 
     my ( $purpose, $type ) = @_;