This is an automated email from the ASF dual-hosted git repository.
rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new 6856d0fc671 fix(select): rank case-insensitive matches consistently in
dropdown search (#42408)
6856d0fc671 is described below
commit 6856d0fc671dda62f4f305212b66e1bef8e8203e
Author: Sepuri Sai Krishna <[email protected]>
AuthorDate: Mon Jul 27 07:59:30 2026 +0530
fix(select): rank case-insensitive matches consistently in dropdown search
(#42408)
---
.../src/utils/rankedSearchCompare.test.ts | 27 ++++++++++++++++++++++
.../src/utils/rankedSearchCompare.ts | 3 ++-
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git
a/superset-frontend/packages/superset-ui-core/src/utils/rankedSearchCompare.test.ts
b/superset-frontend/packages/superset-ui-core/src/utils/rankedSearchCompare.test.ts
index a72f3e25024..19706acd58e 100644
---
a/superset-frontend/packages/superset-ui-core/src/utils/rankedSearchCompare.test.ts
+++
b/superset-frontend/packages/superset-ui-core/src/utils/rankedSearchCompare.test.ts
@@ -66,3 +66,30 @@ test('falls back to localeCompare when strings have no match
relationship to sea
expect(rankedSearchCompare('abc', 'def', 'xyz')).toBeLessThan(0);
expect(rankedSearchCompare('def', 'abc', 'xyz')).toBeGreaterThan(0);
});
+
+test('ranks a case-insensitive substring match above a non-match', () => {
+ // `zzABCzz` contains the search term ignoring case, `aaaa` does not match at
+ // all, so the match must win even though localeCompare would order it last.
+ expect(rankedSearchCompare('zzABCzz', 'aaaa', 'abc')).toBeLessThan(0);
+ expect(rankedSearchCompare('aaaa', 'zzABCzz', 'abc')).toBeGreaterThan(0);
+ expect(['aaaa', 'zzABCzz'].sort(searchSort('abc'))).toEqual([
+ 'zzABCzz',
+ 'aaaa',
+ ]);
+});
+
+test('is antisymmetric so Array.prototype.sort stays well defined', () => {
+ const pairs: [string, string, string][] = [
+ ['zzABCzz', 'aaaa', 'abc'],
+ ['Total Revenue', 'ARR', 'revenue'],
+ ['My Country', 'zzz', 'country'],
+ ['%f %B', '%F %b', '%F'],
+ ['her', 'Cher', 'Her'],
+ ];
+ pairs.forEach(([a, b, search]) => {
+ expect(
+ Math.sign(rankedSearchCompare(a, b, search)) +
+ Math.sign(rankedSearchCompare(b, a, search)),
+ ).toBe(0);
+ });
+});
diff --git
a/superset-frontend/packages/superset-ui-core/src/utils/rankedSearchCompare.ts
b/superset-frontend/packages/superset-ui-core/src/utils/rankedSearchCompare.ts
index 385244e4cba..f9bddd5bb92 100644
---
a/superset-frontend/packages/superset-ui-core/src/utils/rankedSearchCompare.ts
+++
b/superset-frontend/packages/superset-ui-core/src/utils/rankedSearchCompare.ts
@@ -32,7 +32,8 @@ export function rankedSearchCompare(a: string, b: string,
search: string) {
Number(bLower.startsWith(searchLower)) -
Number(aLower.startsWith(searchLower)) ||
Number(b.includes(search)) - Number(a.includes(search)) ||
- Number(bLower.includes(searchLower)) - Number(a.includes(searchLower)) ||
+ Number(bLower.includes(searchLower)) -
+ Number(aLower.includes(searchLower)) ||
a.localeCompare(b)
);
}