8168965: search items are not listed in any sensible order
Reviewed-by: jjg, ksrini
Contributed-by: michel.trudeau@oracle.com
--- 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
+});
--- 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) {");
}
}