From 0aa2a33a70e1164408f9ef7e495e1d525edfb7f4 Mon Sep 17 00:00:00 2001 From: tsushanth Date: Mon, 20 Jul 2026 13:30:19 -0700 Subject: [PATCH 1/2] fix(filters): sort comparator for LowCardinality fields returns 0 for equal elements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The comparator previously returned 1 (b before a) for any pair that was not (a=LC, b=!LC), including when both fields have the same cardinality. A comparator that never returns 0 is not a valid comparator — it violates the antisymmetry requirement and can produce non-deterministic ordering across JS engines. Fixed by computing the sort key as the difference of boolean-to-int conversions, which correctly returns -1/0/1 for all three cases. --- packages/app/src/components/DBSearchPageFilters/hooks.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app/src/components/DBSearchPageFilters/hooks.ts b/packages/app/src/components/DBSearchPageFilters/hooks.ts index fa0ccfd70e..95d650f417 100644 --- a/packages/app/src/components/DBSearchPageFilters/hooks.ts +++ b/packages/app/src/components/DBSearchPageFilters/hooks.ts @@ -89,7 +89,7 @@ function useFacetsFromRawTables({ // First show low cardinality fields const isLowCardinality = (type: string) => type.includes('LowCardinality'); - return isLowCardinality(a.type) && !isLowCardinality(b.type) ? -1 : 1; + return (isLowCardinality(b.type) ? 1 : 0) - (isLowCardinality(a.type) ? 1 : 0); }) .filter( field => field.jsType && ['string'].includes(field.jsType), From a859182a816017f0ec36ec45b2fc3a71348f88e5 Mon Sep 17 00:00:00 2001 From: Jordan Simonovski Date: Tue, 21 Jul 2026 15:25:16 +1000 Subject: [PATCH 2/2] style(app): format sort comparator to satisfy prettier --- packages/app/src/components/DBSearchPageFilters/hooks.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/app/src/components/DBSearchPageFilters/hooks.ts b/packages/app/src/components/DBSearchPageFilters/hooks.ts index a6199b085b..8c4b924bb8 100644 --- a/packages/app/src/components/DBSearchPageFilters/hooks.ts +++ b/packages/app/src/components/DBSearchPageFilters/hooks.ts @@ -85,7 +85,10 @@ function useFacets({ // First show low cardinality fields const isLowCardinality = (type: string) => type.includes('LowCardinality'); - return (isLowCardinality(b.type) ? 1 : 0) - (isLowCardinality(a.type) ? 1 : 0); + return ( + (isLowCardinality(b.type) ? 1 : 0) - + (isLowCardinality(a.type) ? 1 : 0) + ); }) .filter( field => field.jsType && ['string'].includes(field.jsType),