Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: slow queries for account linking #248

Merged
merged 2 commits into from
Feb 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,24 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [8.0.1]

- Fixes slow queries for account linking

### Migration

```sql
CREATE INDEX IF NOT EXISTS emailpassword_users_email_index ON emailpassword_users (app_id, email);
CREATE INDEX IF NOT EXISTS emailpassword_user_to_tenant_email_index ON emailpassword_user_to_tenant (app_id, tenant_id, email);

CREATE INDEX IF NOT EXISTS passwordless_users_email_index ON passwordless_users (app_id, email);
CREATE INDEX IF NOT EXISTS passwordless_users_phone_number_index ON passwordless_users (app_id, phone_number);
CREATE INDEX IF NOT EXISTS passwordless_user_to_tenant_email_index ON passwordless_user_to_tenant (app_id, tenant_id, email);
CREATE INDEX IF NOT EXISTS passwordless_user_to_tenant_phone_number_index ON passwordless_user_to_tenant (app_id, tenant_id, phone_number);

CREATE INDEX IF NOT EXISTS thirdparty_user_to_tenant_third_party_user_id_index ON thirdparty_user_to_tenant (app_id, tenant_id, third_party_id, third_party_user_id);
```

## [8.0.0]

- Adds tables and queries for Bulk Import
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ plugins {
id 'java-library'
}

version = "8.0.0"
version = "8.0.1"

repositories {
mavenCentral()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,11 @@ static String getQueryToCreateUsersTable(Start start) {
// @formatter:on
}

static String getQueryToCreateEmailPasswordUsersEmailIndex(Start start) {
return "CREATE INDEX emailpassword_users_email_index ON "
+ Config.getConfig(start).getEmailPasswordUsersTable() + "(app_id, email);";
}

static String getQueryToCreateEmailPasswordUserToTenantTable(Start start) {
String schema = Config.getConfig(start).getTableSchema();
String emailPasswordUserToTenantTable = Config.getConfig(start).getEmailPasswordUserToTenantTable();
Expand All @@ -84,6 +89,11 @@ static String getQueryToCreateEmailPasswordUserToTenantTable(Start start) {
// @formatter:on
}

static String getQueryToCreateEmailPasswordUserToTenantEmailIndex(Start start) {
return "CREATE INDEX emailpassword_user_to_tenant_email_index ON "
+ Config.getConfig(start).getEmailPasswordUserToTenantTable() + "(app_id, tenant_id, email);";
}

static String getQueryToCreatePasswordResetTokensTable(Start start) {
String schema = Config.getConfig(start).getTableSchema();
String passwordResetTokensTable = Config.getConfig(start).getPasswordResetTokensTable();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -389,12 +389,19 @@ public static void createTablesIfNotExists(Start start, Connection con) throws S
if (!doesTableExists(start, con, Config.getConfig(start).getEmailPasswordUsersTable())) {
getInstance(start).addState(CREATING_NEW_TABLE, null);
update(con, EmailPasswordQueries.getQueryToCreateUsersTable(start), NO_OP_SETTER);

// index
update(con, EmailPasswordQueries.getQueryToCreateEmailPasswordUsersEmailIndex(start), NO_OP_SETTER);
}

if (!doesTableExists(start, con, Config.getConfig(start).getEmailPasswordUserToTenantTable())) {
getInstance(start).addState(CREATING_NEW_TABLE, null);
update(con, EmailPasswordQueries.getQueryToCreateEmailPasswordUserToTenantTable(start),
NO_OP_SETTER);

// index
update(con, EmailPasswordQueries.getQueryToCreateEmailPasswordUserToTenantEmailIndex(start),
NO_OP_SETTER);
}

if (!doesTableExists(start, con, Config.getConfig(start).getPasswordResetTokensTable())) {
Expand Down Expand Up @@ -432,6 +439,9 @@ public static void createTablesIfNotExists(Start start, Connection con) throws S
if (!doesTableExists(start, con, Config.getConfig(start).getThirdPartyUserToTenantTable())) {
getInstance(start).addState(CREATING_NEW_TABLE, null);
update(con, ThirdPartyQueries.getQueryToCreateThirdPartyUserToTenantTable(start), NO_OP_SETTER);

// index
update(con, ThirdPartyQueries.getQueryToCreateThirdPartyUserToTenantThirdPartyUserIdIndex(start), NO_OP_SETTER);
}

if (!doesTableExists(start, con, Config.getConfig(start).getJWTSigningKeysTable())) {
Expand All @@ -451,12 +461,19 @@ public static void createTablesIfNotExists(Start start, Connection con) throws S
update(con, getQueryToCreateUserIdAppIdIndexForUsersTable(start), NO_OP_SETTER);
update(con, getQueryToCreateAppIdIndexForUsersTable(start), NO_OP_SETTER);
update(con, getQueryToCreateTenantIdIndexForUsersTable(start), NO_OP_SETTER);

update(con, PasswordlessQueries.getQueryToCreatePasswordlessUsersEmailIndex(start), NO_OP_SETTER);
update(con, PasswordlessQueries.getQueryToCreatePasswordlessUsersPhoneNumberIndex(start), NO_OP_SETTER);
}

if (!doesTableExists(start, con, Config.getConfig(start).getPasswordlessUserToTenantTable())) {
getInstance(start).addState(CREATING_NEW_TABLE, null);
update(con, PasswordlessQueries.getQueryToCreatePasswordlessUserToTenantTable(start),
NO_OP_SETTER);

// index
update(con, PasswordlessQueries.getQueryToCreatePasswordlessUserToTenantEmailIndex(start), NO_OP_SETTER);
update(con, PasswordlessQueries.getQueryToCreatePasswordlessUserToTenantPhoneNumberIndex(start), NO_OP_SETTER);
}

if (!doesTableExists(start, con, Config.getConfig(start).getPasswordlessDevicesTable())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,16 @@ public static String getQueryToCreateUsersTable(Start start) {
+ ");";
}

static String getQueryToCreatePasswordlessUsersEmailIndex(Start start) {
return "CREATE INDEX passwordless_users_email_index ON "
+ Config.getConfig(start).getPasswordlessUsersTable() + "(app_id, email);";
}

static String getQueryToCreatePasswordlessUsersPhoneNumberIndex(Start start) {
return "CREATE INDEX passwordless_users_phone_number_index ON "
+ Config.getConfig(start).getPasswordlessUsersTable() + "(app_id, phone_number);";
}

static String getQueryToCreatePasswordlessUserToTenantTable(Start start) {
String schema = Config.getConfig(start).getTableSchema();
String passwordlessUserToTenantTable = Config.getConfig(start).getPasswordlessUserToTenantTable();
Expand All @@ -90,6 +100,16 @@ static String getQueryToCreatePasswordlessUserToTenantTable(Start start) {
// @formatter:on
}

static String getQueryToCreatePasswordlessUserToTenantEmailIndex(Start start) {
return "CREATE INDEX passwordless_user_to_tenant_email_index ON "
+ Config.getConfig(start).getPasswordlessUserToTenantTable() + "(app_id, tenant_id, email);";
}

static String getQueryToCreatePasswordlessUserToTenantPhoneNumberIndex(Start start) {
return "CREATE INDEX passwordless_user_to_tenant_phone_number_index ON "
+ Config.getConfig(start).getPasswordlessUserToTenantTable() + "(app_id, tenant_id, phone_number);";
}

public static String getQueryToCreateDevicesTable(Start start) {
String schema = Config.getConfig(start).getTableSchema();
String devicesTable = Config.getConfig(start).getPasswordlessDevicesTable();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,11 @@ static String getQueryToCreateThirdPartyUserToTenantTable(Start start) {
// @formatter:on
}

static String getQueryToCreateThirdPartyUserToTenantThirdPartyUserIdIndex(Start start) {
return "CREATE INDEX thirdparty_user_to_tenant_third_party_user_id_index ON "
+ Config.getConfig(start).getThirdPartyUserToTenantTable() + "(app_id, tenant_id, third_party_id, third_party_user_id);";
}

public static AuthRecipeUserInfo signUp(Start start, TenantIdentifier tenantIdentifier, String id, String email,
LoginMethod.ThirdParty thirdParty, long timeJoined)
throws StorageQueryException, StorageTransactionLogicException {
Expand Down
Loading