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)
   );
 }

Reply via email to