From 0d5a824ac888738795fbb25fb1ec1b1526437ec7 Mon Sep 17 00:00:00 2001 From: Matthew Bargar Date: Tue, 29 Nov 2016 16:05:48 -0500 Subject: [PATCH 1/2] Fix sorting on scripted date and boolean fields The elasticsearch API only [supports][1][2] sort scripts of type `number` and `string`. Since dates need to be returned as millis since the epoch for visualizations to work anyway, we can simply add a condition to send dates as type number in the sort API. ES will cast booleans if we tell them its a string, so we can add a similar condition there as well. [1]: https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-request-sort.html#_script_based_sorting [2]: https://github.com/elastic/elasticsearch/blob/aeb97ff41298e26b107a733837dfe17f123c0c9b/core/src/main/java/org/elasticsearch/search/sort/ScriptSortBuilder.java#L359 Fixes: https://github.com/elastic/kibana/issues/9257 --- .../data_source/_normalize_sort_request.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/ui/public/courier/data_source/_normalize_sort_request.js b/src/ui/public/courier/data_source/_normalize_sort_request.js index 7bab633bf1d4c..dabc9e4fc754d 100644 --- a/src/ui/public/courier/data_source/_normalize_sort_request.js +++ b/src/ui/public/courier/data_source/_normalize_sort_request.js @@ -38,7 +38,7 @@ export default function normalizeSortRequest(config) { inline: indexField.script, lang: indexField.lang }, - type: indexField.type, + type: castSortType(indexField.type), order: direction }; } else { @@ -56,3 +56,19 @@ export default function normalizeSortRequest(config) { return normalized; } }; + +function castSortType(type) { + const typeCastings = { + number: 'number', + string: 'string', + date: 'number', + boolean: 'string' + }; + + const castedType = typeCastings[type]; + if (!castedType) { + throw new Error(`Unsupported script sort type: ${type}`); + } + + return castedType; +} From 14dc39638ad2dec30c0fd0ca36c36564c2e73029 Mon Sep 17 00:00:00 2001 From: Matthew Bargar Date: Wed, 30 Nov 2016 16:02:41 -0500 Subject: [PATCH 2/2] Add helpful comment --- src/ui/public/courier/data_source/_normalize_sort_request.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ui/public/courier/data_source/_normalize_sort_request.js b/src/ui/public/courier/data_source/_normalize_sort_request.js index dabc9e4fc754d..beb9f3f6effa8 100644 --- a/src/ui/public/courier/data_source/_normalize_sort_request.js +++ b/src/ui/public/courier/data_source/_normalize_sort_request.js @@ -57,6 +57,7 @@ export default function normalizeSortRequest(config) { } }; +// The ES API only supports sort scripts of type 'number' and 'string' function castSortType(type) { const typeCastings = { number: 'number',