From 0d5a824ac888738795fbb25fb1ec1b1526437ec7 Mon Sep 17 00:00:00 2001 From: Matthew Bargar Date: Tue, 29 Nov 2016 16:05:48 -0500 Subject: [PATCH] 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; +}