From 4595d9a96fe18016502aae440461f0cba3bdb85d Mon Sep 17 00:00:00 2001 From: Thijs Petter Date: Sat, 30 Jan 2021 14:29:05 +0100 Subject: [PATCH] Additional indices for query database Fixes #179 --- .../api/projection/table/CaseTables.scala | 6 ++++ .../api/projection/table/TaskTables.scala | 3 ++ .../api/projection/table/TenantTables.scala | 2 ++ .../cafienne/service/db/querydb/QueryDB.scala | 4 +-- .../schema/versions/QueryDB_1_1_11.scala | 32 +++++++++++++++++++ 5 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 case-service/src/main/scala/org/cafienne/service/db/querydb/schema/versions/QueryDB_1_1_11.scala diff --git a/case-service/src/main/scala/org/cafienne/service/api/projection/table/CaseTables.scala b/case-service/src/main/scala/org/cafienne/service/api/projection/table/CaseTables.scala index 408050fa7..f15a6a4fc 100644 --- a/case-service/src/main/scala/org/cafienne/service/api/projection/table/CaseTables.scala +++ b/case-service/src/main/scala/org/cafienne/service/api/projection/table/CaseTables.scala @@ -62,6 +62,8 @@ trait CaseTables extends QueryDBSchema { def indexTenant = index(tenant) def indexRootCaseId = index(rootCaseId) def indexCaseName = index(caseName) + def indexCreatedBy = index(createdBy) + def indexModifiedBy = index(modifiedBy) def * = (id, tenant, caseName, state, failures, parentCaseId, rootCaseId, lastModified, modifiedBy, createdOn, createdBy, caseInput, caseOutput) <> (CaseRecord.tupled, CaseRecord.unapply) } @@ -134,6 +136,8 @@ trait CaseTables extends QueryDBSchema { def * = (id, definitionId, stageId, name, index, caseInstanceId, tenant, currentState, historyState, transition, planItemType, repeating, required, lastModified, modifiedBy, createdOn, createdBy, taskInput, taskOutput, mappedInput, rawOutput) <> (PlanItemRecord.tupled, PlanItemRecord.unapply) def indexCaseInstanceId = index(caseInstanceId) + def indexCreatedBy = index(createdBy) + def indexModifiedBy = index(modifiedBy) } final class PlanItemHistoryTable(tag: Tag) extends CafienneTable[PlanItemHistoryRecord](tag, "plan_item_history") { @@ -183,6 +187,7 @@ trait CaseTables extends QueryDBSchema { def * = (id, planItemId, stageId, name, index, caseInstanceId, tenant, currentState, historyState,transition, planItemType, repeating, required, lastModified, modifiedBy, eventType, sequenceNr, taskInput, taskOutput, mappedInput, rawOutput) <> (PlanItemHistoryRecord.tupled, PlanItemHistoryRecord.unapply) def idx = index("idx_plan_item_history__plain_item_id", planItemId) + def indexModifiedBy = index(modifiedBy) } class CaseFileTable(tag: Tag) extends CafienneTable[CaseFileRecord](tag, "case_file") { @@ -260,5 +265,6 @@ trait CaseTables extends QueryDBSchema { def * = (caseInstanceId, tenant, memberId, caseRole, isTenantUser, isOwner, active) <> (CaseTeamMemberRecord.tupled, CaseTeamMemberRecord.unapply) val indexCaseInstanceId = index(caseInstanceId) + def indexMemberId = index(generateIndexName(memberId), (memberId, isTenantUser)) } } diff --git a/case-service/src/main/scala/org/cafienne/service/api/projection/table/TaskTables.scala b/case-service/src/main/scala/org/cafienne/service/api/projection/table/TaskTables.scala index 23506e3e1..e68183c01 100644 --- a/case-service/src/main/scala/org/cafienne/service/api/projection/table/TaskTables.scala +++ b/case-service/src/main/scala/org/cafienne/service/api/projection/table/TaskTables.scala @@ -61,6 +61,9 @@ trait TaskTables extends QueryDBSchema { def indexCaseInstanceId = index(caseInstanceId) def indexTaskState = index(taskState) def indexAssignee = index(assignee) + def indexOwner = index(owner) + def indexCreatedBy = index(createdBy) + def indexModifiedBy = index(modifiedBy) def indexTenant = index(tenant) def indexDueDate = index(generateIndexName(dueDate), dueDate) diff --git a/case-service/src/main/scala/org/cafienne/service/api/projection/table/TenantTables.scala b/case-service/src/main/scala/org/cafienne/service/api/projection/table/TenantTables.scala index f5de224ad..fa5275de3 100644 --- a/case-service/src/main/scala/org/cafienne/service/api/projection/table/TenantTables.scala +++ b/case-service/src/main/scala/org/cafienne/service/api/projection/table/TenantTables.scala @@ -53,6 +53,8 @@ trait TenantTables extends QueryDBSchema { // By default when inserting a user or role, enabled is true; // right now, it does not make sense to enter a user without enabling it def enabled = column[Boolean]("enabled", O.Default(true)) + + def indexOwnership = index(generateIndexName(isOwner), (userId, tenant, role_name, isOwner)) } } \ No newline at end of file diff --git a/case-service/src/main/scala/org/cafienne/service/db/querydb/QueryDB.scala b/case-service/src/main/scala/org/cafienne/service/db/querydb/QueryDB.scala index 0f5eaa59d..17c604f87 100644 --- a/case-service/src/main/scala/org/cafienne/service/db/querydb/QueryDB.scala +++ b/case-service/src/main/scala/org/cafienne/service/db/querydb/QueryDB.scala @@ -1,10 +1,10 @@ package org.cafienne.service.db.querydb import org.cafienne.infrastructure.jdbc.schema.CafienneDatabaseDefinition -import org.cafienne.service.db.querydb.schema.versions.{QueryDB_1_0_0, QueryDB_1_1_10, QueryDB_1_1_5, QueryDB_1_1_6} +import org.cafienne.service.db.querydb.schema.versions.{QueryDB_1_0_0, QueryDB_1_1_10, QueryDB_1_1_11, QueryDB_1_1_5, QueryDB_1_1_6} object QueryDB extends CafienneDatabaseDefinition with QueryDBSchema { def verifyConnectivity() { - useSchema(Seq(QueryDB_1_0_0, QueryDB_1_1_5, QueryDB_1_1_6, QueryDB_1_1_10)) + useSchema(Seq(QueryDB_1_0_0, QueryDB_1_1_5, QueryDB_1_1_6, QueryDB_1_1_10, QueryDB_1_1_11)) } } diff --git a/case-service/src/main/scala/org/cafienne/service/db/querydb/schema/versions/QueryDB_1_1_11.scala b/case-service/src/main/scala/org/cafienne/service/db/querydb/schema/versions/QueryDB_1_1_11.scala new file mode 100644 index 000000000..65ab71c4b --- /dev/null +++ b/case-service/src/main/scala/org/cafienne/service/db/querydb/schema/versions/QueryDB_1_1_11.scala @@ -0,0 +1,32 @@ +package org.cafienne.service.db.querydb.schema.versions + +import org.cafienne.infrastructure.jdbc.schema.DbSchemaVersion +import org.cafienne.service.api.projection.table.{CaseTables, TaskTables, TenantTables} +import org.cafienne.service.db.querydb.QueryDBSchema +import slick.migration.api.TableMigration + +object QueryDB_1_1_11 extends DbSchemaVersion with QueryDBSchema + with CaseTables + with TaskTables + with TenantTables { + + val version = "1.1.11" + val migrations = ( + // These indices are required for faster updating platform user id's + // Probably also some queries on tasks may become faster ... + addPlanItemIndices & addPlanItemHistoryIndex & addCaseIndices & addCaseTeamIndex & addTaskIndices + + // This index is needed to optimize tenant queries + & addUserRoleIndex + ) + + import dbConfig.profile.api._ + + def addPlanItemIndices = TableMigration(TableQuery[PlanItemTable])addIndexes(_.indexCreatedBy, _.indexModifiedBy) + def addPlanItemHistoryIndex = TableMigration(TableQuery[PlanItemHistoryTable])addIndexes(_.indexModifiedBy) + def addCaseIndices = TableMigration(TableQuery[CaseInstanceTable])addIndexes(_.indexCreatedBy, _.indexModifiedBy) + def addCaseTeamIndex = TableMigration(TableQuery[CaseInstanceTeamMemberTable])addIndexes(_.indexMemberId) + def addTaskIndices = TableMigration(TableQuery[TaskTable])addIndexes(_.indexOwner, _.indexCreatedBy, _.indexModifiedBy) + def addUserRoleIndex = TableMigration(TableQuery[UserRoleTable])addIndexes(_.indexOwnership) + +}