From 5bc6da68d7d4f14ad972abc737259444932825d6 Mon Sep 17 00:00:00 2001 From: Elastic Jasper Date: Wed, 30 Nov 2016 16:04:33 -0500 Subject: [PATCH] Fix sorting on scripted date and boolean fields Backports PR #9261 **Commit 1:** 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 * Original sha: 0d5a824ac888738795fbb25fb1ec1b1526437ec7 * Authored by Matthew Bargar on 2016-11-29T21:05:48Z **Commit 2:** Add helpful comment * Original sha: 14dc39638ad2dec30c0fd0ca36c36564c2e73029 * Authored by Matthew Bargar on 2016-11-30T21:02:41Z --- .../data_source/_normalize_sort_request.js | 19 ++++++++++++++++++- 1 file changed, 18 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..beb9f3f6effa8 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,20 @@ export default function normalizeSortRequest(config) { return normalized; } }; + +// The ES API only supports sort scripts of type 'number' and 'string' +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; +}