[PR #4587] [CLOSED] chore: try working on join optimization in the adapter #22365

Closed
opened 2026-04-15 20:59:43 -05:00 by GiteaMirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/better-auth/better-auth/pull/4587
Author: @XavierGeerinck
Created: 9/11/2025
Status: Closed

Base: mainHead: feat-support-join


📝 Commits (2)

  • e6b125e chore: try working on join optimization in the adapter
  • 294a17a fix: import Join on top-level and change any[] to Join[] in some cases

📊 Changes

17 files changed (+2624 additions, -168 deletions)

View changed files

📝 packages/better-auth/src/adapters/create-adapter/index.ts (+35 -4)
📝 packages/better-auth/src/adapters/create-adapter/types.ts (+7 -0)
📝 packages/better-auth/src/adapters/drizzle-adapter/drizzle-adapter.ts (+253 -42)
packages/better-auth/src/adapters/drizzle-adapter/test/join/adapter.drizzle.join.test.ts (+88 -0)
packages/better-auth/src/adapters/join-test.ts (+380 -0)
📝 packages/better-auth/src/adapters/kysely-adapter/kysely-adapter.ts (+226 -14)
packages/better-auth/src/adapters/kysely-adapter/test/join/adapter.kysely.join.test.ts (+89 -0)
packages/better-auth/src/adapters/kysely-join.test.ts (+121 -0)
📝 packages/better-auth/src/adapters/memory-adapter/memory-adapter.ts (+160 -16)
packages/better-auth/src/adapters/memory-adapter/test/join/adapter.memory.join.test.ts (+48 -0)
📝 packages/better-auth/src/adapters/mongodb-adapter/mongodb-adapter.ts (+321 -32)
packages/better-auth/src/adapters/mongodb-adapter/test/join/adapter.mongodb.join.test.ts (+211 -0)
📝 packages/better-auth/src/adapters/prisma-adapter/prisma-adapter.ts (+191 -12)
packages/better-auth/src/adapters/prisma-adapter/test/join/adapter.prisma.join.test.ts (+384 -0)
packages/better-auth/src/adapters/prisma-adapter/test/join/schema.prisma (+45 -0)
📝 packages/better-auth/src/plugins/organization/adapter.ts (+42 -47)
📝 packages/better-auth/src/types/adapter.ts (+23 -1)

📄 Description

This PR tries to tackle the missing JOIN operation in the adapters that can optimize some queries.
I'm currently mainly looking as well how the tests for the adapters should look like, but currently most of them are passing (besides the Drizzle one)
Issue Reference: https://github.com/better-auth/better-auth/issues/4586

Changes

Before - Multiple Queries

const members = await adapter.findMany({ model: "member", where: [...] });
const users = await adapter.findMany({ 
  model: "user", 
  where: [{ field: "id", operator: "in", value: memberIds }] 
});

After - Single JOIN Query

const membersWithUsers = await adapter.findMany({
  model: "member",
  where: [...],
  joins: [{
    type: "inner",
    table: "user",
    on: { left: "member.userId", right: "user.id" },
    select: ["id", "name", "email", "image"]
  }]
});

Summary by cubic

Added JOIN support to adapters to run cross-table queries in a single call, improving performance for list and lookup operations. The organization plugin now fetches members with user data via one joined query.

  • New Features

    • Added joins to Adapter.findOne, findMany, and count (inner/left/right/full, alias, select, on).
    • Implemented JOINs in Kysely, Prisma, MongoDB, and Memory adapters; Drizzle groundwork added.
    • Output preserves join-prefixed fields (table_or_alias_field) when joins are used.
    • Added shared JOIN test suite and adapter-specific tests.
  • Refactors

    • Organization members listing uses a single JOIN to include user data.
    • Adapter factory and types updated to accept and forward joins without breaking existing calls.

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/better-auth/better-auth/pull/4587 **Author:** [@XavierGeerinck](https://github.com/XavierGeerinck) **Created:** 9/11/2025 **Status:** ❌ Closed **Base:** `main` ← **Head:** `feat-support-join` --- ### 📝 Commits (2) - [`e6b125e`](https://github.com/better-auth/better-auth/commit/e6b125e7a6af7aa3aadfef29ab4db977edc93def) chore: try working on join optimization in the adapter - [`294a17a`](https://github.com/better-auth/better-auth/commit/294a17afd786f52a89a2ce53bfe896a1f07f36c6) fix: import Join on top-level and change any[] to Join[] in some cases ### 📊 Changes **17 files changed** (+2624 additions, -168 deletions) <details> <summary>View changed files</summary> 📝 `packages/better-auth/src/adapters/create-adapter/index.ts` (+35 -4) 📝 `packages/better-auth/src/adapters/create-adapter/types.ts` (+7 -0) 📝 `packages/better-auth/src/adapters/drizzle-adapter/drizzle-adapter.ts` (+253 -42) ➕ `packages/better-auth/src/adapters/drizzle-adapter/test/join/adapter.drizzle.join.test.ts` (+88 -0) ➕ `packages/better-auth/src/adapters/join-test.ts` (+380 -0) 📝 `packages/better-auth/src/adapters/kysely-adapter/kysely-adapter.ts` (+226 -14) ➕ `packages/better-auth/src/adapters/kysely-adapter/test/join/adapter.kysely.join.test.ts` (+89 -0) ➕ `packages/better-auth/src/adapters/kysely-join.test.ts` (+121 -0) 📝 `packages/better-auth/src/adapters/memory-adapter/memory-adapter.ts` (+160 -16) ➕ `packages/better-auth/src/adapters/memory-adapter/test/join/adapter.memory.join.test.ts` (+48 -0) 📝 `packages/better-auth/src/adapters/mongodb-adapter/mongodb-adapter.ts` (+321 -32) ➕ `packages/better-auth/src/adapters/mongodb-adapter/test/join/adapter.mongodb.join.test.ts` (+211 -0) 📝 `packages/better-auth/src/adapters/prisma-adapter/prisma-adapter.ts` (+191 -12) ➕ `packages/better-auth/src/adapters/prisma-adapter/test/join/adapter.prisma.join.test.ts` (+384 -0) ➕ `packages/better-auth/src/adapters/prisma-adapter/test/join/schema.prisma` (+45 -0) 📝 `packages/better-auth/src/plugins/organization/adapter.ts` (+42 -47) 📝 `packages/better-auth/src/types/adapter.ts` (+23 -1) </details> ### 📄 Description This PR tries to tackle the missing JOIN operation in the adapters that can optimize some queries. I'm currently mainly looking as well how the tests for the adapters should look like, but currently most of them are passing (besides the Drizzle one) Issue Reference: https://github.com/better-auth/better-auth/issues/4586 ## Changes ### Before - Multiple Queries ```typescript const members = await adapter.findMany({ model: "member", where: [...] }); const users = await adapter.findMany({ model: "user", where: [{ field: "id", operator: "in", value: memberIds }] }); ``` ### After - Single JOIN Query ```typescript const membersWithUsers = await adapter.findMany({ model: "member", where: [...], joins: [{ type: "inner", table: "user", on: { left: "member.userId", right: "user.id" }, select: ["id", "name", "email", "image"] }] }); ``` <!-- This is an auto-generated description by cubic. --> --- ## Summary by cubic Added JOIN support to adapters to run cross-table queries in a single call, improving performance for list and lookup operations. The organization plugin now fetches members with user data via one joined query. - New Features - Added joins to Adapter.findOne, findMany, and count (inner/left/right/full, alias, select, on). - Implemented JOINs in Kysely, Prisma, MongoDB, and Memory adapters; Drizzle groundwork added. - Output preserves join-prefixed fields (table_or_alias_field) when joins are used. - Added shared JOIN test suite and adapter-specific tests. - Refactors - Organization members listing uses a single JOIN to include user data. - Adapter factory and types updated to accept and forward joins without breaking existing calls. <!-- End of auto-generated description by cubic. --> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
GiteaMirror added the pull-request label 2026-04-15 20:59:43 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/better-auth#22365