From c46de5f3bc3f4bf8972f2d80b836a17046c1fedd Mon Sep 17 00:00:00 2001 From: Ere Maijala Date: Thu, 7 Mar 2019 16:35:30 +0200 Subject: [PATCH] Bug 22474: Clone field config before adding fields to it 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" --- C4/Installer/PerlDependencies.pm | 2 +- Koha/SearchEngine/Elasticsearch.pm | 21 ++++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/C4/Installer/PerlDependencies.pm b/C4/Installer/PerlDependencies.pm index fc5e99e0ca..2225463349 100644 --- a/C4/Installer/PerlDependencies.pm +++ b/C4/Installer/PerlDependencies.pm @@ -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', }, diff --git a/Koha/SearchEngine/Elasticsearch.pm b/Koha/SearchEngine/Elasticsearch.pm index f7aa3826bb..8218e22dc7 100644 --- a/Koha/SearchEngine/Elasticsearch.pm +++ b/Koha/SearchEngine/Elasticsearch.pm @@ -27,6 +27,7 @@ use Koha::SearchFields; use Koha::SearchMarcMaps; use Carp; +use Clone qw(clone); use JSON; use Modern::Perl; use Readonly; @@ -193,13 +194,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. @@ -215,19 +218,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; } } @@ -239,15 +242,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 ) = @_; -- 2.17.1