Skip to content

Commit

Permalink
fix: slow queries for account linking (#154)
Browse files Browse the repository at this point in the history
  • Loading branch information
sattvikc authored Feb 11, 2025
1 parent 6032c84 commit 5bc5f53
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 1 deletion.
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 emailpassword_users_email_index ON emailpassword_users (app_id, email);
CREATE INDEX emailpassword_user_to_tenant_email_index ON emailpassword_user_to_tenant (app_id, tenant_id, email);

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

CREATE INDEX 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 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 @@ -57,6 +57,11 @@ static String getQueryToCreateUsersTable(Start start) {
+ ");";
}

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 emailPasswordUserToTenantTable = Config.getConfig(start).getEmailPasswordUserToTenantTable();
// @formatter:off
Expand All @@ -74,6 +79,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) {
return "CREATE TABLE IF NOT EXISTS " + getConfig(start).getPasswordResetTokensTable() + " ("
+ "app_id VARCHAR(64) DEFAULT 'public',"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -288,12 +288,18 @@ 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 @@ -326,6 +332,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 @@ -336,12 +345,20 @@ public static void createTablesIfNotExists(Start start, Connection con) throws S
if (!doesTableExists(start, con, Config.getConfig(start).getPasswordlessUsersTable())) {
getInstance(start).addState(CREATING_NEW_TABLE, null);
update(con, PasswordlessQueries.getQueryToCreateUsersTable(start), NO_OP_SETTER);

// index
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 @@ -61,6 +61,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 passwordlessUserToTenantTable = Config.getConfig(start).getPasswordlessUserToTenantTable();
// @formatter:off
Expand All @@ -80,6 +90,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) {
return "CREATE TABLE IF NOT EXISTS " + getConfig(start).getPasswordlessDevicesTable() + " ("
+ "app_id VARCHAR(64) DEFAULT 'public',"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,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

0 comments on commit 5bc5f53

Please sign in to comment.