# HG changeset patch # User bpatel # Date 1486656079 28800 # Node ID 515fe48569fe011725ad23cc651a0bae4d81c48a # Parent f50592785b30b99a293b8359ed6ec3a37cce3a06 8168965: search items are not listed in any sensible order Reviewed-by: jjg, ksrini Contributed-by: michel.trudeau@oracle.com diff -r f50592785b30 -r 515fe48569fe langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/search.js --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/search.js Thu Feb 09 15:19:05 2017 +0000 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/search.js Thu Feb 09 08:01:19 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -169,11 +169,42 @@ var tresult = new Array(); var mresult = new Array(); var tgresult = new Array(); + var secondaryresult = new Array(); var displayCount = 0; var exactMatcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(request.term) + "$", "i"); camelCaseRegexp = ($.ui.autocomplete.escapeRegex(request.term)).split(/(?=[A-Z])/).join("([a-z0-9_$]*?)"); var camelCaseMatcher = new RegExp("^" + camelCaseRegexp); secondaryMatcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i"); + + // Return the nested innermost name from the specified object + function nestedName(e) { + return e.l.substring(e.l.lastIndexOf(".") + 1); + } + + // Sort array items by short name (as opposed to fully qualified name). + // Additionally, sort by the nested type name, when present, + // as opposed to top level short name. + function sortAndConcatResults(a1, a2) { + var sortingKey; + var sortArray = function(e1, e2) { + var l = sortingKey(e1); + var m = sortingKey(e2); + if (l < m) + return -1; + if (l > m) + return 1; + return 0; + }; + sortingKey = function(e) { + return nestedName(e).toUpperCase(); + }; + a1.sort(sortArray); + a2.sort(sortArray); + a1 = a1.concat(a2); + a2.length = 0; + return a1; + } + if (moduleSearchIndex) { var mdleCount = 0; $.each(moduleSearchIndex, function(index, item) { @@ -184,10 +215,11 @@ } else if (camelCaseMatcher.test(item.l)) { result.unshift(item); } else if (secondaryMatcher.test(item.l)) { - result.push(item); + secondaryresult.push(item); } }); displayCount = mdleCount; + result = sortAndConcatResults(result, secondaryresult); } if (packageSearchIndex) { var pCount = 0; @@ -197,48 +229,51 @@ pkg = (item.m) ? (item.m + "/" + item.l) : item.l; - if (exactMatcher.test(item.l)) { + var s = nestedName(item); + if (exactMatcher.test(s)) { presult.unshift(item); pCount++; } else if (camelCaseMatcher.test(pkg)) { presult.unshift(item); } else if (secondaryMatcher.test(pkg)) { - presult.push(item); + secondaryresult.push(item); } }); - result = result.concat(presult); + result = result.concat(sortAndConcatResults(presult, secondaryresult)); displayCount = (pCount > displayCount) ? pCount : displayCount; } if (typeSearchIndex) { var tCount = 0; $.each(typeSearchIndex, function(index, item) { item[category] = catTypes; - if (exactMatcher.test(item.l)) { + var s = nestedName(item); + if (exactMatcher.test(s)) { tresult.unshift(item); tCount++; - } else if (camelCaseMatcher.test(item.l)) { + } else if (camelCaseMatcher.test(s)) { tresult.unshift(item); } else if (secondaryMatcher.test(item.p + "." + item.l)) { - tresult.push(item); + secondaryresult.push(item); } }); - result = result.concat(tresult); + result = result.concat(sortAndConcatResults(tresult, secondaryresult)); displayCount = (tCount > displayCount) ? tCount : displayCount; } if (memberSearchIndex) { var mCount = 0; $.each(memberSearchIndex, function(index, item) { item[category] = catMembers; - if (exactMatcher.test(item.l)) { + var s = nestedName(item); + if (exactMatcher.test(s)) { mresult.unshift(item); mCount++; - } else if (camelCaseMatcher.test(item.l)) { + } else if (camelCaseMatcher.test(s)) { mresult.unshift(item); } else if (secondaryMatcher.test(item.c + "." + item.l)) { - mresult.push(item); + secondaryresult.push(item); } }); - result = result.concat(mresult); + result = result.concat(sortAndConcatResults(mresult, secondaryresult)); displayCount = (mCount > displayCount) ? mCount : displayCount; } if (tagSearchIndex) { @@ -249,10 +284,10 @@ tgresult.unshift(item); tgCount++; } else if (secondaryMatcher.test(item.l)) { - tgresult.push(item); + secondaryresult.push(item); } }); - result = result.concat(tgresult); + result = result.concat(sortAndConcatResults(tgresult, secondaryresult)); displayCount = (tgCount > displayCount) ? tgCount : displayCount; } displayCount = (displayCount > 500) ? displayCount : 500; @@ -312,4 +347,4 @@ } } }); -}); \ No newline at end of file +}); diff -r f50592785b30 -r 515fe48569fe langtools/test/jdk/javadoc/doclet/testSearch/TestSearch.java --- a/langtools/test/jdk/javadoc/doclet/testSearch/TestSearch.java Thu Feb 09 15:19:05 2017 +0000 +++ b/langtools/test/jdk/javadoc/doclet/testSearch/TestSearch.java Thu Feb 09 08:01:19 2017 -0800 @@ -23,7 +23,7 @@ /* * @test - * @bug 8141492 8071982 8141636 8147890 8166175 + * @bug 8141492 8071982 8141636 8147890 8166175 8168965 * @summary Test the search feature of javadoc. * @author bpatel * @library ../lib @@ -486,6 +486,9 @@ checkOutput("search.js", true, "camelCaseRegexp = ($.ui.autocomplete.escapeRegex(request.term)).split(/(?=[A-Z])/).join(\"([a-z0-9_$]*?)\");", "var camelCaseMatcher = new RegExp(\"^\" + camelCaseRegexp);", - "camelCaseMatcher.test(item.l)"); + "camelCaseMatcher.test(item.l)", + "var secondaryresult = new Array();", + "function nestedName(e) {", + "function sortAndConcatResults(a1, a2) {"); } }