From 2daa59f0d64b17999f2a518b302b1319012fa012 Mon Sep 17 00:00:00 2001 From: Julien Cavaleiro Date: Wed, 21 Jan 2026 19:39:26 +0100 Subject: [PATCH 1/2] fix overlaps array filter predicates by using arrayOverlaps() function --- src/utils/feed.server.ts | 26 +++++++------------------- src/utils/showcase.server.ts | 16 +++++++++++----- src/utils/users.server.ts | 10 +++++----- 3 files changed, 23 insertions(+), 29 deletions(-) diff --git a/src/utils/feed.server.ts b/src/utils/feed.server.ts index c1aca284..07a77cd3 100644 --- a/src/utils/feed.server.ts +++ b/src/utils/feed.server.ts @@ -1,5 +1,5 @@ import { feedEntries } from '~/db/schema' -import { eq, and, sql, inArray, gte, lte } from 'drizzle-orm' +import { eq, and, sql, inArray, gte, lte, arrayOverlaps } from 'drizzle-orm' import { getAuthenticatedUser } from './auth.server-helpers' import { getEffectiveCapabilities } from './capabilities.server' import type { EntryType, ReleaseLevel } from '~/db/schema' @@ -110,12 +110,10 @@ export function buildFeedQueryConditions( filters.libraries && filters.libraries.length > 0 ) { - conditions.push( - sql`${feedEntries.libraryIds} && ARRAY[${sql.join( - filters.libraries.map((l) => sql`${l}`), - sql`, `, - )}]::text[]`, - ) + conditions.push(arrayOverlaps(feedEntries.libraryIds, filters.libraries)) + // conditions.push( + // sql`${feedEntries.libraryIds} && ${filters.libraries}::text[]`, + // ) } // Partner filter (array overlap) - use parameterized array @@ -124,22 +122,12 @@ export function buildFeedQueryConditions( filters.partners && filters.partners.length > 0 ) { - conditions.push( - sql`${feedEntries.partnerIds} && ARRAY[${sql.join( - filters.partners.map((p) => sql`${p}`), - sql`, `, - )}]::text[]`, - ) + conditions.push(arrayOverlaps(feedEntries.partnerIds, filters.partners)) } // Tag filter (array overlap) - use parameterized array if (excludeFacet !== 'tags' && filters.tags && filters.tags.length > 0) { - conditions.push( - sql`${feedEntries.tags} && ARRAY[${sql.join( - filters.tags.map((t) => sql`${t}`), - sql`, `, - )}]::text[]`, - ) + conditions.push(arrayOverlaps(feedEntries.tags, filters.tags)) } // Featured filter diff --git a/src/utils/showcase.server.ts b/src/utils/showcase.server.ts index 3f6cceb2..89e84471 100644 --- a/src/utils/showcase.server.ts +++ b/src/utils/showcase.server.ts @@ -6,7 +6,16 @@ import { type ShowcaseStatus, type ShowcaseUseCase, } from '~/db/schema' -import { and, eq, or, sql, desc, arrayContains, isNotNull } from 'drizzle-orm' +import { + and, + eq, + or, + sql, + desc, + arrayContains, + isNotNull, + arrayOverlaps, +} from 'drizzle-orm' import { requireCapability } from './auth.server' import { getEffectiveCapabilities } from './capabilities.server' import { libraryIds } from '~/libraries' @@ -525,10 +534,7 @@ export async function searchShowcasesCore( if (filters.useCases && filters.useCases.length > 0) { conditions.push( - sql`${showcases.useCases} && ARRAY[${sql.join( - filters.useCases.map((uc) => sql`${uc}`), - sql`, `, - )}]::showcase_use_case[]`, + arrayOverlaps(showcases.useCases, filters.useCases as ShowcaseUseCase[]), ) } diff --git a/src/utils/users.server.ts b/src/utils/users.server.ts index 4a037188..4e6a553f 100644 --- a/src/utils/users.server.ts +++ b/src/utils/users.server.ts @@ -1,7 +1,7 @@ import { createServerFn } from '@tanstack/react-start' import { db } from '~/db/client' import { users } from '~/db/schema' -import { eq, and, or, ilike, sql, asc, desc } from 'drizzle-orm' +import { eq, and, or, ilike, sql, asc, desc, arrayOverlaps } from 'drizzle-orm' import type { InferSelectModel } from 'drizzle-orm' import { getAuthenticatedUser } from './auth.server-helpers' import { getBulkEffectiveCapabilities } from './capabilities.server' @@ -109,10 +109,10 @@ export const listUsers = createServerFn({ method: 'POST' }) ) { // Use PostgreSQL array overlap operator (&&) with parameterized values conditions.push( - sql`${users.capabilities} && ARRAY[${sql.join( - data.capabilityFilter.map((c) => sql`${c}`), - sql`, `, - )}]::capability[]`, + arrayOverlaps( + users.capabilities, + data.capabilityFilter as Capability[], + ), ) } From 24ca308c670479406619cf58b549793be10777bd Mon Sep 17 00:00:00 2001 From: Julien Cavaleiro Date: Wed, 21 Jan 2026 19:57:14 +0100 Subject: [PATCH 2/2] remove comments from testing --- src/utils/feed.server.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/utils/feed.server.ts b/src/utils/feed.server.ts index 07a77cd3..89c22905 100644 --- a/src/utils/feed.server.ts +++ b/src/utils/feed.server.ts @@ -111,9 +111,6 @@ export function buildFeedQueryConditions( filters.libraries.length > 0 ) { conditions.push(arrayOverlaps(feedEntries.libraryIds, filters.libraries)) - // conditions.push( - // sql`${feedEntries.libraryIds} && ${filters.libraries}::text[]`, - // ) } // Partner filter (array overlap) - use parameterized array