From 4d3c5845b464f66c191620815d3f007cc77519d1 Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Mon, 17 May 2021 16:36:49 +0200 Subject: [PATCH 1/8] Squale: case --- .../repo/sqale/qmodel/cases/QCaseMapping.java | 33 ++++++++++- .../func/SqaleRepoAddDeleteObjectTest.java | 56 +++++++++++++++++++ 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCaseMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCaseMapping.java index 9ee84f7589a..dbf13db3fbd 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCaseMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCaseMapping.java @@ -8,6 +8,12 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType.*; +import com.evolveum.midpoint.repo.sqale.qmodel.task.MTask; + +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; + +import com.evolveum.midpoint.util.MiscUtil; + import org.jetbrains.annotations.NotNull; import com.evolveum.midpoint.repo.sqale.SqaleRepoContext; @@ -60,5 +66,30 @@ public MCase newRowObject() { return new MCase(); } - // TODO transformation code + @Override + public @NotNull MCase toRowObjectWithoutFullObject( + CaseType acase, JdbcSession jdbcSession) { + MCase row = super.toRowObjectWithoutFullObject(acase, jdbcSession); + + row.state = acase.getState(); + row.closeTimestamp = MiscUtil.asInstant(acase.getCloseTimestamp()); + setReference(acase.getObjectRef(), + o -> row.objectRefTargetOid = o, + t -> row.objectRefTargetType = t, + r -> row.objectRefRelationId = r); + setReference(acase.getParentRef(), + o -> row.parentRefTargetOid = o, + t -> row.parentRefTargetType = t, + r -> row.parentRefRelationId = r); + setReference(acase.getRequestorRef(), + o -> row.requestorRefTargetOid = o, + t -> row.requestorRefTargetType = t, + r -> row.requestorRefRelationId = r); + setReference(acase.getTargetRef(), + o -> row.targetRefTargetOid = o, + t -> row.targetRefTargetType = t, + r -> row.targetRefRelationId = r); + + return row; + } } diff --git a/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoAddDeleteObjectTest.java b/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoAddDeleteObjectTest.java index b4e51abf1cf..5ae99c81376 100644 --- a/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoAddDeleteObjectTest.java +++ b/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoAddDeleteObjectTest.java @@ -18,6 +18,10 @@ import java.util.UUID; import javax.xml.namespace.QName; +import com.evolveum.midpoint.repo.sqale.qmodel.cases.MCase; + +import com.evolveum.midpoint.repo.sqale.qmodel.cases.QCase; + import org.testng.annotations.Test; import com.evolveum.midpoint.repo.api.DeleteObjectResult; @@ -1118,6 +1122,58 @@ public void test840AccessCertificationDefinition() throws Exception { assertThat(row.ownerRefTargetType).isEqualTo(MObjectType.USER); assertCachedUri(row.ownerRefRelationId, relationUri); } + + @Test + public void test850Case() throws Exception { + OperationResult result = createOperationResult(); + + given("case"); + String objectName = "case" + getTestNumber(); + UUID parentOid = UUID.randomUUID(); + QName parentRelation = QName.valueOf("{https://random.org/ns}case-parent-rel"); + UUID objectOid = UUID.randomUUID(); + QName objectRelation = QName.valueOf("{https://random.org/ns}case-object-rel"); + UUID requestorOid = UUID.randomUUID(); + QName requestorRelation = QName.valueOf("{https://random.org/ns}case-requestor-rel"); + UUID targetOid = UUID.randomUUID(); + QName targetRelation = QName.valueOf("{https://random.org/ns}case-target-rel"); + + CaseType acase = new CaseType(prismContext) + .name(objectName) + .state("closed") + .closeTimestamp(MiscUtil.asXMLGregorianCalendar(321L)) + .parentRef(parentOid.toString(), + CaseType.COMPLEX_TYPE, parentRelation) + .objectRef(objectOid.toString(), + RoleType.COMPLEX_TYPE, objectRelation) + .requestorRef(requestorOid.toString(), + UserType.COMPLEX_TYPE, requestorRelation) + .targetRef(targetOid.toString(), + OrgType.COMPLEX_TYPE, targetRelation); + + when("adding it to the repository"); + repositoryService.addObject(acase.asPrismObject(), null, result); + + then("it is stored and relevant attributes are in columns"); + assertThatOperationResult(result).isSuccess(); + + MCase row = selectObjectByOid(QCase.class, acase.getOid()); + assertThat(row.state).isEqualTo("closed"); + assertThat(row.closeTimestamp).isEqualTo(Instant.ofEpochMilli(321)); + assertThat(row.parentRefTargetOid).isEqualTo(parentOid); + assertThat(row.parentRefTargetType).isEqualTo(MObjectType.CASE); + assertCachedUri(row.parentRefRelationId, parentRelation); + assertThat(row.objectRefTargetOid).isEqualTo(objectOid); + assertThat(row.objectRefTargetType).isEqualTo(MObjectType.ROLE); + assertCachedUri(row.objectRefRelationId, objectRelation); + assertThat(row.requestorRefTargetOid).isEqualTo(requestorOid); + assertThat(row.requestorRefTargetType).isEqualTo(MObjectType.USER); + assertCachedUri(row.requestorRefRelationId, requestorRelation); + assertThat(row.targetRefTargetOid).isEqualTo(targetOid); + assertThat(row.targetRefTargetType).isEqualTo(MObjectType.ORG); + assertCachedUri(row.targetRefRelationId, targetRelation); + } + // endregion // region delete tests From f707ddc6b4b6f25a66fee50a03fe362c614d7c80 Mon Sep 17 00:00:00 2001 From: Richard Richter Date: Tue, 18 May 2021 11:52:01 +0200 Subject: [PATCH 2/8] old-repo OperationLogger moved to repo-sqlbase, can be reused as-is --- .../repo/sql/SqlRepositoryServiceImpl.java | 4 +-- .../repo/sqlbase}/OperationLogger.java | 36 +++++++++++-------- 2 files changed, 23 insertions(+), 17 deletions(-) rename repo/{repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql => repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase}/OperationLogger.java (80%) diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java index 7559d56c7f5..d9adef62eb4 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java @@ -19,6 +19,7 @@ import javax.annotation.PreDestroy; import javax.xml.namespace.QName; +import com.evolveum.midpoint.repo.sqlbase.OperationLogger; import com.evolveum.midpoint.util.annotation.Experimental; import org.apache.commons.lang3.Validate; @@ -413,7 +414,6 @@ public String addObject( int attempt = 1; int restarts = 0; try { - // TODO use executeAttempts final String operation = "adding"; String proposedOid = object.getOid(); @@ -703,7 +703,7 @@ public ModifyObjectResult modifyObjectDynamically( pm.registerOperationFinish(opHandle, attempt); throw t; } finally { - OperationLogger.logModifyDynamically(type, oid, rv, getOptions, modifyOptions, result); + OperationLogger.logModifyDynamically(type, oid, rv, modifyOptions, result); } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/OperationLogger.java b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/OperationLogger.java similarity index 80% rename from repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/OperationLogger.java rename to repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/OperationLogger.java index 51fb6750e8c..4736f08b342 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/OperationLogger.java +++ b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/OperationLogger.java @@ -1,10 +1,10 @@ /* - * Copyright (c) 2018 Evolveum and contributors + * Copyright (C) 2010-2021 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. */ -package com.evolveum.midpoint.repo.sql; +package com.evolveum.midpoint.repo.sqlbase; import java.util.Collection; @@ -23,10 +23,6 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -/** - * @author semancik - * - */ public class OperationLogger { private static final Trace LOGGER_OP = TraceManager.getTrace("com.evolveum.midpoint.repo.operation"); @@ -40,25 +36,36 @@ public static void logAdd(PrismObject object, RepoAddO object.debugDump(1)); } - public static void logModify(Class type, String oid, Collection modifications, - ModificationPrecondition precondition, RepoModifyOptions options, OperationResult subResult) { + public static void logModify( + Class type, + String oid, + Collection> modifications, + ModificationPrecondition precondition, + RepoModifyOptions options, + OperationResult subResult) { if (!LOGGER_OP.isDebugEnabled()) { return; } LOGGER_OP.debug("{} modify {} {}{}{}: {}\n{}", PREFIX, type.getSimpleName(), oid, shortDumpOptions(options), - precondition == null ? "" : " precondition="+precondition+", ", + precondition == null ? "" : " precondition=" + precondition + ", ", getStatus(subResult), DebugUtil.debugDump(modifications, 1, false)); } - public static void logModifyDynamically(Class type, String oid, - ModifyObjectResult modifyObjectResult, Collection> getOptions, - RepoModifyOptions modifyOptions, OperationResult result) { + public static void logModifyDynamically( + Class type, + String oid, + ModifyObjectResult modifyObjectResult, + RepoModifyOptions modifyOptions, + OperationResult result) { if (!LOGGER_OP.isDebugEnabled()) { return; } - Collection modifications = modifyObjectResult != null ? modifyObjectResult.getModifications() : null; + Collection> modifications = + modifyObjectResult != null + ? modifyObjectResult.getModifications() + : null; LOGGER_OP.debug("{} modify dynamically {} {}{}: {}\n{}", PREFIX, type.getSimpleName(), oid, shortDumpOptions(modifyOptions), getStatus(result), @@ -86,7 +93,7 @@ private static Object shortDumpOptions(ShortDumpable options) { if (options == null) { return ""; } else { - return " ["+options.shortDump()+"]"; + return " [" + options.shortDump() + "]"; } } @@ -111,5 +118,4 @@ private static String getStatus(OperationResult subResult) { return subResult.getStatus().toString() + ": " + message; } } - } From 6a379ece8570b981f74a8abc7919973ef654df42 Mon Sep 17 00:00:00 2001 From: Richard Richter Date: Tue, 18 May 2021 12:04:18 +0200 Subject: [PATCH 3/8] repo: add+overwrite has own key for perf stats + cleanup/generics around --- .../midpoint/repo/api/ModifyObjectResult.java | 8 ++++---- .../midpoint/repo/api/RepositoryService.java | 1 + .../api/perf/OperationPerformanceInformation.java | 13 ++++++------- .../midpoint/repo/sql/SqlRepositoryServiceImpl.java | 9 +++++---- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/ModifyObjectResult.java b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/ModifyObjectResult.java index ec3cf8a413d..62bf4933c3c 100644 --- a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/ModifyObjectResult.java +++ b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/ModifyObjectResult.java @@ -31,7 +31,7 @@ public class ModifyObjectResult { private final PrismObject objectBefore; private final PrismObject objectAfter; - private final Collection modifications; + private final Collection> modifications; /** * Performance record for the current operation. @@ -39,12 +39,12 @@ public class ModifyObjectResult { */ private OperationRecord performanceRecord; - public ModifyObjectResult(Collection modifications) { + public ModifyObjectResult(Collection> modifications) { this(null, null, modifications); } public ModifyObjectResult(PrismObject objectBefore, PrismObject objectAfter, - Collection modifications) { + Collection> modifications) { this.objectBefore = objectBefore; this.objectAfter = objectAfter; this.modifications = modifications; @@ -58,7 +58,7 @@ public PrismObject getObjectAfter() { return objectAfter; } - public Collection getModifications() { + public Collection> getModifications() { return modifications; } diff --git a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java index eb10f5447de..d72a0f7c693 100644 --- a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java +++ b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java @@ -112,6 +112,7 @@ public interface RepositoryService { String CLASS_NAME_WITH_DOT = RepositoryService.class.getName() + "."; String OP_ADD_OBJECT = "addObject"; + String OP_ADD_OBJECT_OVERWRITE = "addObjectOverwrite"; // addObject with overwrite option String OP_DELETE_OBJECT = "deleteObject"; String OP_COUNT_OBJECTS = "countObjects"; String OP_MODIFY_OBJECT = "modifyObject"; diff --git a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/perf/OperationPerformanceInformation.java b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/perf/OperationPerformanceInformation.java index 0b7d400b35b..42ed76b0309 100644 --- a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/perf/OperationPerformanceInformation.java +++ b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/perf/OperationPerformanceInformation.java @@ -1,25 +1,24 @@ /* - * Copyright (c) 2010-2019 Evolveum and contributors + * Copyright (C) 2010-2021 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. */ - package com.evolveum.midpoint.repo.api.perf; +import java.util.Locale; + import com.evolveum.midpoint.util.ShortDumpable; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.xml.ns._public.common.common_3.RepositoryOperationPerformanceInformationType; -import java.util.Locale; - /** - * Experimental. + * Experimental. */ public class OperationPerformanceInformation implements ShortDumpable, Cloneable { private int invocationCount; - private int executionCount; + private int executionCount; // counts each attempt, including retries private long totalTime; private Long minTime; private Long maxTime; @@ -105,7 +104,7 @@ public synchronized void shortDump(StringBuilder sb) { sb.append(invocationCount); sb.append(", total time: ").append(timeInfo(totalTime, minTime, maxTime, invocationCount)); if (totalTime > 0 && executionCount > invocationCount) { - sb.append(String.format(Locale.US, ", wasted time for %d retry/retries: %s (%s)", executionCount-invocationCount, + sb.append(String.format(Locale.US, ", wasted time for %d retry/retries: %s (%s)", executionCount - invocationCount, timeInfo(totalWastedTime, minWastedTime, maxWastedTime, invocationCount), percent(totalWastedTime, totalTime))); } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java index d9adef62eb4..bf2a46f8032 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java @@ -19,9 +19,6 @@ import javax.annotation.PreDestroy; import javax.xml.namespace.QName; -import com.evolveum.midpoint.repo.sqlbase.OperationLogger; -import com.evolveum.midpoint.util.annotation.Experimental; - import org.apache.commons.lang3.Validate; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -44,6 +41,7 @@ import com.evolveum.midpoint.repo.api.query.ObjectFilterExpressionEvaluator; import com.evolveum.midpoint.repo.sql.helpers.*; import com.evolveum.midpoint.repo.sqlbase.ConflictWatcherImpl; +import com.evolveum.midpoint.repo.sqlbase.OperationLogger; import com.evolveum.midpoint.repo.sqlbase.perfmon.SqlPerformanceMonitorImpl; import com.evolveum.midpoint.schema.*; import com.evolveum.midpoint.schema.constants.SchemaConstants; @@ -56,6 +54,7 @@ import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.PrettyPrinter; +import com.evolveum.midpoint.util.annotation.Experimental; import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -410,7 +409,9 @@ public String addObject( .build(); SqlPerformanceMonitorImpl pm = getPerformanceMonitor(); - long opHandle = pm.registerOperationStart(OP_ADD_OBJECT, object.getCompileTimeClass()); + long opHandle = pm.registerOperationStart( + options.isOverwrite() ? OP_ADD_OBJECT_OVERWRITE : OP_ADD_OBJECT, + object.getCompileTimeClass()); int attempt = 1; int restarts = 0; try { From ed889fc101d9d5940fca4a9b5b758975add3169c Mon Sep 17 00:00:00 2001 From: Richard Richter Date: Tue, 18 May 2021 15:34:19 +0200 Subject: [PATCH 4/8] repo-sqale: columns renamed to match M-class attributes (no _) --- repo/repo-sqale/README.adoc | 4 +- repo/repo-sqale/sql/pg-org-experiments.sql | 44 +- repo/repo-sqale/sql/pgnew-eav-vs-json.sql | 54 +- repo/repo-sqale/sql/pgnew-experiments.sql | 28 +- repo/repo-sqale/sql/pgnew-repo.sql | 733 +++++++++--------- .../midpoint/repo/sqale/UriCache.java | 2 +- .../QAccessCertificationDefinition.java | 8 +- .../sqale/qmodel/assignment/QAssignment.java | 42 +- .../repo/sqale/qmodel/cases/QCase.java | 24 +- .../repo/sqale/qmodel/common/QContainer.java | 2 +- .../sqale/qmodel/connector/QConnector.java | 8 +- .../repo/sqale/qmodel/focus/QFocus.java | 4 +- .../sqale/qmodel/focus/QGenericObject.java | 2 +- .../repo/sqale/qmodel/focus/QUser.java | 32 +- .../qmodel/lookuptable/QLookupTableRow.java | 4 +- .../repo/sqale/qmodel/object/QObject.java | 28 +- .../sqale/qmodel/object/QObjectMapping.java | 2 +- .../qmodel/object/QOperationExecution.java | 12 +- .../repo/sqale/qmodel/object/QTrigger.java | 2 +- .../repo/sqale/qmodel/ref/QReference.java | 6 +- .../repo/sqale/qmodel/report/QReportData.java | 6 +- .../repo/sqale/qmodel/resource/QResource.java | 6 +- .../repo/sqale/qmodel/role/QAbstractRole.java | 4 +- .../repo/sqale/qmodel/shadow/QShadow.java | 8 +- .../repo/sqale/qmodel/task/QTask.java | 14 +- 25 files changed, 531 insertions(+), 548 deletions(-) diff --git a/repo/repo-sqale/README.adoc b/repo/repo-sqale/README.adoc index 18eb757f5e6..9d5cfba4da2 100644 --- a/repo/repo-sqale/README.adoc +++ b/repo/repo-sqale/README.adoc @@ -295,11 +295,11 @@ Insert performance measurements: [source,sql] ---- -INSERT INTO m_user (name_norm, name_orig, version) +INSERT INTO m_user (nameNorm, nameOrig, version) VALUES ('user-' || LPAD(r::text, 10, '0'), 'user-' || LPAD(r::text, 10, '0'), 1); ---- -Both name columns are indexed, `name_norm` is also unique. +Both name columns are indexed, `nameNorm` is also unique. Loop is used to INSERT the rows, which is slower than `INSERT from SELECT` with `generate_series`, but closer to real scenario that uses separate statements (although there are no round-trips here). diff --git a/repo/repo-sqale/sql/pg-org-experiments.sql b/repo/repo-sqale/sql/pg-org-experiments.sql index f5ea89f037e..251e120af42 100644 --- a/repo/repo-sqale/sql/pg-org-experiments.sql +++ b/repo/repo-sqale/sql/pg-org-experiments.sql @@ -46,15 +46,15 @@ with recursive org_h ( parent, child ) as ( - select r.targetoid, r.owner_oid from m_reference as r + select r.targetoid, r.ownerOid from m_reference as r where r.reference_type = 0 -- this condition makes it super fast, the same out of CTE is much slower - and r.owner_oid = 'u7:21200-0...-....-....-............' + and r.ownerOid = 'u7:21200-0...-....-....-............' union select par.targetoid, chi.child from m_reference as par, org_h as chi where par.reference_type = 0 - and par.owner_oid = chi.parent + and par.ownerOid = chi.parent ) select distinct parent from org_h -- select * from org_h @@ -72,12 +72,12 @@ set jit = off; -- generated by Querydsl EXPLAIN (ANALYZE, VERBOSE, BUFFERS) with recursive orgc (parent, child) as not materialized ( - (select refpo.targetOid, refpo.owner_oid from m_ref_object_parent_org refpo) + (select refpo.targetOid, refpo.ownerOid from m_ref_object_parent_org refpo) union - (select refpo.targetOid, orgc.child from m_ref_object_parent_org refpo, orgc orgc where refpo.owner_oid = orgc.parent) + (select refpo.targetOid, orgc.child from m_ref_object_parent_org refpo, orgc orgc where refpo.ownerOid = orgc.parent) ) -select po.name_orig, parent, child, - co.name_orig, +select po.nameOrig, parent, child, + co.nameOrig, * from orgc join m_object po on po.oid = parent join m_object co on co.oid = child @@ -93,7 +93,7 @@ select * from m_ref_object_parent_org; CREATE OR REPLACE FUNCTION m_org_clsr(ancestorOid UUID) RETURNS TABLE ( ancestor_oid UUID, -- ref.targetoid - descendant_oid UUID --ref.owner_oid + descendant_oid UUID --ref.ownerOid ) LANGUAGE plpgsql AS $$ @@ -117,40 +117,40 @@ order by oid; -- using function m_org_clsr(ancestorOid): 1000 ms for oids, 1400 ms for full rows -- using m_org_closure with rule: 23 s! no noticeable difference between oid/full select select oid from m_user u -where u.name_norm like '%45' +where u.nameNorm like '%45' and exists (select 1 from m_ref_object_parent_org pref join -- m_org_closure oc on pref.targetoid = oc.descendant_oid m_org_clsr('4e84dcec-eff6-4f1c-9bad-929e98dea3fa') oc on pref.targetoid = oc.descendant_oid - and pref.owner_oid = u.oid + and pref.ownerOid = u.oid -- where oc.ancestor_oid = '4e84dcec-eff6-4f1c-9bad-929e98dea3fa' ); -- using m_org_closure_internal directly 150 ms for just OIDs (600 ms full rows) select oid from m_user u -where u.name_norm like '%45' +where u.nameNorm like '%45' and exists (select 1 from m_ref_object_parent_org pref join m_org_closure_internal oc on pref.targetoid = oc.descendant_oid - and pref.owner_oid = u.oid + and pref.ownerOid = u.oid where oc.ancestor_oid = '4e84dcec-eff6-4f1c-9bad-929e98dea3fa' ); WITH RECURSIVE org_h ( ancestor_oid, -- ref.targetoid - descendant_oid --ref.owner_oid + descendant_oid --ref.ownerOid ) AS ( -- gather all organizations with parents - SELECT r.targetoid, r.owner_oid + SELECT r.targetoid, r.ownerOid FROM m_ref_object_parent_org r - WHERE r.owner_type = 'ORG' + WHERE r.ownerType = 'ORG' UNION -- generate their parents SELECT par.targetoid, chi.descendant_oid -- leaving original child there generates closure FROM m_ref_object_parent_org as par, org_h as chi - WHERE par.owner_oid = chi.ancestor_oid + WHERE par.ownerOid = chi.ancestor_oid ), pref as ( select pref.* from m_ref_object_parent_org pref @@ -159,24 +159,24 @@ pref as ( ) select oid from m_user u where - u.name_norm like '%45' and - exists (select 1 from pref where pref.owner_oid = u.oid) + u.nameNorm like '%45' and + exists (select 1 from pref where pref.ownerOid = u.oid) ; -- select count(*) from org_h; -- select * from org_h; ; select oid from m_user u -where u.name_norm like '%45' +where u.nameNorm like '%45' and exists (select 1 from m_ref_object_parent_org pref join org_h oc on pref.targetoid = oc.descendant_oid - and pref.owner_oid = u.oid + and pref.ownerOid = u.oid where oc.ancestor_oid = '4e84dcec-eff6-4f1c-9bad-929e98dea3fa' ); select * from m_ref_object_parent_org - where owner_oid = '0f9badc4-3fc2-4977-aa0a-f08c3576383d'; + where ownerOid = '0f9badc4-3fc2-4977-aa0a-f08c3576383d'; select * from m_org_closure oc where oc.descendant_oid = '6e732607-609f-46de-9747-1675868dc227'; @@ -206,7 +206,7 @@ select count(*) from m_user; -- trigger with mark: orgs/closure: 59711/291099 (after refresh ~1.9s), 2m13s, ~450 orgs/s select * from m_org o - where not exists (select 1 from m_ref_object_parent_org po where po.owner_oid = o.oid); + where not exists (select 1 from m_ref_object_parent_org po where po.ownerOid = o.oid); select * from m_org_closure; diff --git a/repo/repo-sqale/sql/pgnew-eav-vs-json.sql b/repo/repo-sqale/sql/pgnew-eav-vs-json.sql index 6579775e23b..4feee186568 100644 --- a/repo/repo-sqale/sql/pgnew-eav-vs-json.sql +++ b/repo/repo-sqale/sql/pgnew-eav-vs-json.sql @@ -43,12 +43,12 @@ create table teav ( ALTER TABLE teav ADD CONSTRAINT teav_name_key UNIQUE (name); create table teav_ext_string ( - owner_oid UUID NOT NULL references teav(oid), + ownerOid UUID NOT NULL references teav(oid), key VARCHAR(32) NOT NULL, value VARCHAR(255) NOT NULL, - -- this also covers the index on owner_oid FK - CONSTRAINT teav_ext_string_pk PRIMARY KEY (owner_oid, key, value) + -- this also covers the index on ownerOid FK + CONSTRAINT teav_ext_string_pk PRIMARY KEY (ownerOid, key, value) ); CREATE INDEX teav_ext_string_key_value_idx ON teav_ext_string (key, value); @@ -81,9 +81,9 @@ BEGIN -- EAV INSERT INTO teav (oid, name) VALUES (id, 'user-' || LPAD(r::text, 10, '0')); - INSERT INTO teav_ext_string (owner_oid, key, value) VALUES (id, 'eid', r); + INSERT INTO teav_ext_string (ownerOid, key, value) VALUES (id, 'eid', r); FOREACH v IN ARRAY hobbies LOOP - INSERT INTO teav_ext_string (owner_oid, key, value) + INSERT INTO teav_ext_string (ownerOid, key, value) VALUES (id, 'hobbies', v); END LOOP; ELSEIF r % 10 <= 1 THEN @@ -97,9 +97,9 @@ BEGIN ('{"eid": ' || r || ', "email": "user' || r || '@mycompany.com", "other-key-' || r || '": "other-value-' || r || '"}')::jsonb ); INSERT INTO teav (oid, name) VALUES (id, 'user-' || LPAD(r::text, 10, '0')); - INSERT INTO teav_ext_string (owner_oid, key, value) VALUES (id, 'email', 'user' || r || '@mycompany.com'); - INSERT INTO teav_ext_string (owner_oid, key, value) VALUES (id, 'eid', r); - INSERT INTO teav_ext_string (owner_oid, key, value) VALUES (id, 'other-key-' || r, 'other-value-' || r); + INSERT INTO teav_ext_string (ownerOid, key, value) VALUES (id, 'email', 'user' || r || '@mycompany.com'); + INSERT INTO teav_ext_string (ownerOid, key, value) VALUES (id, 'eid', r); + INSERT INTO teav_ext_string (ownerOid, key, value) VALUES (id, 'other-key-' || r, 'other-value-' || r); ELSE -- these values are used by many entries hobbies := random_pick(ARRAY['eating', 'books', 'music', 'dancing', 'walking', 'jokes', 'video', 'photo'], 0.4); @@ -111,9 +111,9 @@ BEGIN -- EAV INSERT INTO teav (oid, name) VALUES (id, 'user-' || LPAD(r::text, 10, '0')); - INSERT INTO teav_ext_string (owner_oid, key, value) VALUES (id, 'eid', r); + INSERT INTO teav_ext_string (ownerOid, key, value) VALUES (id, 'eid', r); FOREACH v IN ARRAY hobbies LOOP - INSERT INTO teav_ext_string (owner_oid, key, value) + INSERT INTO teav_ext_string (ownerOid, key, value) VALUES (id, 'hobbies', v); END LOOP; END IF; @@ -201,7 +201,7 @@ select * from tjson where UPPER(ext->>'email') LIKE 'USER2%' LIMIT 500; CREATE INDEX teav_ext_string_value_trgm_idx ON teav_ext_string USING gin(value gin_trgm_ops); CREATE INDEX teav_ext_string_value_email_trgm_idx ON teav_ext_string USING gin(value gin_trgm_ops) WHERE key='email'; EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT) -select * from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'email' and es.value ILIKE 'USER2%') LIMIT 50; +select * from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'email' and es.value ILIKE 'USER2%') LIMIT 50; select from teav_ext_string ex where es.key = 'email' and es.value ILIKE 'USER2%' limit 500; -- selects @@ -236,30 +236,30 @@ select * from tjson where ext @> '{"eid":5000}'; -- pgbench -r -P 5 -f - -t 5 << "--EOF" select count(*) from teav_ext_string; -- out for curiosity, not practical otherwise select count(*) from teav; -select count(*) from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'hobbies' and es.value = 'video'); -select count(*) from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'hobbies' and es.value = 'sleeping'); -select count(*) from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'email' and es.value LIKE 'user2%'); -select count(*) from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'email' and UPPER(es.value) LIKE 'USER2%'); +select count(*) from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'hobbies' and es.value = 'video'); +select count(*) from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'hobbies' and es.value = 'sleeping'); +select count(*) from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'email' and es.value LIKE 'user2%'); +select count(*) from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'email' and UPPER(es.value) LIKE 'USER2%'); --EOF -- selects -- pgbench -r -P 5 -f - -t 30 << "--EOF" select * from teav limit 500; -select * from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'hobbies' and es.value = 'video') limit 500; -select * from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'hobbies' and es.value = 'video') order by t.oid limit 500; -select * from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'hobbies' and es.value = 'video') and t.oid>'fffe0000-0000-0000-0000-000000000000' order by t.oid limit 500; -select * from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'hobbies' and es.value = 'sleeping') limit 500; -select * from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'hobbies' and es.value = 'sleeping') order by t.oid limit 500; +select * from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'hobbies' and es.value = 'video') limit 500; +select * from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'hobbies' and es.value = 'video') order by t.oid limit 500; +select * from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'hobbies' and es.value = 'video') and t.oid>'fffe0000-0000-0000-0000-000000000000' order by t.oid limit 500; +select * from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'hobbies' and es.value = 'sleeping') limit 500; +select * from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'hobbies' and es.value = 'sleeping') order by t.oid limit 500; --EOF -- pgbench -r -P 5 -f - -t 30 << "--EOF" -select * from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'email' and es.value LIKE 'user2%') limit 500; -select * from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'email' and es.value LIKE 'user2%') order by oid limit 500; -select * from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'email' and es.value LIKE 'user2%') and oid>'fffe0000-0000-0000-0000-000000000000' order by oid limit 500; +select * from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'email' and es.value LIKE 'user2%') limit 500; +select * from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'email' and es.value LIKE 'user2%') order by oid limit 500; +select * from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'email' and es.value LIKE 'user2%') and oid>'fffe0000-0000-0000-0000-000000000000' order by oid limit 500; -select * from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'email' and UPPER(es.value) LIKE 'USER2%') limit 500; -select * from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'email' and UPPER(es.value) LIKE 'USER2%') order by oid limit 500; -select * from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'email' and UPPER(es.value) LIKE 'USER2%') and oid>'fffe0000-0000-0000-0000-000000000000' order by oid limit 500; +select * from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'email' and UPPER(es.value) LIKE 'USER2%') limit 500; +select * from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'email' and UPPER(es.value) LIKE 'USER2%') order by oid limit 500; +select * from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'email' and UPPER(es.value) LIKE 'USER2%') and oid>'fffe0000-0000-0000-0000-000000000000' order by oid limit 500; -select * from teav t where exists (select from teav_ext_string es where es.owner_oid = t.oid and es.key = 'eid' and es.value = '5000'); +select * from teav t where exists (select from teav_ext_string es where es.ownerOid = t.oid and es.key = 'eid' and es.value = '5000'); --EOF diff --git a/repo/repo-sqale/sql/pgnew-experiments.sql b/repo/repo-sqale/sql/pgnew-experiments.sql index e89304b513c..35a2de16a03 100644 --- a/repo/repo-sqale/sql/pgnew-experiments.sql +++ b/repo/repo-sqale/sql/pgnew-experiments.sql @@ -14,20 +14,20 @@ select * from pg_available_extensions order by name; -- DB data initialization (after pgnew-repo.sql) -- one user with random name -INSERT INTO m_user (oid, name_norm, name_orig, version) +INSERT INTO m_user (oid, nameNorm, nameOrig, version) VALUES (gen_random_uuid(), md5(random()::TEXT), md5(random()::TEXT), 1); -INSERT INTO m_user (name_norm, name_orig, createtimestamp, modifytimestamp, version) +INSERT INTO m_user (nameNorm, nameOrig, createtimestamp, modifytimestamp, version) VALUES (md5(random()::TEXT), md5(random()::TEXT), current_timestamp, current_timestamp, 1); select * from m_resource; --- creates new row with generated UUID, repeated run must fail on unique name_norm -insert into m_resource (name_norm, name_orig, version) VALUES ('resource0', 'resource0', 1) RETURNING OID; --- should fail the second time because oid is PK of the table (even with changed name_norm) -insert into m_resource (oid, name_norm, name_orig, version) +-- creates new row with generated UUID, repeated run must fail on unique nameNorm +insert into m_resource (nameNorm, nameOrig, version) VALUES ('resource0', 'resource0', 1) RETURNING OID; +-- should fail the second time because oid is PK of the table (even with changed nameNorm) +insert into m_resource (oid, nameNorm, nameOrig, version) VALUES ('66eb4861-867d-4a41-b6f0-41a3874bd48f', 'resource1', 'resource1', 1); -- this should fail after previous due to cross-table m_object unique constraint -insert into m_user (oid, name_norm, name_orig, version) +insert into m_user (oid, nameNorm, nameOrig, version) VALUES ('66eb4861-867d-4a41-b6f0-41a3874bd48f', 'conflict', 'conflict', 1); -- must fail, update trigger does not allow OID changes update m_object set oid='66eb4861-867d-4a41-b6f0-41a3874bd48e' @@ -45,11 +45,11 @@ SELECT * from m_object_oid where oid not in (SELECT oid FROM m_object); delete from m_object where oid='66eb4861-867d-4a41-b6f0-41a3874bd48f'; -- switch Tx to manual in IDE to avoid autocommit START TRANSACTION; -insert into m_resource (oid, name_norm, name_orig, version) +insert into m_resource (oid, nameNorm, nameOrig, version) VALUES ('66eb4861-867d-4a41-b6f0-41a3874bd48f', 'resource1', 'resource1', 1); START TRANSACTION; - insert into m_user (oid, name_norm, name_orig, version) + insert into m_user (oid, nameNorm, nameOrig, version) VALUES ('66eb4861-867d-4a41-b6f0-41a3874bd48f', 'conflict', 'conflict', 1); commit; commit; @@ -60,7 +60,7 @@ select * from m_object where oid='66eb4861-867d-4a41-b6f0-41a3874bd48f'; -- Delete in two steps without trigger, much faster than normal. SET session_replication_role = replica; -- disables triggers for the current session -- HERE the delete you want, e.g.: -delete from m_user where name_norm > 'user-0001000000'; +delete from m_user where nameNorm > 'user-0001000000'; -- this is the cleanup of unused OIDs DELETE FROM m_object_oid oo WHERE NOT EXISTS (SELECT * from m_object o WHERE o.oid = oo.oid); @@ -79,14 +79,14 @@ select count(*) from m_user; -- vacuum full analyze; -- this requires exclusive lock on processed table and can be very slow, with 1M rows it takes 10s vacuum analyze; -- this is normal operation version (can run in parallel, ~25s/25m rows) -INSERT INTO m_resource (name_norm, name_orig, fullobject, version) +INSERT INTO m_resource (nameNorm, nameOrig, fullobject, version) SELECT 'resource-' || LPAD(r::text, 10, '0'), 'resource-' || LPAD(r::text, 10, '0'), random_bytea(100, 20000), 1 from generate_series(1, 10) as r; -INSERT INTO m_user (name_norm, name_orig, fullobject, ext, policySituations, version) +INSERT INTO m_user (nameNorm, nameOrig, fullobject, ext, policySituations, version) SELECT 'user-' || LPAD(r::text, 10, '0'), 'user-' || LPAD(r::text, 10, '0'), random_bytea(100, 2000), @@ -120,7 +120,7 @@ from generate_series(100001,1000000) as r; EXPLAIN (ANALYZE, VERBOSE, BUFFERS) select oid, policysituations from m_user where policysituations @> '{10}' --- order by name_norm desc +-- order by nameNorm desc ; /* 1k rows @@ -244,7 +244,7 @@ CREATE INDEX m_user_ext_hired2_idx ON m_user ((ext ->> 'hired')) WHERE ext ? 'hi -- see also https://www.postgresql.org/docs/13/functions-json.html some stuff is only for JSONB EXPLAIN (ANALYZE, VERBOSE, BUFFERS) -- select count(*) -select oid, name_norm, ext +select oid, nameNorm, ext from m_user where -- ext?'hobbies' and -- faster, uses GIN index diff --git a/repo/repo-sqale/sql/pgnew-repo.sql b/repo/repo-sqale/sql/pgnew-repo.sql index b791ba8084d..7db06af35ca 100644 --- a/repo/repo-sqale/sql/pgnew-repo.sql +++ b/repo/repo-sqale/sql/pgnew-repo.sql @@ -10,6 +10,7 @@ -- FK foreign key, IDX for index, KEY for unique index. -- TR is suffix for triggers. -- Names are generally lowercase (despite prefix/suffixes above in uppercase ;-)). +-- Column names are Java style and match attribute names from M-classes (e.g. MObject). -- -- Other notes: -- TEXT is used instead of VARCHAR, see: https://dba.stackexchange.com/a/21496/157622 @@ -213,7 +214,7 @@ INSERT INTO m_uri (id, uri) -- 1) override OID like this (PK+FK): oid UUID NOT NULL PRIMARY KEY REFERENCES m_object_oid(oid), -- 2) define object type class (change value): objectType ObjectType GENERATED ALWAYS AS ('XY') STORED, -- 3) add three triggers _oid_{insert|update|delete}_tr --- 4) add indexes for name_norm and name_orig columns (name_norm as unique) +-- 4) add indexes for nameOrig and nameNorm columns (nameNorm as unique) -- 5) the rest varies on the concrete table, other indexes or constraints, etc. -- 6) any required FK must be created on the concrete table, even for inherited columns @@ -222,14 +223,14 @@ CREATE TABLE m_object ( oid UUID NOT NULL, -- objectType will be overridden with GENERATED value in concrete table objectType ObjectType NOT NULL, - name_orig TEXT NOT NULL, - name_norm TEXT NOT NULL, + nameOrig TEXT NOT NULL, + nameNorm TEXT NOT NULL, fullObject BYTEA, - tenantRef_targetOid UUID, - tenantRef_targetType ObjectType, - tenantRef_relation_id INTEGER REFERENCES m_uri(id), + tenantRefTargetOid UUID, + tenantRefTargetType ObjectType, + tenantRefRelationId INTEGER REFERENCES m_uri(id), lifecycleState TEXT, -- TODO what is this? how many distinct values? - cid_seq BIGINT NOT NULL DEFAULT 1, -- sequence for container id, next free cid + cidSeq BIGINT NOT NULL DEFAULT 1, -- sequence for container id, next free cid version INTEGER NOT NULL DEFAULT 1, -- complex DB columns, add indexes as needed per concrete table, e.g. see m_user -- TODO compare with [] in JSONB, check performance, indexing, etc. first @@ -238,15 +239,15 @@ CREATE TABLE m_object ( textInfo TEXT[], -- TODO not mapped yet, see RObjectTextInfo#createItemsSet ext JSONB, -- metadata - creatorRef_targetOid UUID, - creatorRef_targetType ObjectType, - creatorRef_relation_id INTEGER REFERENCES m_uri(id), - createChannel_id INTEGER REFERENCES m_uri(id), + creatorRefTargetOid UUID, + creatorRefTargetType ObjectType, + creatorRefRelationId INTEGER REFERENCES m_uri(id), + createChannelId INTEGER REFERENCES m_uri(id), createTimestamp TIMESTAMPTZ, - modifierRef_targetOid UUID, - modifierRef_targetType ObjectType, - modifierRef_relation_id INTEGER REFERENCES m_uri(id), - modifyChannel_id INTEGER REFERENCES m_uri(id), + modifierRefTargetOid UUID, + modifierRefTargetType ObjectType, + modifierRefRelationId INTEGER REFERENCES m_uri(id), + modifyChannelId INTEGER REFERENCES m_uri(id), modifyTimestamp TIMESTAMPTZ, -- these are purely DB-managed metadata, not mapped to in midPoint @@ -263,9 +264,9 @@ CREATE TABLE m_object ( CREATE TABLE m_container ( -- Default OID value is covered by INSERT triggers. No PK defined on abstract tables. -- Owner does not have to be the direct parent of the container. - owner_oid UUID NOT NULL, + ownerOid UUID NOT NULL, -- use like this on the concrete table: - -- owner_oid UUID NOT NULL REFERENCES m_object_oid(oid), + -- ownerOid UUID NOT NULL REFERENCES m_object_oid(oid), -- Container ID, unique in the scope of the whole object (owner). -- While this provides it for sub-tables we will repeat this for clarity, it's part of PK. @@ -274,86 +275,86 @@ CREATE TABLE m_container ( containerType ContainerType NOT NULL, CHECK (FALSE) NO INHERIT - -- add on concrete table (additional columns possible): PRIMARY KEY (owner_oid, cid) + -- add on concrete table (additional columns possible): PRIMARY KEY (ownerOid, cid) ); -- Abstract reference table, for object but also other container references. CREATE TABLE m_reference ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, - -- reference_type will be overridden with GENERATED value in concrete table - owner_type ObjectType NOT NULL, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + -- referenceType will be overridden with GENERATED value in concrete table + ownerType ObjectType NOT NULL, referenceType ReferenceType NOT NULL, targetOid UUID NOT NULL, -- soft-references m_object targetType ObjectType NOT NULL, - relation_id INTEGER NOT NULL REFERENCES m_uri(id), + relationId INTEGER NOT NULL REFERENCES m_uri(id), -- prevents inserts to this table, but not to inherited ones; this makes it "abstract" table CHECK (FALSE) NO INHERIT - -- add PK (referenceType is the same per table): PRIMARY KEY (owner_oid, relation_id, targetOid) + -- add PK (referenceType is the same per table): PRIMARY KEY (ownerOid, relationId, targetOid) ); -- Add this index for each sub-table (reference type is not necessary, each sub-table has just one). --- CREATE INDEX m_reference_targetOid_relation_id_idx ON m_reference (targetOid, relation_id); +-- CREATE INDEX m_referenceTargetOidRelationId_idx ON m_reference (targetOid, relationId); -- references related to ObjectType and AssignmentHolderType -- stores AssignmentHolderType/archetypeRef CREATE TABLE m_ref_archetype ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, referenceType ReferenceType GENERATED ALWAYS AS ('ARCHETYPE') STORED, - PRIMARY KEY (owner_oid, relation_id, targetOid) + PRIMARY KEY (ownerOid, relationId, targetOid) ) INHERITS (m_reference); -CREATE INDEX m_ref_archetype_targetOid_relation_id_idx - ON m_ref_archetype (targetOid, relation_id); +CREATE INDEX m_ref_archetypeTargetOidRelationId_idx + ON m_ref_archetype (targetOid, relationId); -- stores AssignmentHolderType/delegatedRef CREATE TABLE m_ref_delegated ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, referenceType ReferenceType GENERATED ALWAYS AS ('DELEGATED') STORED, - PRIMARY KEY (owner_oid, relation_id, targetOid) + PRIMARY KEY (ownerOid, relationId, targetOid) ) INHERITS (m_reference); -CREATE INDEX m_ref_delegated_targetOid_relation_id_idx - ON m_ref_delegated (targetOid, relation_id); +CREATE INDEX m_ref_delegatedTargetOidRelationId_idx + ON m_ref_delegated (targetOid, relationId); -- stores ObjectType/metadata/createApproverRef CREATE TABLE m_ref_object_create_approver ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, referenceType ReferenceType GENERATED ALWAYS AS ('OBJECT_CREATE_APPROVER') STORED, - PRIMARY KEY (owner_oid, relation_id, targetOid) + PRIMARY KEY (ownerOid, relationId, targetOid) ) INHERITS (m_reference); -CREATE INDEX m_ref_object_create_approver_targetOid_relation_id_idx - ON m_ref_object_create_approver (targetOid, relation_id); +CREATE INDEX m_ref_object_create_approverTargetOidRelationId_idx + ON m_ref_object_create_approver (targetOid, relationId); -- stores ObjectType/metadata/modifyApproverRef CREATE TABLE m_ref_object_modify_approver ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, referenceType ReferenceType GENERATED ALWAYS AS ('OBJECT_MODIFY_APPROVER') STORED, - PRIMARY KEY (owner_oid, relation_id, targetOid) + PRIMARY KEY (ownerOid, relationId, targetOid) ) INHERITS (m_reference); -CREATE INDEX m_ref_object_modify_approver_targetOid_relation_id_idx - ON m_ref_object_modify_approver (targetOid, relation_id); +CREATE INDEX m_ref_object_modify_approverTargetOidRelationId_idx + ON m_ref_object_modify_approver (targetOid, relationId); -- stores AssignmentHolderType/roleMembershipRef CREATE TABLE m_ref_role_membership ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, referenceType ReferenceType GENERATED ALWAYS AS ('ROLE_MEMBERSHIP') STORED, - PRIMARY KEY (owner_oid, relation_id, targetOid) + PRIMARY KEY (ownerOid, relationId, targetOid) ) INHERITS (m_reference); -CREATE INDEX m_ref_role_member_targetOid_relation_id_idx - ON m_ref_role_membership (targetOid, relation_id); +CREATE INDEX m_ref_role_memberTargetOidRelationId_idx + ON m_ref_role_membership (targetOid, relationId); -- endregion -- region FOCUS related tables @@ -366,8 +367,8 @@ CREATE TABLE m_focus ( emailAddress TEXT, photo BYTEA, -- will be TOAST-ed if necessary locale TEXT, - locality_orig TEXT, - locality_norm TEXT, + localityOrig TEXT, + localityNorm TEXT, preferredLanguage TEXT, telephoneNumber TEXT, timezone TEXT, @@ -393,33 +394,33 @@ CREATE TABLE m_focus ( -- stores FocusType/personaRef CREATE TABLE m_ref_persona ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, referenceType ReferenceType GENERATED ALWAYS AS ('PERSONA') STORED, - PRIMARY KEY (owner_oid, relation_id, targetOid) + PRIMARY KEY (ownerOid, relationId, targetOid) ) INHERITS (m_reference); -CREATE INDEX m_ref_persona_targetOid_relation_id_idx - ON m_ref_persona (targetOid, relation_id); +CREATE INDEX m_ref_personaTargetOidRelationId_idx + ON m_ref_persona (targetOid, relationId); -- stores FocusType/linkRef ("projection" is newer and better term) CREATE TABLE m_ref_projection ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, referenceType ReferenceType GENERATED ALWAYS AS ('PROJECTION') STORED, - PRIMARY KEY (owner_oid, relation_id, targetOid) + PRIMARY KEY (ownerOid, relationId, targetOid) ) INHERITS (m_reference); -CREATE INDEX m_ref_projection_targetOid_relation_id_idx - ON m_ref_projection (targetOid, relation_id); +CREATE INDEX m_ref_projectionTargetOidRelationId_idx + ON m_ref_projection (targetOid, relationId); -- Represents GenericObjectType, see https://docs.evolveum.com/midpoint/reference/schema/generic-objects/ CREATE TABLE m_generic_object ( oid UUID NOT NULL PRIMARY KEY REFERENCES m_object_oid(oid), objectType ObjectType GENERATED ALWAYS AS ('GENERIC_OBJECT') STORED, - genericObjectType_id INTEGER NOT NULL REFERENCES m_uri(id) -- GenericObjectType#objectType + genericObjectTypeId INTEGER NOT NULL REFERENCES m_uri(id) -- GenericObjectType#objectType ) INHERITS (m_focus); @@ -430,10 +431,10 @@ CREATE TRIGGER m_generic_object_update_tr BEFORE UPDATE ON m_generic_object CREATE TRIGGER m_generic_object_oid_delete_tr AFTER DELETE ON m_generic_object FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); --- TODO unique per genericObjectType_id? +-- TODO unique per genericObjectTypeId? -- No indexes for GenericObjectType#objectType were in old repo, what queries are expected? -CREATE INDEX m_generic_object_name_orig_idx ON m_generic_object (name_orig); -ALTER TABLE m_generic_object ADD CONSTRAINT m_generic_object_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_generic_object_nameOrig_idx ON m_generic_object (nameOrig); +ALTER TABLE m_generic_object ADD CONSTRAINT m_generic_object_nameNorm_key UNIQUE (nameNorm); -- endregion -- region USER related tables @@ -441,23 +442,23 @@ ALTER TABLE m_generic_object ADD CONSTRAINT m_generic_object_name_norm_key UNIQU CREATE TABLE m_user ( oid UUID NOT NULL PRIMARY KEY REFERENCES m_object_oid(oid), objectType ObjectType GENERATED ALWAYS AS ('USER') STORED, - additionalName_orig TEXT, - additionalName_norm TEXT, + additionalNameOrig TEXT, + additionalNameNorm TEXT, employeeNumber TEXT, - familyName_orig TEXT, - familyName_norm TEXT, - fullName_orig TEXT, - fullName_norm TEXT, - givenName_orig TEXT, - givenName_norm TEXT, - honorificPrefix_orig TEXT, - honorificPrefix_norm TEXT, - honorificSuffix_orig TEXT, - honorificSuffix_norm TEXT, - nickName_orig TEXT, - nickName_norm TEXT, - title_orig TEXT, - title_norm TEXT + familyNameOrig TEXT, + familyNameNorm TEXT, + fullNameOrig TEXT, + fullNameNorm TEXT, + givenNameOrig TEXT, + givenNameNorm TEXT, + honorificPrefixOrig TEXT, + honorificPrefixNorm TEXT, + honorificSuffixOrig TEXT, + honorificSuffixNorm TEXT, + nickNameOrig TEXT, + nickNameNorm TEXT, + titleOrig TEXT, + titleNorm TEXT ) INHERITS (m_focus); @@ -468,13 +469,13 @@ CREATE TRIGGER m_user_update_tr BEFORE UPDATE ON m_user CREATE TRIGGER m_user_oid_delete_tr AFTER DELETE ON m_user FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_user_name_orig_idx ON m_user (name_orig); -ALTER TABLE m_user ADD CONSTRAINT m_user_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_user_nameOrig_idx ON m_user (nameOrig); +ALTER TABLE m_user ADD CONSTRAINT m_user_nameNorm_key UNIQUE (nameNorm); CREATE INDEX m_user_policySituation_idx ON m_user USING GIN(policysituations gin__int_ops); CREATE INDEX m_user_ext_idx ON m_user USING gin (ext); -CREATE INDEX m_user_fullName_orig_idx ON m_user (fullName_orig); -CREATE INDEX m_user_familyName_orig_idx ON m_user (familyName_orig); -CREATE INDEX m_user_givenName_orig_idx ON m_user (givenName_orig); +CREATE INDEX m_user_fullNameOrig_idx ON m_user (fullNameOrig); +CREATE INDEX m_user_familyNameOrig_idx ON m_user (familyNameOrig); +CREATE INDEX m_user_givenNameOrig_idx ON m_user (givenNameOrig); CREATE INDEX m_user_employeeNumber_idx ON m_user (employeeNumber); /* TODO JSON of polystrings? @@ -497,8 +498,8 @@ CREATE TABLE m_abstract_role ( -- will be overridden with GENERATED value in concrete table objectType ObjectType NOT NULL, autoAssignEnabled BOOLEAN, - displayName_orig TEXT, - displayName_norm TEXT, + displayNameOrig TEXT, + displayNameNorm TEXT, identifier TEXT, requestable BOOLEAN, riskLevel TEXT, @@ -528,8 +529,8 @@ CREATE TRIGGER m_role_update_tr BEFORE UPDATE ON m_role CREATE TRIGGER m_role_oid_delete_tr AFTER DELETE ON m_role FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_role_name_orig_idx ON m_role (name_orig); -ALTER TABLE m_role ADD CONSTRAINT m_role_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_role_nameOrig_idx ON m_role (nameOrig); +ALTER TABLE m_role ADD CONSTRAINT m_role_nameNorm_key UNIQUE (nameNorm); -- Represents ServiceType, see https://wiki.evolveum.com/display/midPoint/Service+Account+Management CREATE TABLE m_service ( @@ -546,8 +547,8 @@ CREATE TRIGGER m_service_update_tr BEFORE UPDATE ON m_service CREATE TRIGGER m_service_oid_delete_tr AFTER DELETE ON m_service FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_service_name_orig_idx ON m_service (name_orig); -ALTER TABLE m_service ADD CONSTRAINT m_service_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_service_nameOrig_idx ON m_service (nameOrig); +ALTER TABLE m_service ADD CONSTRAINT m_service_nameNorm_key UNIQUE (nameNorm); -- Represents ArchetypeType, see https://wiki.evolveum.com/display/midPoint/Archetypes CREATE TABLE m_archetype ( @@ -563,8 +564,8 @@ CREATE TRIGGER m_archetype_update_tr BEFORE UPDATE ON m_archetype CREATE TRIGGER m_archetype_oid_delete_tr AFTER DELETE ON m_archetype FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_archetype_name_orig_idx ON m_archetype (name_orig); -ALTER TABLE m_archetype ADD CONSTRAINT m_archetype_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_archetype_nameOrig_idx ON m_archetype (nameOrig); +ALTER TABLE m_archetype ADD CONSTRAINT m_archetype_nameNorm_key UNIQUE (nameNorm); -- endregion -- region Organization hierarchy support @@ -584,23 +585,23 @@ CREATE TRIGGER m_org_update_tr BEFORE UPDATE ON m_org CREATE TRIGGER m_org_oid_delete_tr AFTER DELETE ON m_org FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_org_name_orig_idx ON m_org (name_orig); -ALTER TABLE m_org ADD CONSTRAINT m_org_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_org_nameOrig_idx ON m_org (nameOrig); +ALTER TABLE m_org ADD CONSTRAINT m_org_nameNorm_key UNIQUE (nameNorm); CREATE INDEX m_org_displayOrder_idx ON m_org (displayOrder); -- stores ObjectType/parentOrgRef CREATE TABLE m_ref_object_parent_org ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, referenceType ReferenceType GENERATED ALWAYS AS ('OBJECT_PARENT_ORG') STORED, - -- TODO wouldn't (owner_oid, targetOid, relation_id) perform better for typical queries? - PRIMARY KEY (owner_oid, relation_id, targetOid) + -- TODO wouldn't (ownerOid, targetOid, relationId) perform better for typical queries? + PRIMARY KEY (ownerOid, relationId, targetOid) ) INHERITS (m_reference); -- TODO is this enough? Is target+owner+relation needed too? -CREATE INDEX m_ref_object_parent_org_targetOid_relation_id_idx - ON m_ref_object_parent_org (targetOid, relation_id); +CREATE INDEX m_ref_object_parent_orgTargetOidRelationId_idx + ON m_ref_object_parent_org (targetOid, relationId); -- region org-closure /* @@ -615,7 +616,7 @@ of isParent/ChildOf searches and they never return parameter OID as a result. CREATE MATERIALIZED VIEW m_org_closure AS WITH RECURSIVE org_h ( ancestor_oid, -- ref.targetoid - descendant_oid --ref.owner_oid + descendant_oid --ref.ownerOid -- paths -- number of different paths, not used for materialized view version -- depth -- possible later, but cycle detected must be added to the recursive term ) AS ( @@ -625,13 +626,13 @@ WITH RECURSIVE org_h ( SELECT o.oid, o.oid FROM m_org o WHERE EXISTS( SELECT 1 FROM m_ref_object_parent_org r - WHERE r.targetOid = o.oid OR r.owner_oid = o.oid) + WHERE r.targetOid = o.oid OR r.ownerOid = o.oid) UNION -- recursive (iterative) term: -- Generate their parents (anc => desc, that is target => owner), => means "is parent of". SELECT par.targetoid, chi.descendant_oid -- leaving original child there generates closure FROM m_ref_object_parent_org as par, org_h as chi - WHERE par.owner_oid = chi.ancestor_oid + WHERE par.ownerOid = chi.ancestor_oid ) SELECT * FROM org_h; @@ -647,7 +648,7 @@ CREATE OR REPLACE FUNCTION mark_org_closure_for_refresh() LANGUAGE plpgsql AS $$ BEGIN - IF TG_OP = 'TRUNCATE' OR OLD.owner_type = 'ORG' OR NEW.owner_type = 'ORG' THEN + IF TG_OP = 'TRUNCATE' OR OLD.ownerType = 'ORG' OR NEW.ownerType = 'ORG' THEN INSERT INTO m_global_metadata VALUES ('orgClosureRefreshNeeded', 'true') ON CONFLICT (name) DO UPDATE SET value = 'true'; END IF; @@ -701,9 +702,9 @@ CREATE TABLE m_resource ( objectType ObjectType GENERATED ALWAYS AS ('RESOURCE') STORED, business_administrativeState ResourceAdministrativeStateType, operationalState_lastAvailabilityStatus AvailabilityStatusType, - connectorRef_targetOid UUID, - connectorRef_targetType ObjectType, - connectorRef_relation_id INTEGER REFERENCES m_uri(id) + connectorRefTargetOid UUID, + connectorRefTargetType ObjectType, + connectorRefRelationId INTEGER REFERENCES m_uri(id) ) INHERITS (m_object); @@ -714,31 +715,31 @@ CREATE TRIGGER m_resource_update_tr BEFORE UPDATE ON m_resource CREATE TRIGGER m_resource_oid_delete_tr AFTER DELETE ON m_resource FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_resource_name_orig_idx ON m_resource (name_orig); -ALTER TABLE m_resource ADD CONSTRAINT m_resource_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_resource_nameOrig_idx ON m_resource (nameOrig); +ALTER TABLE m_resource ADD CONSTRAINT m_resource_nameNorm_key UNIQUE (nameNorm); -- stores ResourceType/business/approverRef CREATE TABLE m_ref_resource_business_configuration_approver ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, referenceType ReferenceType GENERATED ALWAYS AS ('RESOURCE_BUSINESS_CONFIGURATION_APPROVER') STORED, - PRIMARY KEY (owner_oid, relation_id, targetOid) + PRIMARY KEY (ownerOid, relationId, targetOid) ) INHERITS (m_reference); -CREATE INDEX m_ref_resource_biz_config_approver_targetOid_relation_id_idx - ON m_ref_resource_business_configuration_approver (targetOid, relation_id); +CREATE INDEX m_ref_resource_biz_config_approverTargetOidRelationId_idx + ON m_ref_resource_business_configuration_approver (targetOid, relationId); -- Represents ShadowType, see https://wiki.evolveum.com/display/midPoint/Shadow+Objects -- and also https://docs.evolveum.com/midpoint/reference/schema/focus-and-projections/ CREATE TABLE m_shadow ( oid UUID NOT NULL PRIMARY KEY REFERENCES m_object_oid(oid), objectType ObjectType GENERATED ALWAYS AS ('SHADOW') STORED, - objectClass_id INTEGER REFERENCES m_uri(id), - resourceRef_targetOid UUID, - resourceRef_targetType ObjectType, - resourceRef_relation_id INTEGER REFERENCES m_uri(id), + objectClassId INTEGER REFERENCES m_uri(id), + resourceRefTargetOid UUID, + resourceRefTargetType ObjectType, + resourceRefRelationId INTEGER REFERENCES m_uri(id), intent TEXT, kind ShadowKindType, attemptNumber INTEGER, -- TODO how is this mapped? @@ -762,14 +763,14 @@ CREATE TRIGGER m_shadow_update_tr BEFORE UPDATE ON m_shadow CREATE TRIGGER m_shadow_oid_delete_tr AFTER DELETE ON m_shadow FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_shadow_name_orig_idx ON m_shadow (name_orig); -ALTER TABLE m_shadow ADD CONSTRAINT m_shadow_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_shadow_nameOrig_idx ON m_shadow (nameOrig); +ALTER TABLE m_shadow ADD CONSTRAINT m_shadow_nameNorm_key UNIQUE (nameNorm); CREATE INDEX m_shadow_policySituation_idx ON m_shadow USING GIN(policysituations gin__int_ops); CREATE INDEX m_shadow_ext_idx ON m_shadow USING gin (ext); /* TODO: reconsider, especially boolean things like dead (perhaps WHERE in other indexes?) Also consider partitioning by some of the attributes (class/kind/intent?) -CREATE INDEX iShadowResourceRef ON m_shadow (resourceRef_targetOid); +CREATE INDEX iShadowResourceRef ON m_shadow (resourceRefTargetOid); CREATE INDEX iShadowDead ON m_shadow (dead); CREATE INDEX iShadowKind ON m_shadow (kind); CREATE INDEX iShadowIntent ON m_shadow (intent); @@ -778,7 +779,7 @@ CREATE INDEX iShadowFailedOperationType ON m_shadow (failedOperationType); CREATE INDEX iShadowSyncSituation ON m_shadow (synchronizationSituation); CREATE INDEX iShadowPendingOperationCount ON m_shadow (pendingOperationCount); ALTER TABLE m_shadow ADD CONSTRAINT iPrimaryIdentifierValueWithOC - UNIQUE (primaryIdentifierValue, objectClass, resourceRef_targetOid); + UNIQUE (primaryIdentifierValue, objectClass, resourceRefTargetOid); */ -- Represents NodeType, see https://wiki.evolveum.com/display/midPoint/Managing+cluster+nodes @@ -796,8 +797,8 @@ CREATE TRIGGER m_node_update_tr BEFORE UPDATE ON m_node CREATE TRIGGER m_node_oid_delete_tr AFTER DELETE ON m_node FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_node_name_orig_idx ON m_node (name_orig); -ALTER TABLE m_node ADD CONSTRAINT m_node_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_node_nameOrig_idx ON m_node (nameOrig); +ALTER TABLE m_node ADD CONSTRAINT m_node_nameNorm_key UNIQUE (nameNorm); -- not interested in ext index for this one, this table will be small -- Represents SystemConfigurationType, see https://wiki.evolveum.com/display/midPoint/System+Configuration+Object @@ -846,8 +847,8 @@ CREATE TRIGGER m_object_collection_update_tr BEFORE UPDATE ON m_object_collectio CREATE TRIGGER m_object_collection_oid_delete_tr AFTER DELETE ON m_object_collection FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_object_collection_name_orig_idx ON m_object_collection (name_orig); -ALTER TABLE m_object_collection ADD CONSTRAINT m_object_collection_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_object_collection_nameOrig_idx ON m_object_collection (nameOrig); +ALTER TABLE m_object_collection ADD CONSTRAINT m_object_collection_nameNorm_key UNIQUE (nameNorm); -- Represents DashboardType, see https://wiki.evolveum.com/display/midPoint/Dashboard+configuration CREATE TABLE m_dashboard ( @@ -863,8 +864,8 @@ CREATE TRIGGER m_dashboard_update_tr BEFORE UPDATE ON m_dashboard CREATE TRIGGER m_dashboard_oid_delete_tr AFTER DELETE ON m_dashboard FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_dashboard_name_orig_idx ON m_dashboard (name_orig); -ALTER TABLE m_dashboard ADD CONSTRAINT m_dashboard_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_dashboard_nameOrig_idx ON m_dashboard (nameOrig); +ALTER TABLE m_dashboard ADD CONSTRAINT m_dashboard_nameNorm_key UNIQUE (nameNorm); -- Represents ValuePolicyType CREATE TABLE m_value_policy ( @@ -880,8 +881,8 @@ CREATE TRIGGER m_value_policy_update_tr BEFORE UPDATE ON m_value_policy CREATE TRIGGER m_value_policy_oid_delete_tr AFTER DELETE ON m_value_policy FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_value_policy_name_orig_idx ON m_value_policy (name_orig); -ALTER TABLE m_value_policy ADD CONSTRAINT m_value_policy_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_value_policy_nameOrig_idx ON m_value_policy (nameOrig); +ALTER TABLE m_value_policy ADD CONSTRAINT m_value_policy_nameNorm_key UNIQUE (nameNorm); -- Represents ReportType, see https://wiki.evolveum.com/display/midPoint/Report+Configuration CREATE TABLE m_report ( @@ -899,17 +900,17 @@ CREATE TRIGGER m_report_update_tr BEFORE UPDATE ON m_report CREATE TRIGGER m_report_oid_delete_tr AFTER DELETE ON m_report FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_report_name_orig_idx ON m_report (name_orig); -ALTER TABLE m_report ADD CONSTRAINT m_report_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_report_nameOrig_idx ON m_report (nameOrig); +ALTER TABLE m_report ADD CONSTRAINT m_report_nameNorm_key UNIQUE (nameNorm); -- TODO old repo had index on parent (boolean), does it make sense? if so, which value is sparse? -- Represents ReportDataType, see also m_report above CREATE TABLE m_report_data ( oid UUID NOT NULL PRIMARY KEY REFERENCES m_object_oid(oid), objectType ObjectType GENERATED ALWAYS AS ('REPORT_DATA') STORED, - reportRef_targetOid UUID, - reportRef_targetType ObjectType, - reportRef_relation_id INTEGER REFERENCES m_uri(id) + reportRefTargetOid UUID, + reportRefTargetType ObjectType, + reportRefRelationId INTEGER REFERENCES m_uri(id) ) INHERITS (m_object); @@ -920,8 +921,8 @@ CREATE TRIGGER m_report_data_update_tr BEFORE UPDATE ON m_report_data CREATE TRIGGER m_report_data_oid_delete_tr AFTER DELETE ON m_report_data FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_report_data_name_orig_idx ON m_report_data (name_orig); -ALTER TABLE m_report_data ADD CONSTRAINT m_report_data_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_report_data_nameOrig_idx ON m_report_data (nameOrig); +ALTER TABLE m_report_data ADD CONSTRAINT m_report_data_nameNorm_key UNIQUE (nameNorm); -- Represents LookupTableType, see https://wiki.evolveum.com/display/midPoint/Lookup+Tables CREATE TABLE m_lookup_table ( @@ -937,25 +938,25 @@ CREATE TRIGGER m_lookup_table_update_tr BEFORE UPDATE ON m_lookup_table CREATE TRIGGER m_lookup_table_oid_delete_tr AFTER DELETE ON m_lookup_table FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_lookup_table_name_orig_idx ON m_lookup_table (name_orig); -ALTER TABLE m_lookup_table ADD CONSTRAINT m_lookup_table_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_lookup_table_nameOrig_idx ON m_lookup_table (nameOrig); +ALTER TABLE m_lookup_table ADD CONSTRAINT m_lookup_table_nameNorm_key UNIQUE (nameNorm); -- Represents LookupTableRowType, see also m_lookup_table above CREATE TABLE m_lookup_table_row ( - owner_oid UUID NOT NULL REFERENCES m_lookup_table(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_lookup_table(oid) ON DELETE CASCADE, containerType ContainerType GENERATED ALWAYS AS ('LOOKUP_TABLE_ROW') STORED, key TEXT, value TEXT, - label_orig TEXT, - label_norm TEXT, + labelOrig TEXT, + labelNorm TEXT, lastChangeTimestamp TIMESTAMPTZ, - PRIMARY KEY (owner_oid, cid) + PRIMARY KEY (ownerOid, cid) ) INHERITS(m_container); ALTER TABLE m_lookup_table_row - ADD CONSTRAINT m_lookup_table_row_owner_oid_key_key UNIQUE (owner_oid, key); + ADD CONSTRAINT m_lookup_table_row_ownerOid_key_key UNIQUE (ownerOid, key); -- Represents ConnectorType, see https://wiki.evolveum.com/display/midPoint/Identity+Connectors CREATE TABLE m_connector ( @@ -964,10 +965,10 @@ CREATE TABLE m_connector ( connectorBundle TEXT, -- typically a package name connectorType TEXT, -- typically a class name connectorVersion TEXT, - framework_id INTEGER REFERENCES m_uri(id), - connectorHostRef_targetOid UUID, - connectorHostRef_targetType ObjectType, - connectorHostRef_relation_id INTEGER REFERENCES m_uri(id), + frameworkId INTEGER REFERENCES m_uri(id), + connectorHostRefTargetOid UUID, + connectorHostRefTargetType ObjectType, + connectorHostRefRelationId INTEGER REFERENCES m_uri(id), targetSystemTypes TEXT[] -- TODO any strings? cached URIs? ) INHERITS (m_object); @@ -979,8 +980,8 @@ CREATE TRIGGER m_connector_update_tr BEFORE UPDATE ON m_connector CREATE TRIGGER m_connector_oid_delete_tr AFTER DELETE ON m_connector FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_connector_name_orig_idx ON m_connector (name_orig); -ALTER TABLE m_connector ADD CONSTRAINT m_connector_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_connector_nameOrig_idx ON m_connector (nameOrig); +ALTER TABLE m_connector ADD CONSTRAINT m_connector_nameNorm_key UNIQUE (nameNorm); -- TODO array/json in m_connector table -- CREATE TABLE m_connector_target_system ( @@ -1006,8 +1007,8 @@ CREATE TRIGGER m_connector_host_update_tr BEFORE UPDATE ON m_connector_host CREATE TRIGGER m_connector_host_oid_delete_tr AFTER DELETE ON m_connector_host FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_connector_host_name_orig_idx ON m_connector_host (name_orig); -ALTER TABLE m_connector_host ADD CONSTRAINT m_connector_host_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_connector_host_nameOrig_idx ON m_connector_host (nameOrig); +ALTER TABLE m_connector_host ADD CONSTRAINT m_connector_host_nameNorm_key UNIQUE (nameNorm); -- Represents persistent TaskType, see https://wiki.evolveum.com/display/midPoint/Task+Manager CREATE TABLE m_task ( @@ -1019,16 +1020,16 @@ CREATE TABLE m_task ( completionTimestamp TIMESTAMPTZ, executionStatus TaskExecutionStateType, fullResult BYTEA, - handlerUri_id INTEGER REFERENCES m_uri(id), + handlerUriId INTEGER REFERENCES m_uri(id), lastRunStartTimestamp TIMESTAMPTZ, lastRunFinishTimestamp TIMESTAMPTZ, - node TEXT, -- node_id only for information purposes - objectRef_targetOid UUID, - objectRef_targetType ObjectType, - objectRef_relation_id INTEGER REFERENCES m_uri(id), - ownerRef_targetOid UUID, - ownerRef_targetType ObjectType, - ownerRef_relation_id INTEGER REFERENCES m_uri(id), + node TEXT, -- nodeId only for information purposes + objectRefTargetOid UUID, + objectRefTargetType ObjectType, + objectRefRelationId INTEGER REFERENCES m_uri(id), + ownerRefTargetOid UUID, + ownerRefTargetType ObjectType, + ownerRefRelationId INTEGER REFERENCES m_uri(id), parent TEXT, -- value of taskIdentifier recurrence TaskRecurrenceType, resultStatus OperationResultStatusType, @@ -1045,10 +1046,10 @@ CREATE TRIGGER m_task_update_tr BEFORE UPDATE ON m_task CREATE TRIGGER m_task_oid_delete_tr AFTER DELETE ON m_task FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_task_name_orig_idx ON m_task (name_orig); -ALTER TABLE m_task ADD CONSTRAINT m_task_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_task_nameOrig_idx ON m_task (nameOrig); +ALTER TABLE m_task ADD CONSTRAINT m_task_nameNorm_key UNIQUE (nameNorm); CREATE INDEX m_task_parent_idx ON m_task (parent); -CREATE INDEX m_task_objectRef_targetOid_idx ON m_task(objectRef_targetOid); +CREATE INDEX m_task_objectRefTargetOid_idx ON m_task(objectRefTargetOid); ALTER TABLE m_task ADD CONSTRAINT m_task_taskIdentifier_key UNIQUE (taskIdentifier); CREATE INDEX m_task_dependentTaskIdentifiers_idx ON m_task USING GIN(dependentTaskIdentifiers); -- endregion @@ -1060,18 +1061,18 @@ CREATE TABLE m_case ( objectType ObjectType GENERATED ALWAYS AS ('CASE') STORED, state TEXT, closeTimestamp TIMESTAMPTZ, - objectRef_targetOid UUID, - objectRef_targetType ObjectType, - objectRef_relation_id INTEGER REFERENCES m_uri(id), - parentRef_targetOid UUID, - parentRef_targetType ObjectType, - parentRef_relation_id INTEGER REFERENCES m_uri(id), - requestorRef_targetOid UUID, - requestorRef_targetType ObjectType, - requestorRef_relation_id INTEGER REFERENCES m_uri(id), - targetRef_targetOid UUID, - targetRef_targetType ObjectType, - targetRef_relation_id INTEGER REFERENCES m_uri(id) + objectRefTargetOid UUID, + objectRefTargetType ObjectType, + objectRefRelationId INTEGER REFERENCES m_uri(id), + parentRefTargetOid UUID, + parentRefTargetType ObjectType, + parentRefRelationId INTEGER REFERENCES m_uri(id), + requestorRefTargetOid UUID, + requestorRefTargetType ObjectType, + requestorRefRelationId INTEGER REFERENCES m_uri(id), + targetRefTargetOid UUID, + targetRefTargetType ObjectType, + targetRefRelationId INTEGER REFERENCES m_uri(id) ) INHERITS (m_object); @@ -1082,48 +1083,48 @@ CREATE TRIGGER m_case_update_tr BEFORE UPDATE ON m_case CREATE TRIGGER m_case_oid_delete_tr AFTER DELETE ON m_case FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_case_name_orig_idx ON m_case (name_orig); -ALTER TABLE m_case ADD CONSTRAINT m_case_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_case_nameOrig_idx ON m_case (nameOrig); +ALTER TABLE m_case ADD CONSTRAINT m_case_nameNorm_key UNIQUE (nameNorm); /* -CREATE INDEX iCaseTypeObjectRefTargetOid ON m_case(objectRef_targetOid); -CREATE INDEX iCaseTypeTargetRefTargetOid ON m_case(targetRef_targetOid); -CREATE INDEX iCaseTypeParentRefTargetOid ON m_case(parentRef_targetOid); -CREATE INDEX iCaseTypeRequestorRefTargetOid ON m_case(requestorRef_targetOid); +CREATE INDEX iCaseTypeObjectRefTargetOid ON m_case(objectRefTargetOid); +CREATE INDEX iCaseTypeTargetRefTargetOid ON m_case(targetRefTargetOid); +CREATE INDEX iCaseTypeParentRefTargetOid ON m_case(parentRefTargetOid); +CREATE INDEX iCaseTypeRequestorRefTargetOid ON m_case(requestorRefTargetOid); CREATE INDEX iCaseTypeCloseTimestamp ON m_case(closeTimestamp); CREATE TABLE m_case_wi ( id INTEGER NOT NULL, - owner_oid UUID NOT NULL, + ownerOid UUID NOT NULL, closeTimestamp TIMESTAMPTZ, createTimestamp TIMESTAMPTZ, deadline TIMESTAMPTZ, originalAssigneeRef_relation VARCHAR(157), - originalAssigneeRef_targetOid UUID, - originalAssigneeRef_targetType INTEGER, + originalAssigneeRefTargetOid UUID, + originalAssigneeRefTargetType INTEGER, outcome TEXT, performerRef_relation VARCHAR(157), - performerRef_targetOid UUID, - performerRef_targetType INTEGER, + performerRefTargetOid UUID, + performerRefTargetType INTEGER, stageNumber INTEGER, - PRIMARY KEY (owner_oid, id) + PRIMARY KEY (ownerOid, id) ); ALTER TABLE m_case_wi - ADD CONSTRAINT fk_case_wi_owner FOREIGN KEY (owner_oid) REFERENCES m_case; + ADD CONSTRAINT fk_case_wi_owner FOREIGN KEY (ownerOid) REFERENCES m_case; CREATE TABLE m_case_wi_reference ( owner_id INTEGER NOT NULL, - owner_owner_oid UUID NOT NULL, + owner_ownerOid UUID NOT NULL, reference_type INTEGER NOT NULL, relation VARCHAR(157) NOT NULL, targetOid UUID NOT NULL, targetType INTEGER, - PRIMARY KEY (owner_owner_oid, owner_id, reference_type, targetOid, relation) + PRIMARY KEY (owner_ownerOid, owner_id, reference_type, targetOid, relation) ); ALTER TABLE m_case_wi_reference - ADD CONSTRAINT fk_case_wi_reference_owner FOREIGN KEY (owner_owner_oid, owner_id) REFERENCES m_case_wi; + ADD CONSTRAINT fk_case_wi_reference_owner FOREIGN KEY (owner_ownerOid, owner_id) REFERENCES m_case_wi; CREATE INDEX iCaseWorkItemRefTargetOid ON m_case_wi_reference (targetOid); */ -- endregion @@ -1133,12 +1134,12 @@ CREATE INDEX iCaseWorkItemRefTargetOid ON m_case_wi_reference (targetOid); CREATE TABLE m_access_cert_definition ( oid UUID NOT NULL PRIMARY KEY REFERENCES m_object_oid(oid), objectType ObjectType GENERATED ALWAYS AS ('ACCESS_CERTIFICATION_DEFINITION') STORED, - handlerUri_id INTEGER REFERENCES m_uri(id), + handlerUriId INTEGER REFERENCES m_uri(id), lastCampaignStartedTimestamp TIMESTAMPTZ, lastCampaignClosedTimestamp TIMESTAMPTZ, - ownerRef_targetOid UUID, - ownerRef_targetType ObjectType, - ownerRef_relation_id INTEGER REFERENCES m_uri(id) + ownerRefTargetOid UUID, + ownerRefTargetType ObjectType, + ownerRefRelationId INTEGER REFERENCES m_uri(id) ) INHERITS (m_object); @@ -1149,24 +1150,24 @@ CREATE TRIGGER m_access_cert_definition_update_tr BEFORE UPDATE ON m_access_cert CREATE TRIGGER m_access_cert_definition_oid_delete_tr AFTER DELETE ON m_access_cert_definition FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_access_cert_definition_name_orig_idx ON m_access_cert_definition (name_orig); +CREATE INDEX m_access_cert_definition_nameOrig_idx ON m_access_cert_definition (nameOrig); ALTER TABLE m_access_cert_definition - ADD CONSTRAINT m_access_cert_definition_name_norm_key UNIQUE (name_norm); + ADD CONSTRAINT m_access_cert_definition_nameNorm_key UNIQUE (nameNorm); CREATE INDEX m_access_cert_definition_ext_idx ON m_access_cert_definition USING gin (ext); -- TODO not mapped yet CREATE TABLE m_access_cert_campaign ( oid UUID NOT NULL PRIMARY KEY REFERENCES m_object_oid(oid), objectType ObjectType GENERATED ALWAYS AS ('ACCESS_CERTIFICATION_CAMPAIGN') STORED, - definitionRef_targetOid UUID, - definitionRef_targetType ObjectType, - definitionRef_relation_id INTEGER REFERENCES m_uri(id), + definitionRefTargetOid UUID, + definitionRefTargetType ObjectType, + definitionRefRelationId INTEGER REFERENCES m_uri(id), endTimestamp TIMESTAMPTZ, - handlerUri_id INTEGER REFERENCES m_uri(id), + handlerUriId INTEGER REFERENCES m_uri(id), iteration INTEGER NOT NULL, - ownerRef_targetOid UUID, - ownerRef_targetType ObjectType, - ownerRef_relation_id INTEGER REFERENCES m_uri(id), + ownerRefTargetOid UUID, + ownerRefTargetType ObjectType, + ownerRefRelationId INTEGER REFERENCES m_uri(id), stageNumber INTEGER, startTimestamp TIMESTAMPTZ, state INTEGER @@ -1180,13 +1181,13 @@ CREATE TRIGGER m_access_cert_campaign_update_tr BEFORE UPDATE ON m_access_cert_c CREATE TRIGGER m_access_cert_campaign_oid_delete_tr AFTER DELETE ON m_access_cert_campaign FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_access_cert_campaign_name_orig_idx ON m_access_cert_campaign (name_orig); +CREATE INDEX m_access_cert_campaign_nameOrig_idx ON m_access_cert_campaign (nameOrig); ALTER TABLE m_access_cert_campaign - ADD CONSTRAINT m_access_cert_campaign_name_norm_key UNIQUE (name_norm); + ADD CONSTRAINT m_access_cert_campaign_nameNorm_key UNIQUE (nameNorm); CREATE INDEX m_access_cert_campaign_ext_idx ON m_access_cert_campaign USING gin (ext); CREATE TABLE m_access_cert_case ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, containerType ContainerType GENERATED ALWAYS AS ('ACCESS_CERTIFICATION_CASE') STORED, administrativeStatus INTEGER, archiveTimestamp TIMESTAMPTZ, @@ -1201,77 +1202,77 @@ CREATE TABLE m_access_cert_case ( currentStageOutcome TEXT, fullObject BYTEA, iteration INTEGER NOT NULL, - objectRef_targetOid UUID, - objectRef_targetType ObjectType, - objectRef_relation_id INTEGER REFERENCES m_uri(id), - orgRef_targetOid UUID, - orgRef_targetType ObjectType, - orgRef_relation_id INTEGER REFERENCES m_uri(id), + objectRefTargetOid UUID, + objectRefTargetType ObjectType, + objectRefRelationId INTEGER REFERENCES m_uri(id), + orgRefTargetOid UUID, + orgRefTargetType ObjectType, + orgRefRelationId INTEGER REFERENCES m_uri(id), outcome TEXT, remediedTimestamp TIMESTAMPTZ, reviewDeadline TIMESTAMPTZ, reviewRequestedTimestamp TIMESTAMPTZ, stageNumber INTEGER, - targetRef_targetOid UUID, - targetRef_targetType ObjectType, - targetRef_relation_id INTEGER REFERENCES m_uri(id), - tenantRef_targetOid UUID, - tenantRef_targetType ObjectType, - tenantRef_relation_id INTEGER REFERENCES m_uri(id), - - PRIMARY KEY (owner_oid, cid) + targetRefTargetOid UUID, + targetRefTargetType ObjectType, + targetRefRelationId INTEGER REFERENCES m_uri(id), + tenantRefTargetOid UUID, + tenantRefTargetType ObjectType, + tenantRefRelationId INTEGER REFERENCES m_uri(id), + + PRIMARY KEY (ownerOid, cid) ) INHERITS(m_container); CREATE TABLE m_access_cert_wi ( - owner_oid UUID NOT NULL, -- PK+FK + ownerOid UUID NOT NULL, -- PK+FK acc_cert_case_cid INTEGER NOT NULL, -- PK+FK containerType ContainerType GENERATED ALWAYS AS ('ACCESS_CERTIFICATION_WORK_ITEM') STORED, closeTimestamp TIMESTAMPTZ, iteration INTEGER NOT NULL, outcome TEXT, outputChangeTimestamp TIMESTAMPTZ, - performerRef_targetOid UUID, - performerRef_targetType ObjectType, - performerRef_relation_id INTEGER REFERENCES m_uri(id), + performerRefTargetOid UUID, + performerRefTargetType ObjectType, + performerRefRelationId INTEGER REFERENCES m_uri(id), stageNumber INTEGER, - PRIMARY KEY (owner_oid, acc_cert_case_cid, cid) + PRIMARY KEY (ownerOid, acc_cert_case_cid, cid) ) INHERITS(m_container); ALTER TABLE m_access_cert_wi - ADD CONSTRAINT m_access_cert_wi_id_fk FOREIGN KEY (owner_oid, acc_cert_case_cid) - REFERENCES m_access_cert_case (owner_oid, cid) + ADD CONSTRAINT m_access_cert_wi_id_fk FOREIGN KEY (ownerOid, acc_cert_case_cid) + REFERENCES m_access_cert_case (ownerOid, cid) ON DELETE CASCADE; -- TODO rework to inherit from reference tables CREATE TABLE m_access_cert_wi_reference ( - owner_oid UUID NOT NULL, -- PK+FK + ownerOid UUID NOT NULL, -- PK+FK acc_cert_case_cid INTEGER NOT NULL, -- PK+FK acc_cert_wi_cid INTEGER NOT NULL, -- PK+FK targetOid UUID NOT NULL, -- more PK columns... targetType ObjectType, - relation_id INTEGER NOT NULL REFERENCES m_uri(id), + relationId INTEGER NOT NULL REFERENCES m_uri(id), -- TODO is the order of last two components optimal for index/query? - PRIMARY KEY (owner_oid, acc_cert_case_cid, acc_cert_wi_cid, relation_id, targetOid) + PRIMARY KEY (ownerOid, acc_cert_case_cid, acc_cert_wi_cid, relationId, targetOid) ); ALTER TABLE m_access_cert_wi_reference ADD CONSTRAINT m_access_cert_wi_reference_id_fk - FOREIGN KEY (owner_oid, acc_cert_case_cid, acc_cert_wi_cid) - REFERENCES m_access_cert_wi (owner_oid, acc_cert_case_cid, cid) + FOREIGN KEY (ownerOid, acc_cert_case_cid, acc_cert_wi_cid) + REFERENCES m_access_cert_wi (ownerOid, acc_cert_case_cid, cid) ON DELETE CASCADE; /* -CREATE INDEX iCertCampaignNameOrig ON m_access_cert_campaign (name_orig); -ALTER TABLE m_access_cert_campaign ADD CONSTRAINT uc_access_cert_campaign_name UNIQUE (name_norm); -CREATE INDEX iCaseObjectRefTargetOid ON m_access_cert_case (objectRef_targetOid); -CREATE INDEX iCaseTargetRefTargetOid ON m_access_cert_case (targetRef_targetOid); -CREATE INDEX iCaseTenantRefTargetOid ON m_access_cert_case (tenantRef_targetOid); -CREATE INDEX iCaseOrgRefTargetOid ON m_access_cert_case (orgRef_targetOid); -CREATE INDEX iCertDefinitionNameOrig ON m_access_cert_definition (name_orig); -ALTER TABLE m_access_cert_definition ADD CONSTRAINT uc_access_cert_definition_name UNIQUE (name_norm); +CREATE INDEX iCertCampaignNameOrig ON m_access_cert_campaign (nameOrig); +ALTER TABLE m_access_cert_campaign ADD CONSTRAINT uc_access_cert_campaign_name UNIQUE (nameNorm); +CREATE INDEX iCaseObjectRefTargetOid ON m_access_cert_case (objectRefTargetOid); +CREATE INDEX iCaseTargetRefTargetOid ON m_access_cert_case (targetRefTargetOid); +CREATE INDEX iCaseTenantRefTargetOid ON m_access_cert_case (tenantRefTargetOid); +CREATE INDEX iCaseOrgRefTargetOid ON m_access_cert_case (orgRefTargetOid); +CREATE INDEX iCertDefinitionNameOrig ON m_access_cert_definition (nameOrig); +ALTER TABLE m_access_cert_definition ADD CONSTRAINT uc_access_cert_definition_name UNIQUE (nameNorm); CREATE INDEX iCertWorkItemRefTargetOid ON m_access_cert_wi_reference (targetOid); */ -- endregion @@ -1290,20 +1291,20 @@ CREATE TRIGGER m_object_template_update_tr BEFORE UPDATE ON m_object_template CREATE TRIGGER m_object_template_oid_delete_tr AFTER DELETE ON m_object_template FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_object_template_name_orig_idx ON m_object_template (name_orig); -ALTER TABLE m_object_template ADD CONSTRAINT m_object_template_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_object_template_nameOrig_idx ON m_object_template (nameOrig); +ALTER TABLE m_object_template ADD CONSTRAINT m_object_template_nameNorm_key UNIQUE (nameNorm); -- stores ObjectTemplateType/includeRef CREATE TABLE m_ref_include ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, referenceType ReferenceType GENERATED ALWAYS AS ('INCLUDE') STORED, - PRIMARY KEY (owner_oid, relation_id, targetOid) + PRIMARY KEY (ownerOid, relationId, targetOid) ) INHERITS (m_reference); -CREATE INDEX m_ref_include_targetOid_relation_id_idx - ON m_ref_include (targetOid, relation_id); +CREATE INDEX m_ref_includeTargetOidRelationId_idx + ON m_ref_include (targetOid, relationId); -- endregion -- region FunctionLibrary/Sequence/Form tables @@ -1321,8 +1322,8 @@ CREATE TRIGGER m_function_library_update_tr BEFORE UPDATE ON m_function_library CREATE TRIGGER m_function_library_oid_delete_tr AFTER DELETE ON m_function_library FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_function_library_name_orig_idx ON m_function_library (name_orig); -ALTER TABLE m_function_library ADD CONSTRAINT m_function_library_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_function_library_nameOrig_idx ON m_function_library (nameOrig); +ALTER TABLE m_function_library ADD CONSTRAINT m_function_library_nameNorm_key UNIQUE (nameNorm); -- Represents SequenceType, see https://wiki.evolveum.com/display/midPoint/Sequences CREATE TABLE m_sequence ( @@ -1338,8 +1339,8 @@ CREATE TRIGGER m_sequence_update_tr BEFORE UPDATE ON m_sequence CREATE TRIGGER m_sequence_oid_delete_tr AFTER DELETE ON m_sequence FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_sequence_name_orig_idx ON m_sequence (name_orig); -ALTER TABLE m_sequence ADD CONSTRAINT m_sequence_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_sequence_nameOrig_idx ON m_sequence (nameOrig); +ALTER TABLE m_sequence ADD CONSTRAINT m_sequence_nameNorm_key UNIQUE (nameNorm); -- Represents FormType, see https://wiki.evolveum.com/display/midPoint/Custom+forms CREATE TABLE m_form ( @@ -1355,8 +1356,8 @@ CREATE TRIGGER m_form_update_tr BEFORE UPDATE ON m_form CREATE TRIGGER m_form_oid_delete_tr AFTER DELETE ON m_form FOR EACH ROW EXECUTE PROCEDURE delete_object_oid(); -CREATE INDEX m_form_name_orig_idx ON m_form (name_orig); -ALTER TABLE m_form ADD CONSTRAINT m_form_name_norm_key UNIQUE (name_norm); +CREATE INDEX m_form_nameOrig_idx ON m_form (nameOrig); +ALTER TABLE m_form ADD CONSTRAINT m_form_nameNorm_key UNIQUE (nameNorm); -- endregion -- region Assignment/Inducement table @@ -1367,30 +1368,30 @@ ALTER TABLE m_form ADD CONSTRAINT m_form_name_norm_key UNIQUE (name_norm); --1 45 (inducements) --0 48756229 CREATE TABLE m_assignment ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, -- this is different from other containers, this is not generated, app must provide it containerType ContainerType NOT NULL CHECK (containerType IN ('ASSIGNMENT', 'INDUCEMENT')), - owner_type ObjectType NOT NULL, + ownerType ObjectType NOT NULL, lifecycleState TEXT, orderValue INTEGER, - orgRef_targetOid UUID, - orgRef_targetType ObjectType, - orgRef_relation_id INTEGER REFERENCES m_uri(id), - targetRef_targetOid UUID, - targetRef_targetType ObjectType, - targetRef_relation_id INTEGER REFERENCES m_uri(id), - tenantRef_targetOid UUID, - tenantRef_targetType ObjectType, - tenantRef_relation_id INTEGER REFERENCES m_uri(id), + orgRefTargetOid UUID, + orgRefTargetType ObjectType, + orgRefRelationId INTEGER REFERENCES m_uri(id), + targetRefTargetOid UUID, + targetRefTargetType ObjectType, + targetRefRelationId INTEGER REFERENCES m_uri(id), + tenantRefTargetOid UUID, + tenantRefTargetType ObjectType, + tenantRefRelationId INTEGER REFERENCES m_uri(id), -- TODO what is this? see RAssignment.getExtension (both extId/Oid) extId INTEGER, extOid TEXT, -- is this UUID too? policySituations INTEGER[], -- soft-references m_uri, add index per table ext JSONB, -- construction - resourceRef_targetOid UUID, - resourceRef_targetType ObjectType, - resourceRef_relation_id INTEGER REFERENCES m_uri(id), + resourceRefTargetOid UUID, + resourceRefTargetType ObjectType, + resourceRefRelationId INTEGER REFERENCES m_uri(id), -- activation administrativeStatus ActivationStatusType, effectiveStatus ActivationStatusType, @@ -1403,18 +1404,18 @@ CREATE TABLE m_assignment ( validityChangeTimestamp TIMESTAMPTZ, archiveTimestamp TIMESTAMPTZ, -- metadata - creatorRef_targetOid UUID, - creatorRef_targetType ObjectType, - creatorRef_relation_id INTEGER REFERENCES m_uri(id), - createChannel_id INTEGER, + creatorRefTargetOid UUID, + creatorRefTargetType ObjectType, + creatorRefRelationId INTEGER REFERENCES m_uri(id), + createChannelId INTEGER, createTimestamp TIMESTAMPTZ, - modifierRef_targetOid UUID, - modifierRef_targetType ObjectType, - modifierRef_relation_id INTEGER REFERENCES m_uri(id), - modifyChannel_id INTEGER, + modifierRefTargetOid UUID, + modifierRefTargetType ObjectType, + modifierRefRelationId INTEGER REFERENCES m_uri(id), + modifyChannelId INTEGER, modifyTimestamp TIMESTAMPTZ, - PRIMARY KEY (owner_oid, cid) + PRIMARY KEY (ownerOid, cid) ) INHERITS(m_container); @@ -1426,51 +1427,51 @@ CREATE INDEX m_assignment_ext_idx ON m_assignment USING gin (ext); -- TODO the same: CREATE INDEX iAssignmentEffective ON m_assignment (effectiveStatus); CREATE INDEX m_assignment_validFrom_idx ON m_assignment (validFrom); CREATE INDEX m_assignment_validTo_idx ON m_assignment (validTo); -CREATE INDEX m_assignment_targetRef_targetOid_idx ON m_assignment (targetRef_targetOid); -CREATE INDEX m_assignment_tenantRef_targetOid_idx ON m_assignment (tenantRef_targetOid); -CREATE INDEX m_assignment_orgRef_targetOid_idx ON m_assignment (orgRef_targetOid); -CREATE INDEX m_assignment_resourceRef_targetOid_idx ON m_assignment (resourceRef_targetOid); +CREATE INDEX m_assignment_targetRefTargetOid_idx ON m_assignment (targetRefTargetOid); +CREATE INDEX m_assignment_tenantRefTargetOid_idx ON m_assignment (tenantRefTargetOid); +CREATE INDEX m_assignment_orgRefTargetOid_idx ON m_assignment (orgRefTargetOid); +CREATE INDEX m_assignment_resourceRefTargetOid_idx ON m_assignment (resourceRefTargetOid); -- stores assignment/metadata/createApproverRef CREATE TABLE m_assignment_ref_create_approver ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, assignment_cid INTEGER NOT NULL, referenceType ReferenceType GENERATED ALWAYS AS ('ASSIGNMENT_CREATE_APPROVER') STORED, - PRIMARY KEY (owner_oid, assignment_cid, referenceType, relation_id, targetOid) + PRIMARY KEY (ownerOid, assignment_cid, referenceType, relationId, targetOid) ) INHERITS (m_reference); ALTER TABLE m_assignment_ref_create_approver ADD CONSTRAINT m_assignment_ref_create_approver_id_fk - FOREIGN KEY (owner_oid, assignment_cid) REFERENCES m_assignment (owner_oid, cid); + FOREIGN KEY (ownerOid, assignment_cid) REFERENCES m_assignment (ownerOid, cid); --- TODO index targetOid, relation_id? +-- TODO index targetOid, relationId? -- stores assignment/metadata/modifyApproverRef CREATE TABLE m_assignment_ref_modify_approver ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, assignment_cid INTEGER NOT NULL, referenceType ReferenceType GENERATED ALWAYS AS ('ASSIGNMENT_MODIFY_APPROVER') STORED, - PRIMARY KEY (owner_oid, assignment_cid, referenceType, relation_id, targetOid) + PRIMARY KEY (ownerOid, assignment_cid, referenceType, relationId, targetOid) ) INHERITS (m_reference); ALTER TABLE m_assignment_ref_modify_approver ADD CONSTRAINT m_assignment_ref_modify_approver_id_fk - FOREIGN KEY (owner_oid, assignment_cid) REFERENCES m_assignment (owner_oid, cid); + FOREIGN KEY (ownerOid, assignment_cid) REFERENCES m_assignment (ownerOid, cid); --- TODO index targetOid, relation_id? +-- TODO index targetOid, relationId? -- endregion -- region Other object containers -- stores ObjectType/trigger (TriggerType) CREATE TABLE m_trigger ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, containerType ContainerType GENERATED ALWAYS AS ('TRIGGER') STORED, - handlerUri_id INTEGER REFERENCES m_uri(id), + handlerUriId INTEGER REFERENCES m_uri(id), timestampValue TIMESTAMPTZ, - PRIMARY KEY (owner_oid, cid) + PRIMARY KEY (ownerOid, cid) ) INHERITS(m_container); @@ -1478,28 +1479,28 @@ CREATE INDEX m_trigger_timestampValue_idx ON m_trigger (timestampValue); -- stores ObjectType/operationExecution (OperationExecutionType) CREATE TABLE m_operation_execution ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE, containerType ContainerType GENERATED ALWAYS AS ('OPERATION_EXECUTION') STORED, status OperationResultStatusType, recordType OperationExecutionRecordTypeType, - initiatorRef_targetOid UUID, - initiatorRef_targetType ObjectType, - initiatorRef_relation_id INTEGER REFERENCES m_uri(id), - taskRef_targetOid UUID, - taskRef_targetType ObjectType, - taskRef_relation_id INTEGER REFERENCES m_uri(id), + initiatorRefTargetOid UUID, + initiatorRefTargetType ObjectType, + initiatorRefRelationId INTEGER REFERENCES m_uri(id), + taskRefTargetOid UUID, + taskRefTargetType ObjectType, + taskRefRelationId INTEGER REFERENCES m_uri(id), timestampValue TIMESTAMPTZ, - PRIMARY KEY (owner_oid, cid) + PRIMARY KEY (ownerOid, cid) ) INHERITS(m_container); -CREATE INDEX m_operation_execution_initiatorRef_targetOid_idx - ON m_operation_execution (initiatorRef_targetOid); -CREATE INDEX m_operation_execution_taskRef_targetOid_idx - ON m_operation_execution (taskRef_targetOid); +CREATE INDEX m_operation_execution_initiatorRefTargetOid_idx + ON m_operation_execution (initiatorRefTargetOid); +CREATE INDEX m_operation_execution_taskRefTargetOid_idx + ON m_operation_execution (taskRefTargetOid); CREATE INDEX m_operation_execution_timestampValue_idx ON m_operation_execution (timestampValue); --- TODO: index for owner_oid is part of PK +-- TODO: index for ownerOid is part of PK -- index for status is questionable, don't we want WHERE status = ... to another index instead? -- endregion @@ -1520,43 +1521,43 @@ CREATE TABLE m_ext_item ( /* -- EXPERIMENTAL EAV (first without catalog, so string keys are used) CREATE TABLE m_object_ext_boolean ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid), + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid), ext_item_id VARCHAR(32) NOT NULL, value BOOLEAN NOT NULL, - PRIMARY KEY (owner_oid, ext_item_id, value) + PRIMARY KEY (ownerOid, ext_item_id, value) ); CREATE TABLE m_object_ext_date ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid), + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid), ext_item_id VARCHAR(32) NOT NULL, value TIMESTAMPTZ NOT NULL, - PRIMARY KEY (owner_oid, ext_item_id, value) + PRIMARY KEY (ownerOid, ext_item_id, value) ); CREATE TABLE m_object_ext_long ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid), + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid), ext_item_id VARCHAR(32) NOT NULL, value INTEGER NOT NULL, - PRIMARY KEY (owner_oid, ext_item_id, value) + PRIMARY KEY (ownerOid, ext_item_id, value) ); CREATE TABLE m_object_ext_poly ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid), + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid), ext_item_id VARCHAR(32) NOT NULL, orig TEXT NOT NULL, norm TEXT, - PRIMARY KEY (owner_oid, ext_item_id, orig) + PRIMARY KEY (ownerOid, ext_item_id, orig) ); CREATE TABLE m_object_ext_reference ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid), + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid), ext_item_id VARCHAR(32) NOT NULL, target_oid UUID NOT NULL, - relation_id INTEGER, + relationId INTEGER, targetType INTEGER, - PRIMARY KEY (owner_oid, ext_item_id, target_oid) + PRIMARY KEY (ownerOid, ext_item_id, target_oid) ); CREATE TABLE m_object_ext_string ( - owner_oid UUID NOT NULL REFERENCES m_object_oid(oid), + ownerOid UUID NOT NULL REFERENCES m_object_oid(oid), ext_item_id VARCHAR(32) NOT NULL, value TEXT NOT NULL, - PRIMARY KEY (owner_oid, ext_item_id, value) + PRIMARY KEY (ownerOid, ext_item_id, value) ); @@ -1569,52 +1570,52 @@ CREATE TABLE m_object_ext_string ( CREATE TABLE m_assignment_ext_boolean ( item_id INTEGER NOT NULL, anyContainer_owner_id INTEGER NOT NULL, - anyContainer_owner_owner_oid UUID NOT NULL, + anyContainer_owner_ownerOid UUID NOT NULL, booleanValue BOOLEAN NOT NULL, - PRIMARY KEY (anyContainer_owner_owner_oid, anyContainer_owner_id, item_id, booleanValue) + PRIMARY KEY (anyContainer_owner_ownerOid, anyContainer_owner_id, item_id, booleanValue) ); CREATE TABLE m_assignment_ext_date ( item_id INTEGER NOT NULL, anyContainer_owner_id INTEGER NOT NULL, - anyContainer_owner_owner_oid UUID NOT NULL, + anyContainer_owner_ownerOid UUID NOT NULL, dateValue TIMESTAMPTZ NOT NULL, - PRIMARY KEY (anyContainer_owner_owner_oid, anyContainer_owner_id, item_id, dateValue) + PRIMARY KEY (anyContainer_owner_ownerOid, anyContainer_owner_id, item_id, dateValue) ); CREATE TABLE m_assignment_ext_long ( item_id INTEGER NOT NULL, anyContainer_owner_id INTEGER NOT NULL, - anyContainer_owner_owner_oid UUID NOT NULL, + anyContainer_owner_ownerOid UUID NOT NULL, longValue BIGINT NOT NULL, - PRIMARY KEY (anyContainer_owner_owner_oid, anyContainer_owner_id, item_id, longValue) + PRIMARY KEY (anyContainer_owner_ownerOid, anyContainer_owner_id, item_id, longValue) ); CREATE TABLE m_assignment_ext_poly ( item_id INTEGER NOT NULL, anyContainer_owner_id INTEGER NOT NULL, - anyContainer_owner_owner_oid UUID NOT NULL, + anyContainer_owner_ownerOid UUID NOT NULL, orig TEXT NOT NULL, norm TEXT, - PRIMARY KEY (anyContainer_owner_owner_oid, anyContainer_owner_id, item_id, orig) + PRIMARY KEY (anyContainer_owner_ownerOid, anyContainer_owner_id, item_id, orig) ); CREATE TABLE m_assignment_ext_reference ( item_id INTEGER NOT NULL, anyContainer_owner_id INTEGER NOT NULL, - anyContainer_owner_owner_oid UUID NOT NULL, + anyContainer_owner_ownerOid UUID NOT NULL, targetoid UUID NOT NULL, relation VARCHAR(157), targetType INTEGER, - PRIMARY KEY (anyContainer_owner_owner_oid, anyContainer_owner_id, item_id, targetoid) + PRIMARY KEY (anyContainer_owner_ownerOid, anyContainer_owner_id, item_id, targetoid) ); CREATE TABLE m_assignment_ext_string ( item_id INTEGER NOT NULL, anyContainer_owner_id INTEGER NOT NULL, - anyContainer_owner_owner_oid UUID NOT NULL, + anyContainer_owner_ownerOid UUID NOT NULL, stringValue TEXT NOT NULL, - PRIMARY KEY (anyContainer_owner_owner_oid, anyContainer_owner_id, item_id, stringValue) + PRIMARY KEY (anyContainer_owner_ownerOid, anyContainer_owner_id, item_id, stringValue) ); CREATE TABLE m_assignment_extension ( owner_id INTEGER NOT NULL, - owner_owner_oid UUID NOT NULL, - PRIMARY KEY (owner_owner_oid, owner_id) + owner_ownerOid UUID NOT NULL, + PRIMARY KEY (owner_ownerOid, owner_id) ); @@ -1626,10 +1627,10 @@ CREATE TABLE m_audit_delta ( deltaOid UUID, deltaType INTEGER, fullResult BYTEA, - objectName_norm TEXT, - objectName_orig TEXT, - resourceName_norm TEXT, - resourceName_orig TEXT, + objectNameNorm TEXT, + objectNameOrig TEXT, + resourceNameNorm TEXT, + resourceNameOrig TEXT, resourceOid UUID, status INTEGER, PRIMARY KEY (record_id, checksum) @@ -1682,8 +1683,8 @@ CREATE TABLE m_audit_ref_value ( name TEXT, oid UUID, record_id BIGINT, - targetName_norm TEXT, - targetName_orig TEXT, + targetNameNorm TEXT, + targetNameOrig TEXT, type TEXT, PRIMARY KEY (id) ); @@ -1701,48 +1702,48 @@ CREATE TABLE m_ext_item ( ); CREATE TABLE m_object_ext_boolean ( item_id INTEGER NOT NULL, - owner_oid UUID NOT NULL, + ownerOid UUID NOT NULL, ownerType INTEGER NOT NULL, booleanValue BOOLEAN NOT NULL, - PRIMARY KEY (owner_oid, ownerType, item_id, booleanValue) + PRIMARY KEY (ownerOid, ownerType, item_id, booleanValue) ); CREATE TABLE m_object_ext_date ( item_id INTEGER NOT NULL, - owner_oid UUID NOT NULL, + ownerOid UUID NOT NULL, ownerType INTEGER NOT NULL, dateValue TIMESTAMPTZ NOT NULL, - PRIMARY KEY (owner_oid, ownerType, item_id, dateValue) + PRIMARY KEY (ownerOid, ownerType, item_id, dateValue) ); CREATE TABLE m_object_ext_long ( item_id INTEGER NOT NULL, - owner_oid UUID NOT NULL, + ownerOid UUID NOT NULL, ownerType INTEGER NOT NULL, longValue BIGINT NOT NULL, - PRIMARY KEY (owner_oid, ownerType, item_id, longValue) + PRIMARY KEY (ownerOid, ownerType, item_id, longValue) ); CREATE TABLE m_object_ext_poly ( item_id INTEGER NOT NULL, - owner_oid UUID NOT NULL, + ownerOid UUID NOT NULL, ownerType INTEGER NOT NULL, orig TEXT NOT NULL, norm TEXT, - PRIMARY KEY (owner_oid, ownerType, item_id, orig) + PRIMARY KEY (ownerOid, ownerType, item_id, orig) ); CREATE TABLE m_object_ext_reference ( item_id INTEGER NOT NULL, - owner_oid UUID NOT NULL, + ownerOid UUID NOT NULL, ownerType INTEGER NOT NULL, targetoid UUID NOT NULL, relation VARCHAR(157), targetType INTEGER, - PRIMARY KEY (owner_oid, ownerType, item_id, targetoid) + PRIMARY KEY (ownerOid, ownerType, item_id, targetoid) ); CREATE TABLE m_object_ext_string ( item_id INTEGER NOT NULL, - owner_oid UUID NOT NULL, + ownerOid UUID NOT NULL, ownerType INTEGER NOT NULL, stringValue TEXT NOT NULL, - PRIMARY KEY (owner_oid, ownerType, item_id, stringValue) + PRIMARY KEY (ownerOid, ownerType, item_id, stringValue) ); CREATE INDEX iAExtensionBoolean @@ -1780,10 +1781,6 @@ CREATE INDEX iAuditResourceOidRecordId ALTER TABLE m_ext_item ADD CONSTRAINT iExtItemDefinition UNIQUE (itemName, itemType, kind); -CREATE INDEX iObjectNameOrig - ON m_object (name_orig); -CREATE INDEX iObjectNameNorm - ON m_object (name_norm); CREATE INDEX iObjectCreateTimestamp ON m_object (createTimestamp); CREATE INDEX iObjectLifecycleState @@ -1800,42 +1797,28 @@ CREATE INDEX iExtensionReference ON m_object_ext_reference (targetoid); CREATE INDEX iExtensionString ON m_object_ext_string (stringValue); -CREATE INDEX iArchetypeNameOrig ON m_archetype(name_orig); -CREATE INDEX iArchetypeNameNorm ON m_archetype(name_norm); CREATE INDEX iFocusAdministrative ON m_focus (administrativeStatus); CREATE INDEX iFocusEffective ON m_focus (effectiveStatus); CREATE INDEX iLocality - ON m_focus (locality_orig); + ON m_focus (localityOrig); CREATE INDEX iFocusValidFrom ON m_focus (validFrom); CREATE INDEX iFocusValidTo ON m_focus (validTo); -CREATE INDEX iFunctionLibraryNameOrig - ON m_function_library (name_orig); -ALTER TABLE m_function_library - ADD CONSTRAINT uc_function_library_name UNIQUE (name_norm); -CREATE INDEX iObjectTemplateNameOrig - ON m_object_template (name_orig); -ALTER TABLE m_object_template - ADD CONSTRAINT uc_object_template_name UNIQUE (name_norm); -CREATE INDEX iSystemConfigurationNameOrig - ON m_system_configuration (name_orig); -ALTER TABLE m_system_configuration - ADD CONSTRAINT uc_system_configuration_name UNIQUE (name_norm); ALTER TABLE m_assignment_ext_boolean - ADD CONSTRAINT fk_a_ext_boolean_owner FOREIGN KEY (anyContainer_owner_owner_oid, anyContainer_owner_id) REFERENCES m_assignment_extension; + ADD CONSTRAINT fk_a_ext_boolean_owner FOREIGN KEY (anyContainer_owner_ownerOid, anyContainer_owner_id) REFERENCES m_assignment_extension; ALTER TABLE m_assignment_ext_date - ADD CONSTRAINT fk_a_ext_date_owner FOREIGN KEY (anyContainer_owner_owner_oid, anyContainer_owner_id) REFERENCES m_assignment_extension; + ADD CONSTRAINT fk_a_ext_date_owner FOREIGN KEY (anyContainer_owner_ownerOid, anyContainer_owner_id) REFERENCES m_assignment_extension; ALTER TABLE m_assignment_ext_long - ADD CONSTRAINT fk_a_ext_long_owner FOREIGN KEY (anyContainer_owner_owner_oid, anyContainer_owner_id) REFERENCES m_assignment_extension; + ADD CONSTRAINT fk_a_ext_long_owner FOREIGN KEY (anyContainer_owner_ownerOid, anyContainer_owner_id) REFERENCES m_assignment_extension; ALTER TABLE m_assignment_ext_poly - ADD CONSTRAINT fk_a_ext_poly_owner FOREIGN KEY (anyContainer_owner_owner_oid, anyContainer_owner_id) REFERENCES m_assignment_extension; + ADD CONSTRAINT fk_a_ext_poly_owner FOREIGN KEY (anyContainer_owner_ownerOid, anyContainer_owner_id) REFERENCES m_assignment_extension; ALTER TABLE m_assignment_ext_reference - ADD CONSTRAINT fk_a_ext_reference_owner FOREIGN KEY (anyContainer_owner_owner_oid, anyContainer_owner_id) REFERENCES m_assignment_extension; + ADD CONSTRAINT fk_a_ext_reference_owner FOREIGN KEY (anyContainer_owner_ownerOid, anyContainer_owner_id) REFERENCES m_assignment_extension; ALTER TABLE m_assignment_ext_string - ADD CONSTRAINT fk_a_ext_string_owner FOREIGN KEY (anyContainer_owner_owner_oid, anyContainer_owner_id) REFERENCES m_assignment_extension; + ADD CONSTRAINT fk_a_ext_string_owner FOREIGN KEY (anyContainer_owner_ownerOid, anyContainer_owner_id) REFERENCES m_assignment_extension; -- These are created manually ALTER TABLE m_assignment_ext_boolean @@ -1862,19 +1845,19 @@ ALTER TABLE m_audit_ref_value ALTER TABLE m_audit_resource ADD CONSTRAINT fk_audit_resource FOREIGN KEY (record_id) REFERENCES m_audit_event; ALTER TABLE m_focus_photo - ADD CONSTRAINT fk_focus_photo FOREIGN KEY (owner_oid) REFERENCES m_focus; + ADD CONSTRAINT fk_focus_photo FOREIGN KEY (ownerOid) REFERENCES m_focus; ALTER TABLE m_object_ext_boolean - ADD CONSTRAINT fk_o_ext_boolean_owner FOREIGN KEY (owner_oid) REFERENCES m_object; + ADD CONSTRAINT fk_o_ext_boolean_owner FOREIGN KEY (ownerOid) REFERENCES m_object; ALTER TABLE m_object_ext_date - ADD CONSTRAINT fk_o_ext_date_owner FOREIGN KEY (owner_oid) REFERENCES m_object; + ADD CONSTRAINT fk_o_ext_date_owner FOREIGN KEY (ownerOid) REFERENCES m_object; ALTER TABLE m_object_ext_long - ADD CONSTRAINT fk_object_ext_long FOREIGN KEY (owner_oid) REFERENCES m_object; + ADD CONSTRAINT fk_object_ext_long FOREIGN KEY (ownerOid) REFERENCES m_object; ALTER TABLE m_object_ext_poly - ADD CONSTRAINT fk_o_ext_poly_owner FOREIGN KEY (owner_oid) REFERENCES m_object; + ADD CONSTRAINT fk_o_ext_poly_owner FOREIGN KEY (ownerOid) REFERENCES m_object; ALTER TABLE m_object_ext_reference - ADD CONSTRAINT fk_o_ext_reference_owner FOREIGN KEY (owner_oid) REFERENCES m_object; + ADD CONSTRAINT fk_o_ext_reference_owner FOREIGN KEY (ownerOid) REFERENCES m_object; ALTER TABLE m_object_ext_string - ADD CONSTRAINT fk_object_ext_string FOREIGN KEY (owner_oid) REFERENCES m_object; + ADD CONSTRAINT fk_object_ext_string FOREIGN KEY (ownerOid) REFERENCES m_object; -- These are created manually ALTER TABLE m_object_ext_boolean @@ -1891,7 +1874,7 @@ ALTER TABLE m_object_ext_string ADD CONSTRAINT fk_o_ext_string_item FOREIGN KEY (item_id) REFERENCES m_ext_item; ALTER TABLE m_object_text_info - ADD CONSTRAINT fk_object_text_info_owner FOREIGN KEY (owner_oid) REFERENCES m_object; + ADD CONSTRAINT fk_object_text_info_owner FOREIGN KEY (ownerOid) REFERENCES m_object; ALTER TABLE m_user_organization ADD CONSTRAINT fk_user_organization FOREIGN KEY (user_oid) REFERENCES m_user; ALTER TABLE m_user_organizational_unit diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/UriCache.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/UriCache.java index 26dde7ce749..d03c55b94e6 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/UriCache.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/UriCache.java @@ -54,7 +54,7 @@ public class UriCache { * Unknown id placeholder, not actually in DB but returned when URI is not in the cache * and returning `null` or throwing exception would not make sense. * Typical case is using it for query predicate when searching for unknown URI should result - * in a condition comparing URI ID attribute (e.g. relation_id) to id that will not be found. + * in a condition comparing URI ID attribute (e.g. relationId) to id that will not be found. * This is completely transient and can be changed if the need arises. */ public static final int UNKNOWN_ID = -1; diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/accesscert/QAccessCertificationDefinition.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/accesscert/QAccessCertificationDefinition.java index 49a065ab6bf..f5205f73b67 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/accesscert/QAccessCertificationDefinition.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/accesscert/QAccessCertificationDefinition.java @@ -29,7 +29,7 @@ public class QAccessCertificationDefinition extends QObject handlerUriId = createInteger("handlerUriId", HANDLER_URI_ID); public final DateTimePath lastCampaignStartedTimestamp = diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/assignment/QAssignment.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/assignment/QAssignment.java index d445d77bd92..6261d9ade99 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/assignment/QAssignment.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/assignment/QAssignment.java @@ -40,29 +40,29 @@ public class QAssignment extends QContainer public static final String TABLE_NAME = "m_assignment"; public static final ColumnMetadata OWNER_TYPE = - ColumnMetadata.named("owner_type").ofType(Types.OTHER); + ColumnMetadata.named("ownerType").ofType(Types.OTHER); public static final ColumnMetadata LIFECYCLE_STATE = ColumnMetadata.named("lifecycleState").ofType(Types.VARCHAR); public static final ColumnMetadata ORDER_VALUE = ColumnMetadata.named("orderValue").ofType(Types.INTEGER); public static final ColumnMetadata ORG_REF_TARGET_OID = - ColumnMetadata.named("orgRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("orgRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata ORG_REF_TARGET_TYPE = - ColumnMetadata.named("orgRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("orgRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata ORG_REF_RELATION_ID = - ColumnMetadata.named("orgRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("orgRefRelationId").ofType(Types.INTEGER); public static final ColumnMetadata TARGET_REF_TARGET_OID = - ColumnMetadata.named("targetRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("targetRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata TARGET_REF_TARGET_TYPE = - ColumnMetadata.named("targetRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("targetRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata TARGET_REF_RELATION_ID = - ColumnMetadata.named("targetRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("targetRefRelationId").ofType(Types.INTEGER); public static final ColumnMetadata TENANT_REF_TARGET_OID = - ColumnMetadata.named("tenantRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("tenantRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata TENANT_REF_TARGET_TYPE = - ColumnMetadata.named("tenantRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("tenantRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata TENANT_REF_RELATION_ID = - ColumnMetadata.named("tenantRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("tenantRefRelationId").ofType(Types.INTEGER); public static final ColumnMetadata EXT_ID = ColumnMetadata.named("extId").ofType(Types.INTEGER); // TODO UUID or not? our control or outside? @@ -73,11 +73,11 @@ public class QAssignment extends QContainer public static final ColumnMetadata EXT = ColumnMetadata.named("ext").ofType(JSONB_TYPE); // construction columns public static final ColumnMetadata RESOURCE_REF_TARGET_OID = - ColumnMetadata.named("resourceRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("resourceRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata RESOURCE_REF_TARGET_TYPE = - ColumnMetadata.named("resourceRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("resourceRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata RESOURCE_REF_RELATION_ID = - ColumnMetadata.named("resourceRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("resourceRefRelationId").ofType(Types.INTEGER); // activation columns public static final ColumnMetadata ADMINISTRATIVE_STATUS = ColumnMetadata.named("administrativeStatus").ofType(Types.OTHER); @@ -101,23 +101,23 @@ public class QAssignment extends QContainer ColumnMetadata.named("archiveTimestamp").ofType(Types.TIMESTAMP_WITH_TIMEZONE); // metadata columns public static final ColumnMetadata CREATOR_REF_TARGET_OID = - ColumnMetadata.named("creatorRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("creatorRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata CREATOR_REF_TARGET_TYPE = - ColumnMetadata.named("creatorRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("creatorRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata CREATOR_REF_RELATION_ID = - ColumnMetadata.named("creatorRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("creatorRefRelationId").ofType(Types.INTEGER); public static final ColumnMetadata CREATE_CHANNEL_ID = - ColumnMetadata.named("createChannel_id").ofType(Types.INTEGER); + ColumnMetadata.named("createChannelId").ofType(Types.INTEGER); public static final ColumnMetadata CREATE_TIMESTAMP = ColumnMetadata.named("createTimestamp").ofType(Types.TIMESTAMP_WITH_TIMEZONE); public static final ColumnMetadata MODIFIER_REF_TARGET_OID = - ColumnMetadata.named("modifierRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("modifierRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata MODIFIER_REF_TARGET_TYPE = - ColumnMetadata.named("modifierRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("modifierRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata MODIFIER_REF_RELATION_ID = - ColumnMetadata.named("modifierRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("modifierRefRelationId").ofType(Types.INTEGER); public static final ColumnMetadata MODIFY_CHANNEL_ID = - ColumnMetadata.named("modifyChannel_id").ofType(Types.INTEGER); + ColumnMetadata.named("modifyChannelId").ofType(Types.INTEGER); public static final ColumnMetadata MODIFY_TIMESTAMP = ColumnMetadata.named("modifyTimestamp").ofType(Types.TIMESTAMP_WITH_TIMEZONE); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCase.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCase.java index 560d9932271..eeacb2eec81 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCase.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCase.java @@ -34,29 +34,29 @@ public class QCase extends QObject { public static final ColumnMetadata CLOSE_TIMESTAMP = ColumnMetadata.named("closeTimestamp").ofType(Types.TIMESTAMP_WITH_TIMEZONE); public static final ColumnMetadata OBJECT_REF_TARGET_OID = - ColumnMetadata.named("objectRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("objectRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata OBJECT_REF_TARGET_TYPE = - ColumnMetadata.named("objectRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("objectRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata OBJECT_REF_RELATION_ID = - ColumnMetadata.named("objectRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("objectRefRelationId").ofType(Types.INTEGER); public static final ColumnMetadata PARENT_REF_TARGET_OID = - ColumnMetadata.named("parentRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("parentRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata PARENT_REF_TARGET_TYPE = - ColumnMetadata.named("parentRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("parentRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata PARENT_REF_RELATION_ID = - ColumnMetadata.named("parentRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("parentRefRelationId").ofType(Types.INTEGER); public static final ColumnMetadata REQUESTOR_REF_TARGET_OID = - ColumnMetadata.named("requestorRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("requestorRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata REQUESTOR_REF_TARGET_TYPE = - ColumnMetadata.named("requestorRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("requestorRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata REQUESTOR_REF_RELATION_ID = - ColumnMetadata.named("requestorRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("requestorRefRelationId").ofType(Types.INTEGER); public static final ColumnMetadata TARGET_REF_TARGET_OID = - ColumnMetadata.named("targetRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("targetRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata TARGET_REF_TARGET_TYPE = - ColumnMetadata.named("targetRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("targetRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata TARGET_REF_RELATION_ID = - ColumnMetadata.named("targetRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("targetRefRelationId").ofType(Types.INTEGER); // attributes diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/common/QContainer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/common/QContainer.java index 99b13891be1..a9a6374f79f 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/common/QContainer.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/common/QContainer.java @@ -36,7 +36,7 @@ public class QContainer extends FlexibleRelationalPath public static final String TABLE_NAME = "m_container"; public static final ColumnMetadata OWNER_OID = - ColumnMetadata.named("owner_oid").ofType(UuidPath.UUID_TYPE).notNull(); + ColumnMetadata.named("ownerOid").ofType(UuidPath.UUID_TYPE).notNull(); public static final ColumnMetadata CID = ColumnMetadata.named("cid").ofType(Types.BIGINT).notNull(); public static final ColumnMetadata CONTAINER_TYPE = diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/QConnector.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/QConnector.java index 1f44aa3330d..ebeaa3fcca0 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/QConnector.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/QConnector.java @@ -35,13 +35,13 @@ public class QConnector extends QObject { public static final ColumnMetadata CONNECTOR_VERSION = ColumnMetadata.named("connectorVersion").ofType(Types.VARCHAR); public static final ColumnMetadata FRAMEWORK_ID = - ColumnMetadata.named("framework_id").ofType(Types.INTEGER); + ColumnMetadata.named("frameworkId").ofType(Types.INTEGER); public static final ColumnMetadata CONNECTOR_HOST_REF_TARGET_OID = - ColumnMetadata.named("connectorHostRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("connectorHostRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata CONNECTOR_HOST_REF_TARGET_TYPE = - ColumnMetadata.named("connectorHostRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("connectorHostRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata CONNECTOR_HOST_REF_RELATION_ID = - ColumnMetadata.named("connectorHostRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("connectorHostRefRelationId").ofType(Types.INTEGER); public static final ColumnMetadata TARGET_SYSTEM_TYPES = ColumnMetadata.named("targetSystemTypes").ofType(Types.ARRAY); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QFocus.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QFocus.java index 627ed4e21a4..94e6fceaa20 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QFocus.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QFocus.java @@ -46,9 +46,9 @@ public class QFocus extends QObject { public static final ColumnMetadata LOCALE = ColumnMetadata.named("locale").ofType(Types.VARCHAR); public static final ColumnMetadata LOCALITY_ORIG = - ColumnMetadata.named("locality_orig").ofType(Types.VARCHAR); + ColumnMetadata.named("localityOrig").ofType(Types.VARCHAR); public static final ColumnMetadata LOCALITY_NORM = - ColumnMetadata.named("locality_norm").ofType(Types.VARCHAR); + ColumnMetadata.named("localityNorm").ofType(Types.VARCHAR); public static final ColumnMetadata PREFERRED_LANGUAGE = ColumnMetadata.named("preferredLanguage").ofType(Types.VARCHAR); public static final ColumnMetadata TELEPHONE_NUMBER = diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QGenericObject.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QGenericObject.java index 6c8b567e3d4..4951bcf66fc 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QGenericObject.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QGenericObject.java @@ -22,7 +22,7 @@ public class QGenericObject extends QFocus { public static final String TABLE_NAME = "m_generic_object"; public static final ColumnMetadata GENERIC_OBJECT_TYPE_ID = - ColumnMetadata.named("genericObjectType_id").ofType(Types.INTEGER); + ColumnMetadata.named("genericObjectTypeId").ofType(Types.INTEGER); public final NumberPath genericObjectTypeId = createInteger("genericObjectTypeId", GENERIC_OBJECT_TYPE_ID); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QUser.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QUser.java index ddb13c9f1db..2128595598b 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QUser.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QUser.java @@ -22,39 +22,39 @@ public class QUser extends QFocus { public static final String TABLE_NAME = "m_user"; public static final ColumnMetadata ADDITIONAL_NAME_ORIG = - ColumnMetadata.named("additionalName_orig").ofType(Types.VARCHAR); + ColumnMetadata.named("additionalNameOrig").ofType(Types.VARCHAR); public static final ColumnMetadata ADDITIONAL_NAME_NORM = - ColumnMetadata.named("additionalName_norm").ofType(Types.VARCHAR); + ColumnMetadata.named("additionalNameNorm").ofType(Types.VARCHAR); public static final ColumnMetadata EMPLOYEE_NUMBER = ColumnMetadata.named("employeeNumber").ofType(Types.VARCHAR); public static final ColumnMetadata FAMILY_NAME_ORIG = - ColumnMetadata.named("familyName_orig").ofType(Types.VARCHAR); + ColumnMetadata.named("familyNameOrig").ofType(Types.VARCHAR); public static final ColumnMetadata FAMILY_NAME_NORM = - ColumnMetadata.named("familyName_norm").ofType(Types.VARCHAR); + ColumnMetadata.named("familyNameNorm").ofType(Types.VARCHAR); public static final ColumnMetadata FULL_NAME_ORIG = - ColumnMetadata.named("fullName_orig").ofType(Types.VARCHAR); + ColumnMetadata.named("fullNameOrig").ofType(Types.VARCHAR); public static final ColumnMetadata FULL_NAME_NORM = - ColumnMetadata.named("fullName_norm").ofType(Types.VARCHAR); + ColumnMetadata.named("fullNameNorm").ofType(Types.VARCHAR); public static final ColumnMetadata GIVEN_NAME_ORIG = - ColumnMetadata.named("givenName_orig").ofType(Types.VARCHAR); + ColumnMetadata.named("givenNameOrig").ofType(Types.VARCHAR); public static final ColumnMetadata GIVEN_NAME_NORM = - ColumnMetadata.named("givenName_norm").ofType(Types.VARCHAR); + ColumnMetadata.named("givenNameNorm").ofType(Types.VARCHAR); public static final ColumnMetadata HONORIFIC_PREFIX_ORIG = - ColumnMetadata.named("honorificPrefix_orig").ofType(Types.VARCHAR); + ColumnMetadata.named("honorificPrefixOrig").ofType(Types.VARCHAR); public static final ColumnMetadata HONORIFIC_PREFIX_NORM = - ColumnMetadata.named("honorificPrefix_norm").ofType(Types.VARCHAR); + ColumnMetadata.named("honorificPrefixNorm").ofType(Types.VARCHAR); public static final ColumnMetadata HONORIFIC_SUFFIX_ORIG = - ColumnMetadata.named("honorificSuffix_orig").ofType(Types.VARCHAR); + ColumnMetadata.named("honorificSuffixOrig").ofType(Types.VARCHAR); public static final ColumnMetadata HONORIFIC_SUFFIX_NORM = - ColumnMetadata.named("honorificSuffix_norm").ofType(Types.VARCHAR); + ColumnMetadata.named("honorificSuffixNorm").ofType(Types.VARCHAR); public static final ColumnMetadata NICK_NAME_ORIG = - ColumnMetadata.named("nickName_orig").ofType(Types.VARCHAR); + ColumnMetadata.named("nickNameOrig").ofType(Types.VARCHAR); public static final ColumnMetadata NICK_NAME_NORM = - ColumnMetadata.named("nickName_norm").ofType(Types.VARCHAR); + ColumnMetadata.named("nickNameNorm").ofType(Types.VARCHAR); public static final ColumnMetadata TITLE_ORIG = - ColumnMetadata.named("title_orig").ofType(Types.VARCHAR); + ColumnMetadata.named("titleOrig").ofType(Types.VARCHAR); public static final ColumnMetadata TITLE_NORM = - ColumnMetadata.named("title_norm").ofType(Types.VARCHAR); + ColumnMetadata.named("titleNorm").ofType(Types.VARCHAR); public final StringPath additionalNameOrig = createString("additionalNameOrig", ADDITIONAL_NAME_ORIG); public final StringPath additionalNameNorm = createString("additionalNameNorm", ADDITIONAL_NAME_NORM); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/QLookupTableRow.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/QLookupTableRow.java index b2105a47883..eba15fb9e9b 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/QLookupTableRow.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/QLookupTableRow.java @@ -32,9 +32,9 @@ public class QLookupTableRow extends QContainer { public static final ColumnMetadata VALUE = ColumnMetadata.named("value").ofType(Types.VARCHAR); public static final ColumnMetadata LABEL_NORM = - ColumnMetadata.named("label_norm").ofType(Types.VARCHAR); + ColumnMetadata.named("labelNorm").ofType(Types.VARCHAR); public static final ColumnMetadata LABEL_ORIG = - ColumnMetadata.named("label_orig").ofType(Types.VARCHAR); + ColumnMetadata.named("labelOrig").ofType(Types.VARCHAR); public static final ColumnMetadata LAST_CHANGE_TIMESTAMP = ColumnMetadata.named("lastChangeTimestamp").ofType(Types.TIMESTAMP_WITH_TIMEZONE); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObject.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObject.java index 22ef69a71fe..f9c3b0ef8e1 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObject.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObject.java @@ -40,21 +40,21 @@ public class QObject extends FlexibleRelationalPathBase { public static final ColumnMetadata OBJECT_TYPE = ColumnMetadata.named("objectType").ofType(Types.OTHER).notNull(); public static final ColumnMetadata NAME_ORIG = - ColumnMetadata.named("name_orig").ofType(Types.VARCHAR).notNull(); + ColumnMetadata.named("nameOrig").ofType(Types.VARCHAR).notNull(); public static final ColumnMetadata NAME_NORM = - ColumnMetadata.named("name_norm").ofType(Types.VARCHAR).notNull(); + ColumnMetadata.named("nameNorm").ofType(Types.VARCHAR).notNull(); public static final ColumnMetadata FULL_OBJECT = ColumnMetadata.named("fullObject").ofType(Types.BINARY); public static final ColumnMetadata TENANT_REF_TARGET_OID = - ColumnMetadata.named("tenantRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("tenantRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata TENANT_REF_TARGET_TYPE = - ColumnMetadata.named("tenantRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("tenantRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata TENANT_REF_RELATION_ID = - ColumnMetadata.named("tenantRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("tenantRefRelationId").ofType(Types.INTEGER); public static final ColumnMetadata LIFECYCLE_STATE = ColumnMetadata.named("lifecycleState").ofType(Types.VARCHAR); public static final ColumnMetadata CID_SEQ = - ColumnMetadata.named("cid_seq").ofType(Types.BIGINT).notNull(); + ColumnMetadata.named("cidSeq").ofType(Types.BIGINT).notNull(); public static final ColumnMetadata VERSION = ColumnMetadata.named("version").ofType(Types.INTEGER).notNull(); // complex DB fields @@ -65,23 +65,23 @@ public class QObject extends FlexibleRelationalPathBase { public static final ColumnMetadata EXT = ColumnMetadata.named("ext").ofType(JSONB_TYPE); // metadata columns public static final ColumnMetadata CREATOR_REF_TARGET_OID = - ColumnMetadata.named("creatorRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("creatorRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata CREATOR_REF_TARGET_TYPE = - ColumnMetadata.named("creatorRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("creatorRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata CREATOR_REF_RELATION_ID = - ColumnMetadata.named("creatorRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("creatorRefRelationId").ofType(Types.INTEGER); public static final ColumnMetadata CREATE_CHANNEL_ID = - ColumnMetadata.named("createChannel_id").ofType(Types.INTEGER); + ColumnMetadata.named("createChannelId").ofType(Types.INTEGER); public static final ColumnMetadata CREATE_TIMESTAMP = ColumnMetadata.named("createTimestamp").ofType(Types.TIMESTAMP_WITH_TIMEZONE); public static final ColumnMetadata MODIFIER_REF_TARGET_OID = - ColumnMetadata.named("modifierRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("modifierRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata MODIFIER_REF_TARGET_TYPE = - ColumnMetadata.named("modifierRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("modifierRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata MODIFIER_REF_RELATION_ID = - ColumnMetadata.named("modifierRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("modifierRefRelationId").ofType(Types.INTEGER); public static final ColumnMetadata MODIFY_CHANNEL_ID = - ColumnMetadata.named("modifyChannel_id").ofType(Types.INTEGER); + ColumnMetadata.named("modifyChannelId").ofType(Types.INTEGER); public static final ColumnMetadata MODIFY_TIMESTAMP = ColumnMetadata.named("modifyTimestamp").ofType(Types.TIMESTAMP_WITH_TIMEZONE); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObjectMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObjectMapping.java index d9455d39e05..8fab14efb76 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObjectMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObjectMapping.java @@ -72,7 +72,7 @@ protected QObjectMapping( q -> q.tenantRefTargetType, q -> q.tenantRefRelationId)); addItemMapping(F_LIFECYCLE_STATE, stringMapper(q -> q.lifecycleState)); - // version/cid_seq is not mapped for queries or deltas, it's managed by repo explicitly + // version/cidSeq is not mapped for queries or deltas, it's managed by repo explicitly // TODO mapper for policySituations and subtypes // TODO ext mapping can't be done statically diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QOperationExecution.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QOperationExecution.java index 8aac6c32248..14e3087d56e 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QOperationExecution.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QOperationExecution.java @@ -43,17 +43,17 @@ public class QOperationExecution extends QContainer extends QContainer { public static final String TABLE_NAME = "m_trigger"; public static final ColumnMetadata HANDLER_URI_ID = - ColumnMetadata.named("handlerUri_id").ofType(Types.INTEGER); + ColumnMetadata.named("handlerUriId").ofType(Types.INTEGER); public static final ColumnMetadata TIMESTAMP_VALUE = ColumnMetadata.named("timestampValue").ofType(Types.TIMESTAMP_WITH_TIMEZONE); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ref/QReference.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ref/QReference.java index f46fb4108a4..e9cd3877b36 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ref/QReference.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ref/QReference.java @@ -38,9 +38,9 @@ public class QReference extends FlexibleRelationalPath public static final String TABLE_NAME = "m_reference"; public static final ColumnMetadata OWNER_OID = - ColumnMetadata.named("owner_oid").ofType(UuidPath.UUID_TYPE).notNull(); + ColumnMetadata.named("ownerOid").ofType(UuidPath.UUID_TYPE).notNull(); public static final ColumnMetadata OWNER_TYPE = - ColumnMetadata.named("owner_type").ofType(Types.OTHER); + ColumnMetadata.named("ownerType").ofType(Types.OTHER); public static final ColumnMetadata REFERENCE_TYPE = ColumnMetadata.named("referenceType").ofType(Types.OTHER).notNull(); public static final ColumnMetadata TARGET_OID = @@ -48,7 +48,7 @@ public class QReference extends FlexibleRelationalPath public static final ColumnMetadata TARGET_TYPE = ColumnMetadata.named("targetType").ofType(Types.OTHER).notNull(); public static final ColumnMetadata RELATION_ID = - ColumnMetadata.named("relation_id").ofType(Types.INTEGER).notNull(); + ColumnMetadata.named("relationId").ofType(Types.INTEGER).notNull(); public final UuidPath ownerOid = createUuid("ownerOid", OWNER_OID); public final EnumPath ownerType = diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportData.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportData.java index dd708410b9d..a423be8f691 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportData.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportData.java @@ -27,11 +27,11 @@ public class QReportData extends QObject { public static final String TABLE_NAME = "m_report_data"; public static final ColumnMetadata REPORT_REF_TARGET_OID = - ColumnMetadata.named("reportRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("reportRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata REPORT_REF_TARGET_TYPE = - ColumnMetadata.named("reportRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("reportRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata REPORT_REF_RELATION_ID = - ColumnMetadata.named("reportRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("reportRefRelationId").ofType(Types.INTEGER); public final UuidPath reportRefTargetOid = createUuid("reportRefTargetOid", REPORT_REF_TARGET_OID); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/resource/QResource.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/resource/QResource.java index efa4de2e987..c423c93aae5 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/resource/QResource.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/resource/QResource.java @@ -33,11 +33,11 @@ public class QResource extends QObject { public static final ColumnMetadata OPERATIONAL_STATE_LAST_AVAILABILITY_STATUS = ColumnMetadata.named("operationalState_lastAvailabilityStatus").ofType(Types.OTHER); public static final ColumnMetadata CONNECTOR_REF_TARGET_OID = - ColumnMetadata.named("connectorRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("connectorRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata CONNECTOR_REF_TARGET_TYPE = - ColumnMetadata.named("connectorRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("connectorRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata CONNECTOR_REF_RELATION_ID = - ColumnMetadata.named("connectorRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("connectorRefRelationId").ofType(Types.INTEGER); public final EnumPath businessAdministrativeState = createEnum("businessAdministrativeState", ResourceAdministrativeStateType.class, diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QAbstractRole.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QAbstractRole.java index 75802fc9ce3..54255bcf1d9 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QAbstractRole.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QAbstractRole.java @@ -34,9 +34,9 @@ public class QAbstractRole extends QFocus { public static final ColumnMetadata AUTO_ASSIGN_ENABLED = ColumnMetadata.named("autoAssignEnabled").ofType(Types.BOOLEAN); public static final ColumnMetadata DISPLAY_NAME_ORIG = - ColumnMetadata.named("displayName_orig").ofType(Types.VARCHAR); + ColumnMetadata.named("displayNameOrig").ofType(Types.VARCHAR); public static final ColumnMetadata DISPLAY_NAME_NORM = - ColumnMetadata.named("displayName_norm").ofType(Types.VARCHAR); + ColumnMetadata.named("displayNameNorm").ofType(Types.VARCHAR); public static final ColumnMetadata IDENTIFIER = ColumnMetadata.named("identifier").ofType(Types.VARCHAR); public static final ColumnMetadata REQUESTABLE = diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/shadow/QShadow.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/shadow/QShadow.java index 9c8a3dba846..4531c09ed7b 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/shadow/QShadow.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/shadow/QShadow.java @@ -30,13 +30,13 @@ public class QShadow extends QObject { // TODO public static final ColumnMetadata OBJECT_CLASS_ID = - ColumnMetadata.named("objectClass_id").ofType(Types.INTEGER); + ColumnMetadata.named("objectClassId").ofType(Types.INTEGER); public static final ColumnMetadata RESOURCE_REF_TARGET_OID = - ColumnMetadata.named("resourceRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("resourceRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata RESOURCE_REF_TARGET_TYPE = - ColumnMetadata.named("resourceRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("resourceRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata RESOURCE_REF_RELATION_ID = - ColumnMetadata.named("resourceRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("resourceRefRelationId").ofType(Types.INTEGER); public static final ColumnMetadata INTENT = ColumnMetadata.named("intent").ofType(Types.VARCHAR); public static final ColumnMetadata KIND = diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/task/QTask.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/task/QTask.java index 8f6acdca44a..ad9ae14b128 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/task/QTask.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/task/QTask.java @@ -40,7 +40,7 @@ public class QTask extends QObject { public static final ColumnMetadata FULL_RESULT = ColumnMetadata.named("fullResult").ofType(Types.BINARY); public static final ColumnMetadata HANDLER_URI_ID = - ColumnMetadata.named("handlerUri_id").ofType(Types.INTEGER); + ColumnMetadata.named("handlerUriId").ofType(Types.INTEGER); public static final ColumnMetadata LAST_RUN_START_TIMESTAMP = ColumnMetadata.named("lastRunStartTimestamp").ofType(Types.TIMESTAMP_WITH_TIMEZONE); public static final ColumnMetadata LAST_RUN_FINISH_TIMESTAMP = @@ -48,17 +48,17 @@ public class QTask extends QObject { public static final ColumnMetadata NODE = ColumnMetadata.named("node").ofType(Types.VARCHAR); public static final ColumnMetadata OBJECT_REF_TARGET_OID = - ColumnMetadata.named("objectRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("objectRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata OBJECT_REF_TARGET_TYPE = - ColumnMetadata.named("objectRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("objectRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata OBJECT_REF_RELATION_ID = - ColumnMetadata.named("objectRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("objectRefRelationId").ofType(Types.INTEGER); public static final ColumnMetadata OWNER_REF_TARGET_OID = - ColumnMetadata.named("ownerRef_targetOid").ofType(UuidPath.UUID_TYPE); + ColumnMetadata.named("ownerRefTargetOid").ofType(UuidPath.UUID_TYPE); public static final ColumnMetadata OWNER_REF_TARGET_TYPE = - ColumnMetadata.named("ownerRef_targetType").ofType(Types.OTHER); + ColumnMetadata.named("ownerRefTargetType").ofType(Types.OTHER); public static final ColumnMetadata OWNER_REF_RELATION_ID = - ColumnMetadata.named("ownerRef_relation_id").ofType(Types.INTEGER); + ColumnMetadata.named("ownerRefRelationId").ofType(Types.INTEGER); public static final ColumnMetadata PARENT = ColumnMetadata.named("parent").ofType(Types.VARCHAR); public static final ColumnMetadata RECURRENCE = From e0d49d0162c054f2a917683c04d06f579e142b34 Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Tue, 18 May 2021 16:57:58 +0200 Subject: [PATCH 5/8] torso of case work item (for merge) --- repo/repo-sqale/sql/pgnew-repo.sql | 26 ++--- .../repo/sqale/qmodel/cases/QCaseMapping.java | 12 +- .../qmodel/cases/workitem/MCaseWorkItem.java | 31 +++++ .../qmodel/cases/workitem/QCaseWorkItem.java | 103 +++++++++++++++++ .../cases/workitem/QCaseWorkItemMapping.java | 108 ++++++++++++++++++ 5 files changed, 259 insertions(+), 21 deletions(-) create mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/workitem/MCaseWorkItem.java create mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/workitem/QCaseWorkItem.java create mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/workitem/QCaseWorkItemMapping.java diff --git a/repo/repo-sqale/sql/pgnew-repo.sql b/repo/repo-sqale/sql/pgnew-repo.sql index b791ba8084d..9498ce1bd49 100644 --- a/repo/repo-sqale/sql/pgnew-repo.sql +++ b/repo/repo-sqale/sql/pgnew-repo.sql @@ -1093,19 +1093,19 @@ CREATE INDEX iCaseTypeRequestorRefTargetOid ON m_case(requestorRef_targetOid); CREATE INDEX iCaseTypeCloseTimestamp ON m_case(closeTimestamp); CREATE TABLE m_case_wi ( - id INTEGER NOT NULL, - owner_oid UUID NOT NULL, - closeTimestamp TIMESTAMPTZ, - createTimestamp TIMESTAMPTZ, - deadline TIMESTAMPTZ, - originalAssigneeRef_relation VARCHAR(157), - originalAssigneeRef_targetOid UUID, - originalAssigneeRef_targetType INTEGER, - outcome TEXT, - performerRef_relation VARCHAR(157), - performerRef_targetOid UUID, - performerRef_targetType INTEGER, - stageNumber INTEGER, + id INTEGER NOT NULL, + owner_oid UUID NOT NULL, + closeTimestamp TIMESTAMPTZ, + createTimestamp TIMESTAMPTZ, + deadline TIMESTAMPTZ, + originalAssigneeRefTargetOid UUID, + originalAssigneeRefTargetType ObjectType, + originalAssigneeRefRelationId INTEGER REFERENCES m_uri(id), + outcome TEXT, + performerRefTargetOid UUID, + performerRefTargetType ObjectType, + performerRefRelationId INTEGER REFERENCES m_uri(id), + stageNumber INTEGER, PRIMARY KEY (owner_oid, id) ); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCaseMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCaseMapping.java index dbf13db3fbd..df780cc9273 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCaseMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCaseMapping.java @@ -6,19 +6,15 @@ */ package com.evolveum.midpoint.repo.sqale.qmodel.cases; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType.*; - -import com.evolveum.midpoint.repo.sqale.qmodel.task.MTask; - +import com.evolveum.midpoint.repo.sqale.SqaleRepoContext; +import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; - import com.evolveum.midpoint.util.MiscUtil; +import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType; import org.jetbrains.annotations.NotNull; -import com.evolveum.midpoint.repo.sqale.SqaleRepoContext; -import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; -import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType.*; /** * Mapping between {@link QCase} and {@link CaseType}. diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/workitem/MCaseWorkItem.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/workitem/MCaseWorkItem.java new file mode 100644 index 00000000000..fbf629657a7 --- /dev/null +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/workitem/MCaseWorkItem.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2010-2021 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.repo.sqale.qmodel.cases.workitem; + +import com.evolveum.midpoint.repo.sqale.qmodel.common.MContainer; +import com.evolveum.midpoint.repo.sqale.qmodel.object.MObjectType; + +import java.time.Instant; +import java.util.UUID; + +/** + * Querydsl "row bean" type related to {@link QCaseWorkItem}. + */ +public class MCaseWorkItem extends MContainer { + + public Instant closeTimestamp; + public Instant createTimestamp; + public Instant deadline; + public UUID originalAssigneeRefTargetOid; + public MObjectType originalAssigneeRefTargetType; + public Integer originalAssigneeRefRelationId; + public String outcome; + public UUID performerRefTargetOid; + public MObjectType performerRefTargetType; + public Integer performerRefRelationId; + public Integer stageNumber; +} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/workitem/QCaseWorkItem.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/workitem/QCaseWorkItem.java new file mode 100644 index 00000000000..ec24d0b0035 --- /dev/null +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/workitem/QCaseWorkItem.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2010-2021 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.repo.sqale.qmodel.cases.workitem; + +import com.evolveum.midpoint.repo.sqale.qmodel.assignment.MAssignment; +import com.evolveum.midpoint.repo.sqale.qmodel.cases.MCase; +import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainer; +import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; +import com.evolveum.midpoint.repo.sqale.qmodel.object.MObjectType; +import com.evolveum.midpoint.repo.sqlbase.querydsl.JsonbPath; +import com.evolveum.midpoint.repo.sqlbase.querydsl.UuidPath; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TimeIntervalStatusType; + +import com.querydsl.core.types.dsl.*; +import com.querydsl.sql.ColumnMetadata; + +import java.sql.Types; +import java.time.Instant; + +import static com.evolveum.midpoint.repo.sqlbase.querydsl.JsonbPath.JSONB_TYPE; + +/** + * Querydsl query type for {@value #TABLE_NAME} table. + */ +@SuppressWarnings("unused") +public class QCaseWorkItem extends QContainer { + + private static final long serialVersionUID = 341727922218837393L; + + /** + * If `QCaseWorkItem.class` is not enough because of generics, try `QCaseWorkItem.CLASS`. + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static final Class> CLASS = (Class) QContainer.class; + + public static final String TABLE_NAME = "m_case_wi"; + + public static final ColumnMetadata CLOSE_TIMESTAMP = + ColumnMetadata.named("closeTimestamp").ofType(Types.TIMESTAMP_WITH_TIMEZONE); + public static final ColumnMetadata CREATE_TIMESTAMP = + ColumnMetadata.named("createTimestamp").ofType(Types.TIMESTAMP_WITH_TIMEZONE); + public static final ColumnMetadata DEADLINE = + ColumnMetadata.named("deadline").ofType(Types.TIMESTAMP_WITH_TIMEZONE); + public static final ColumnMetadata ORIGINAL_ASSIGNEE_REF_TARGET_OID = + ColumnMetadata.named("originalAssigneeRefTargetOid").ofType(UuidPath.UUID_TYPE); + public static final ColumnMetadata ORIGINAL_ASSIGNEE_REF_TARGET_TYPE = + ColumnMetadata.named("originalAssigneeRefTargetType").ofType(Types.OTHER); + public static final ColumnMetadata ORIGINAL_ASSIGNEE_REF_RELATION_ID = + ColumnMetadata.named("originalAssigneeRefRelationId").ofType(Types.INTEGER); + public static final ColumnMetadata OUTCOME = + ColumnMetadata.named("outcome").ofType(Types.VARCHAR); + public static final ColumnMetadata PERFORMER_REF_TARGET_OID = + ColumnMetadata.named("performerRefTargetOid").ofType(UuidPath.UUID_TYPE); + public static final ColumnMetadata PERFORMER_REF_TARGET_TYPE = + ColumnMetadata.named("performerRefTargetType").ofType(Types.OTHER); + public static final ColumnMetadata PERFORMER_REF_RELATION_ID = + ColumnMetadata.named("performerRefRelationId").ofType(Types.INTEGER); + public static final ColumnMetadata STAGE_NUMBER = + ColumnMetadata.named("stageNumber").ofType(Types.INTEGER); + + // attributes + + public final DateTimePath closeTimestamp = + createInstant("closeTimestamp", CLOSE_TIMESTAMP); + public final DateTimePath createTimestamp = + createInstant("createTimestamp", CREATE_TIMESTAMP); + public final DateTimePath deadline = + createInstant("deadline", DEADLINE); + public final UuidPath originalAssigneeRefTargetOid = + createUuid("originalAssigneeRefTargetOid", ORIGINAL_ASSIGNEE_REF_TARGET_OID); + public final EnumPath originalAssigneeRefTargetType = + createEnum("originalAssigneeRefTargetType", MObjectType.class, ORIGINAL_ASSIGNEE_REF_TARGET_TYPE); + public final NumberPath originalAssigneeRefRelationId = + createInteger("originalAssigneeRefRelationId", ORIGINAL_ASSIGNEE_REF_RELATION_ID); + public final StringPath outcome = createString("outcome", OUTCOME); + public final UuidPath performerRefTargetOid = + createUuid("performerRefTargetOid", PERFORMER_REF_TARGET_OID); + public final EnumPath performerRefTargetType = + createEnum("performerRefTargetType", MObjectType.class, PERFORMER_REF_TARGET_TYPE); + public final NumberPath performerRefRelationId = + createInteger("performerRefRelationId", PERFORMER_REF_RELATION_ID); + public final NumberPath stageNumber = + createInteger("stageNumber", STAGE_NUMBER); + + + public QCaseWorkItem(String variable) { + this(variable, DEFAULT_SCHEMA_NAME, TABLE_NAME); + } + + public QCaseWorkItem(String variable, String schema, String table) { + super(MCaseWorkItem.class, variable, schema, table); + } + + @Override + public BooleanExpression isOwnedBy(OR ownerRow) { + return ownerOid.eq(ownerRow.oid); + } +} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/workitem/QCaseWorkItemMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/workitem/QCaseWorkItemMapping.java new file mode 100644 index 00000000000..01007405659 --- /dev/null +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/workitem/QCaseWorkItemMapping.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2010-2021 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.repo.sqale.qmodel.cases.workitem; + +import com.evolveum.midpoint.repo.sqale.SqaleRepoContext; +import com.evolveum.midpoint.repo.sqale.qmodel.cases.MCase; +import com.evolveum.midpoint.repo.sqale.qmodel.common.MContainerType; +import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainerMapping; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; +import com.evolveum.midpoint.util.MiscUtil; +import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType; + +import org.jetbrains.annotations.NotNull; + +import static com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType.*; + +/** + * Mapping between {@link QCaseWorkItem} and {@link CaseWorkItemType}. + * + * @param type of the owner row + */ +public class QCaseWorkItemMapping + extends QContainerMapping, MCaseWorkItem, OR> { + + public static final String DEFAULT_ALIAS_NAME = "cswi"; + + private final MContainerType containerType; + + // We can't declare Class>.class, so we cheat a bit. + @SuppressWarnings({ "unchecked", "rawtypes" }) + private QCaseWorkItemMapping( + @NotNull MContainerType containerType, + @NotNull SqaleRepoContext repositoryContext) { + super(QCaseWorkItem.TABLE_NAME, DEFAULT_ALIAS_NAME, + CaseWorkItemType.class, (Class) QCaseWorkItem.class, repositoryContext); + this.containerType = containerType; + + addItemMapping(F_CLOSE_TIMESTAMP, timestampMapper(q -> q.closeTimestamp)); + addItemMapping(F_CREATE_TIMESTAMP, timestampMapper(q -> q.createTimestamp)); + addItemMapping(F_DEADLINE, timestampMapper(q -> q.deadline)); + + addItemMapping(F_ORIGINAL_ASSIGNEE_REF, refMapper( + q -> q.originalAssigneeRefTargetOid, + q -> q.originalAssigneeRefTargetType, + q -> q.originalAssigneeRefRelationId)); + + // TODO: OUTCOME +// addItemMapping(F_OUTCOME, stringMapper(q -> q.outcome)); + + addItemMapping(F_PERFORMER_REF, refMapper( + q -> q.performerRefTargetOid, + q -> q.performerRefTargetType, + q -> q.performerRefRelationId)); + + addItemMapping(F_STAGE_NUMBER, integerMapper(q -> q.stageNumber)); + + } + + @Override + protected QCaseWorkItem newAliasInstance(String alias) { + return new QCaseWorkItem<>(alias); + } + + @Override + public MCaseWorkItem newRowObject() { + MCaseWorkItem row = new MCaseWorkItem(); + row.containerType = this.containerType; + return row; + } + + @Override + public MCaseWorkItem newRowObject(OR ownerRow) { + MCaseWorkItem row = newRowObject(); + row.ownerOid = ownerRow.oid; + return row; + } + + // about duplication see the comment in QObjectMapping.toRowObjectWithoutFullObject + @SuppressWarnings("DuplicatedCode") + @Override + public MCaseWorkItem insert(CaseWorkItemType workItem, OR ownerRow, JdbcSession jdbcSession) { + MCaseWorkItem row = initRowObject(workItem, ownerRow); + + row.closeTimestamp = MiscUtil.asInstant(workItem.getCloseTimestamp()); + row.createTimestamp = MiscUtil.asInstant(workItem.getCreateTimestamp()); + row.deadline = MiscUtil.asInstant(workItem.getDeadline()); + setReference(workItem.getOriginalAssigneeRef(), + o -> row.originalAssigneeRefTargetOid = o, + t -> row.originalAssigneeRefTargetType = t, + r -> row.originalAssigneeRefRelationId = r); + + // TODO: Outcome + + setReference(workItem.getPerformerRef(), + o -> row.performerRefTargetOid = o, + t -> row.performerRefTargetType = t, + r -> row.performerRefRelationId = r); + row.stageNumber = workItem.getStageNumber(); + + insert(row, jdbcSession); + + return row; + } +} From 01f4580e47c62b857b1959cf2bd617c5b7d5bc7e Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Tue, 18 May 2021 19:09:14 +0200 Subject: [PATCH 6/8] Sqale: case->workitem (WIP) --- .../repo/sqale/qmodel/cases/QCaseMapping.java | 28 ++++++++++++++++--- .../cases/workitem/QCaseWorkItemMapping.java | 25 +++++++++++++---- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCaseMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCaseMapping.java index df780cc9273..3d82493033a 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCaseMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCaseMapping.java @@ -6,15 +6,20 @@ */ package com.evolveum.midpoint.repo.sqale.qmodel.cases; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType.*; + +import java.util.List; +import java.util.Objects; + +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.repo.sqale.SqaleRepoContext; +import com.evolveum.midpoint.repo.sqale.qmodel.cases.workitem.QCaseWorkItemMapping; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType; - -import org.jetbrains.annotations.NotNull; - -import static com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType.*; +import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType; /** * Mapping between {@link QCase} and {@link CaseType}. @@ -50,6 +55,10 @@ private QCaseMapping(@NotNull SqaleRepoContext repositoryContext) { q -> q.targetRefTargetOid, q -> q.targetRefTargetType, q -> q.targetRefRelationId)); + + addContainerTableMapping(F_WORK_ITEM, + QCaseWorkItemMapping.init(repositoryContext), + joinOn((o, wi) -> o.oid.eq(wi.ownerOid))); } @Override @@ -88,4 +97,15 @@ public MCase newRowObject() { return row; } + + @Override + public void storeRelatedEntities( + @NotNull MCase row, @NotNull CaseType schemaObject, @NotNull JdbcSession jdbcSession) { + Objects.requireNonNull(row.oid); + + List workItems = schemaObject.getWorkItem(); + if (!workItems.isEmpty()) { + workItems.forEach(t -> QCaseWorkItemMapping.get().insert(t, row, jdbcSession)); + } + } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/workitem/QCaseWorkItemMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/workitem/QCaseWorkItemMapping.java index 01007405659..cf440ed0d3d 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/workitem/QCaseWorkItemMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/workitem/QCaseWorkItemMapping.java @@ -10,12 +10,16 @@ import com.evolveum.midpoint.repo.sqale.qmodel.cases.MCase; import com.evolveum.midpoint.repo.sqale.qmodel.common.MContainerType; import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainerMapping; +import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; +import com.evolveum.midpoint.repo.sqale.qmodel.object.QTriggerMapping; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType; import org.jetbrains.annotations.NotNull; +import java.util.Objects; + import static com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType.*; /** @@ -28,16 +32,26 @@ public class QCaseWorkItemMapping public static final String DEFAULT_ALIAS_NAME = "cswi"; - private final MContainerType containerType; + private static QCaseWorkItemMapping instance; + + public static QCaseWorkItemMapping init( + @NotNull SqaleRepoContext repositoryContext) { + if (instance == null) { + instance = new QCaseWorkItemMapping<>(repositoryContext); + } + return get(); + } + + public static QCaseWorkItemMapping get() { + //noinspection unchecked + return (QCaseWorkItemMapping) Objects.requireNonNull(instance); + } // We can't declare Class>.class, so we cheat a bit. @SuppressWarnings({ "unchecked", "rawtypes" }) - private QCaseWorkItemMapping( - @NotNull MContainerType containerType, - @NotNull SqaleRepoContext repositoryContext) { + private QCaseWorkItemMapping(@NotNull SqaleRepoContext repositoryContext) { super(QCaseWorkItem.TABLE_NAME, DEFAULT_ALIAS_NAME, CaseWorkItemType.class, (Class) QCaseWorkItem.class, repositoryContext); - this.containerType = containerType; addItemMapping(F_CLOSE_TIMESTAMP, timestampMapper(q -> q.closeTimestamp)); addItemMapping(F_CREATE_TIMESTAMP, timestampMapper(q -> q.createTimestamp)); @@ -68,7 +82,6 @@ protected QCaseWorkItem newAliasInstance(String alias) { @Override public MCaseWorkItem newRowObject() { MCaseWorkItem row = new MCaseWorkItem(); - row.containerType = this.containerType; return row; } From a6ffcfba8198e123613650d17bd1ad4ecfd1e120 Mon Sep 17 00:00:00 2001 From: Richard Richter Date: Tue, 18 May 2021 19:53:53 +0200 Subject: [PATCH 7/8] repo-sqale: added perf monitoring to add/get/search/modifyObject --- .../repo/sqale/SqaleRepositoryBeanConfig.java | 2 - .../repo/sqale/SqaleRepositoryService.java | 235 ++++++++++++------ .../repo/sqale/SqaleRepoBaseTest.java | 15 ++ .../func/SqaleRepoAddDeleteObjectTest.java | 30 ++- .../sqale/func/SqaleRepoModifyObjectTest.java | 22 ++ .../sqale/func/SqaleRepoSearchObjectTest.java | 21 ++ .../repo/sqale/func/SqaleRepoSmokeTest.java | 24 ++ 7 files changed, 260 insertions(+), 89 deletions(-) diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryBeanConfig.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryBeanConfig.java index bbb52c2541d..b70a1dfb7ed 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryBeanConfig.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryBeanConfig.java @@ -182,11 +182,9 @@ public SqlPerformanceMonitorsCollection sqlPerformanceMonitorsCollection() { @Bean public SqaleRepositoryService repositoryService( SqaleRepoContext sqlRepoContext, - SchemaService schemaService, SqlPerformanceMonitorsCollection sqlPerformanceMonitorsCollection) { return new SqaleRepositoryService( sqlRepoContext, - schemaService, sqlPerformanceMonitorsCollection); } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryService.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryService.java index 8613d581234..1f66c9ac0f5 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryService.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryService.java @@ -30,7 +30,7 @@ import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.repo.api.*; -import com.evolveum.midpoint.repo.api.perf.PerformanceMonitor; +import com.evolveum.midpoint.repo.api.perf.OperationRecord; import com.evolveum.midpoint.repo.api.query.ObjectFilterExpressionEvaluator; import com.evolveum.midpoint.repo.sqale.operations.AddObjectOperation; import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTableMapping; @@ -46,7 +46,6 @@ import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -55,6 +54,17 @@ /** * Repository implementation based on SQL, JDBC and Querydsl without any ORM. * WORK IN PROGRESS. + * + * Structure of main public methods (WIP): + * - arg checks + * - debug log + * - create op-result, immediately followed by try/catch/finally (see addObject for example) + * - more arg checks :-) (here ore before op result depending on the needs) + * - call to executeMethodName(...) where perf monitor is initialized followed by try/catch/finally + * - finally in main method: + * + * TODO/document?: + * - ignore useNoFetchExtensionValuesInsertion - related to Hibernate, */ public class SqaleRepositoryService implements RepositoryService { @@ -70,7 +80,6 @@ public class SqaleRepositoryService implements RepositoryService { private static final int MAX_CONFLICT_WATCHERS = 10; private final SqaleRepoContext repositoryContext; - private final SchemaService schemaService; private final SqlQueryExecutor sqlQueryExecutor; private final SqlPerformanceMonitorsCollection sqlPerformanceMonitorsCollection; @@ -84,10 +93,8 @@ public class SqaleRepositoryService implements RepositoryService { public SqaleRepositoryService( SqaleRepoContext repositoryContext, - SchemaService schemaService, SqlPerformanceMonitorsCollection sqlPerformanceMonitorsCollection) { this.repositoryContext = repositoryContext; - this.schemaService = schemaService; this.sqlQueryExecutor = new SqlQueryExecutor(repositoryContext); this.sqlPerformanceMonitorsCollection = sqlPerformanceMonitorsCollection; @@ -118,24 +125,9 @@ public SqaleRepositoryService( .addParam("oid", oid) .build(); + PrismObject object = null; try { - PrismObject object; - try (JdbcSession jdbcSession = - repositoryContext.newJdbcSession().startReadOnlyTransaction()) { - //noinspection unchecked - object = (PrismObject) readByOid(jdbcSession, type, oidUuid, options) - .asPrismObject(); - jdbcSession.commit(); - } - - // "objectLocal" is here just to provide effectively final variable for the lambda below -// PrismObject objectLocal = executeAttempts(oid, OP_GET_OBJECT, type, "getting", -// subResult, () -> objectRetriever.getObjectAttempt(type, oid, options, operationResult)); -// object = objectLocal; - invokeConflictWatchers((w) -> w.afterGetObject(object)); - - // TODO both update and get need this? - ObjectTypeUtil.normalizeAllRelations(object, schemaService.relationRegistry()); + object = executeGetObject(type, oidUuid, options); return object; } catch (RuntimeException e) { // TODO what else to catch? throw handledGeneralException(e, operationResult); @@ -144,11 +136,39 @@ public SqaleRepositoryService( throw t; } finally { operationResult.computeStatusIfUnknown(); -// OperationLogger.logGetObject(type, oid, options, object, operationResult); - // TODO some logging + OperationLogger.logGetObject(type, oid, options, object, operationResult); } } + private PrismObject executeGetObject( + Class type, + UUID oidUuid, + Collection> options) + throws SchemaException, ObjectNotFoundException { + PrismObject object; + long opHandle = registerOperationStart(OP_GET_OBJECT, type); + try (JdbcSession jdbcSession = + repositoryContext.newJdbcSession().startReadOnlyTransaction()) { + //noinspection unchecked + object = (PrismObject) readByOid(jdbcSession, type, oidUuid, options) + .asPrismObject(); + jdbcSession.commit(); + } finally { + registerOperationFinish(opHandle, 1); // TODO attempt (separate try from JDBC session) + } + + // TODO attempts on conflict + // "objectLocal" is here just to provide effectively final variable for the lambda below +// PrismObject objectLocal = executeAttempts(oid, OP_GET_OBJECT, type, "getting", +// subResult, () -> objectRetriever.getObjectAttempt(type, oid, options, operationResult)); +// object = objectLocal; + invokeConflictWatchers((w) -> w.afterGetObject(object)); + + // TODO both update and get need this? I believe not. + // ObjectTypeUtil.normalizeAllRelations(object, schemaService.relationRegistry()); + return object; + } + private UUID checkOid(String oid) { Objects.requireNonNull(oid, "OID must not be null"); try { @@ -240,46 +260,53 @@ public String addObject( object.setVersion("1"); } + return executeAddObject(object, options, operationResult); + } catch (Throwable t) { + operationResult.recordFatalError(t); + throw t; + } finally { + operationResult.computeStatusIfUnknown(); + OperationLogger.logAdd(object, options, operationResult); + } + } + + private String executeAddObject( + @NotNull PrismObject object, + @NotNull RepoAddOptions options, + @NotNull OperationResult operationResult) + throws SchemaException, ObjectAlreadyExistsException { + long opHandle = registerOperationStart( + options.isOverwrite() ? OP_ADD_OBJECT_OVERWRITE : OP_ADD_OBJECT, + object); /* old repo code missing in new repo: - SqlPerformanceMonitorImpl pm = getPerformanceMonitor(); - long opHandle = pm.registerOperationStart(OP_ADD_OBJECT, object.getCompileTimeClass()); int attempt = 1; int restarts = 0; - boolean noFetchExtensionValueInsertionForbidden = false; String proposedOid = object.getOid(); while (true) { - try { */ - // TODO use executeAttempts + // TODO use executeAttempts + try { String oid = new AddObjectOperation<>(object, options, operationResult) .execute(repositoryContext); invokeConflictWatchers((w) -> w.afterAddObject(oid, object)); return oid; - /* - } catch (RestartOperationRequestedException ex) { - // special case: we want to restart but we do not want to count these - LOGGER.trace("Restarting because of {}", ex.getMessage()); - restarts++; - if (restarts > RESTART_LIMIT) { - throw new IllegalStateException("Too many operation restarts"); - } - } catch (RuntimeException ex) { - attempt = baseHelper.logOperationAttempt(proposedOid, "adding", attempt, ex, subResult); -// pm.registerOperationNewAttempt(opHandle, attempt); + /* + } catch (RestartOperationRequestedException ex) { + // special case: we want to restart but we do not want to count these + LOGGER.trace("Restarting because of {}", ex.getMessage()); + restarts++; + if (restarts > RESTART_LIMIT) { + throw new IllegalStateException("Too many operation restarts"); } - noFetchExtensionValueInsertionForbidden = true; // todo This is a temporary measure; needs better handling. + } catch (RuntimeException ex) { + attempt = baseHelper.logOperationAttempt(proposedOid, "adding", attempt, ex, subResult); +// pm.registerOperationNewAttempt(opHandle, attempt); } - } finally { -// pm.registerOperationFinish(opHandle, attempt); -// OperationLogger.logAdd(object, options, subResult); TODO logging } - */ - } catch (Throwable t) { - operationResult.recordFatalError(t); - throw t; + */ } finally { - operationResult.computeStatusIfUnknown(); + registerOperationFinish(opHandle, 1); // TODO attempt } } @@ -326,6 +353,13 @@ public ModifyObjectResult modifyObject( UUID oidUuid = checkOid(oid); Objects.requireNonNull(parentResult, "Operation result must not be null."); + if (options == null) { + options = new RepoModifyOptions(); + } + + LOGGER.debug("Modify object type '{}', oid={}, reindex={}", + type.getSimpleName(), oid, options.isForceReindex()); + OperationResult operationResult = parentResult.subresult(OP_NAME_PREFIX + OP_MODIFY_OBJECT) .addQualifier(type.getSimpleName()) .addParam("type", type.getName()) @@ -353,31 +387,7 @@ public ModifyObjectResult modifyObject( logTraceModifications(modifications); - // TODO: THIS is real start of modifyObjectAttempt - try (JdbcSession jdbcSession = repositoryContext.newJdbcSession().startTransaction()) { - RootUpdateContext, MObject> updateContext = - prepareUpdateContext(jdbcSession, type, oidUuid); - PrismObject prismObject = updateContext.getPrismObject(); - if (precondition != null && !precondition.holds(prismObject)) { - jdbcSession.rollback(); - throw new PreconditionViolationException( - "Modification precondition does not hold for " + prismObject); - } - invokeConflictWatchers(w -> w.beforeModifyObject(prismObject)); - - // TODO is modifications cloning unavoidable? see the clone at the start of ObjectUpdater.modifyObjectAttempt - // If cloning will be necessary, do it at the beginning of modifyObjectAttempt, - // especially if called potentially multiple times. - // TODO replaces: RObject rObject = objectDeltaUpdater.modifyObject(type, oid, modifications, prismObject, modifyOptions, session, attemptContext); - PrismObject originalObject = prismObject.clone(); - - modifications = updateContext.execute(modifications); - jdbcSession.commit(); - - LOGGER.trace("OBJECT after:\n{}", prismObject.debugDumpLazily()); - - return new ModifyObjectResult<>(originalObject, prismObject, modifications); - } + return executeModifyObject(type, oidUuid, modifications, precondition); } catch (RepositoryException | RuntimeException e) { throw handledGeneralException(e, operationResult); } catch (Throwable t) { @@ -385,6 +395,39 @@ public ModifyObjectResult modifyObject( throw t; } finally { operationResult.computeStatusIfUnknown(); + OperationLogger.logModify(type, oid, modifications, precondition, options, operationResult); + } + } + + @NotNull + private ModifyObjectResult executeModifyObject( + @NotNull Class type, + @NotNull UUID oidUuid, + @NotNull Collection> modifications, + @Nullable ModificationPrecondition precondition) + throws SchemaException, ObjectNotFoundException, PreconditionViolationException, RepositoryException { + + long opHandle = registerOperationStart(OP_MODIFY_OBJECT, type); + try (JdbcSession jdbcSession = repositoryContext.newJdbcSession().startTransaction()) { + RootUpdateContext, MObject> updateContext = + prepareUpdateContext(jdbcSession, type, oidUuid); + PrismObject prismObject = updateContext.getPrismObject(); + if (precondition != null && !precondition.holds(prismObject)) { + jdbcSession.rollback(); + throw new PreconditionViolationException( + "Modification precondition does not hold for " + prismObject); + } + invokeConflictWatchers(w -> w.beforeModifyObject(prismObject)); + PrismObject originalObject = prismObject.clone(); // for result later + + modifications = updateContext.execute(modifications); + jdbcSession.commit(); + + LOGGER.trace("OBJECT after:\n{}", prismObject.debugDumpLazily()); + + return new ModifyObjectResult<>(originalObject, prismObject, modifications); + } finally { + registerOperationFinish(opHandle, 1); // TODO attempt } } @@ -543,13 +586,7 @@ public int countObjects(Class type, ObjectQuery query, .build(); try { - var queryContext = SqaleQueryContext.from(type, repositoryContext); - SearchResultList result = - sqlQueryExecutor.list(queryContext, query, options); - // TODO see the commented code from old repo lower, problems for each object must be caught - //noinspection unchecked - return result.map( - o -> (PrismObject) o.asPrismObject()); + return executeSearchObject(type, query, options); } catch (RepositoryException | RuntimeException e) { throw handledGeneralException(e, operationResult); } catch (Throwable t) { @@ -560,6 +597,27 @@ public int countObjects(Class type, ObjectQuery query, } } + private SearchResultList> executeSearchObject( + @NotNull Class type, + ObjectQuery query, + Collection> options) + throws RepositoryException, SchemaException { + + long opHandle = registerOperationStart(OP_SEARCH_OBJECTS, type); + try { + SearchResultList result = sqlQueryExecutor.list( + SqaleQueryContext.from(type, repositoryContext), + query, + options); + // TODO see the commented code from old repo lower, problems for each object must be caught + //noinspection unchecked + return result.map( + o -> (PrismObject) o.asPrismObject()); + } finally { + registerOperationFinish(opHandle, 1); // TODO attempt (separate try from JDBC session) + } + } + /* TODO from ObjectRetriever, how to do this per-object Throwable catch + record result? should we smuggle the OperationResult all the way to the mapping call? @@ -810,7 +868,7 @@ public void addDiagnosticInformation(Class type, Strin } @Override - public PerformanceMonitor getPerformanceMonitor() { + public SqlPerformanceMonitorImpl getPerformanceMonitor() { return performanceMonitor; } @@ -849,4 +907,17 @@ private void recordException(@NotNull Throwable ex, OperationResult result, bool result.recordFatalError(message, ex); } } + + private long registerOperationStart(String kind, PrismObject object) { + return performanceMonitor.registerOperationStart(kind, object.getCompileTimeClass()); + } + + private long registerOperationStart(String kind, Class type) { + return performanceMonitor.registerOperationStart(kind, type); + } + + // TODO return will be used probably by modifyObject* + private OperationRecord registerOperationFinish(long opHandle, int attempt) { + return performanceMonitor.registerOperationFinish(opHandle, attempt); + } } diff --git a/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/SqaleRepoBaseTest.java b/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/SqaleRepoBaseTest.java index 919575fbcd7..91f0b15f5f9 100644 --- a/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/SqaleRepoBaseTest.java +++ b/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/SqaleRepoBaseTest.java @@ -10,6 +10,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.stream.Stream; import javax.xml.namespace.QName; @@ -24,12 +25,14 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.Referencable; +import com.evolveum.midpoint.repo.api.perf.OperationPerformanceInformation; import com.evolveum.midpoint.repo.sqale.qmodel.common.QUri; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObjectType; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObject; import com.evolveum.midpoint.repo.sqale.qmodel.ref.MReference; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; +import com.evolveum.midpoint.repo.sqlbase.perfmon.SqlPerformanceMonitorImpl; import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase; import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.test.util.AbstractSpringTest; @@ -231,4 +234,16 @@ protected java.util.function.Predicate refRowMatcher( && ref.targetType == targetType && cachedUriById(ref.relationId).equals(QNameUtil.qNameToUri(relation)); } + + protected void assertSingleOperationRecorded(SqlPerformanceMonitorImpl pm, String opKind) { + Map pmAllData = + pm.getGlobalPerformanceInformation().getAllData(); + assertThat(pmAllData).hasSize(1); + Map.Entry perfEntry = + pmAllData.entrySet().iterator().next(); + assertThat(perfEntry.getKey()).startsWith(opKind); + OperationPerformanceInformation operationInfo = perfEntry.getValue(); + assertThat(operationInfo.getInvocationCount()).isEqualTo(1); + assertThat(operationInfo.getExecutionCount()).isEqualTo(1); + } } diff --git a/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoAddDeleteObjectTest.java b/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoAddDeleteObjectTest.java index 5ae99c81376..58ddd2c4487 100644 --- a/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoAddDeleteObjectTest.java +++ b/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoAddDeleteObjectTest.java @@ -18,17 +18,16 @@ import java.util.UUID; import javax.xml.namespace.QName; -import com.evolveum.midpoint.repo.sqale.qmodel.cases.MCase; - -import com.evolveum.midpoint.repo.sqale.qmodel.cases.QCase; - import org.testng.annotations.Test; import com.evolveum.midpoint.repo.api.DeleteObjectResult; +import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.sqale.SqaleRepoBaseTest; import com.evolveum.midpoint.repo.sqale.qmodel.accesscert.MAccessCertificationDefinition; import com.evolveum.midpoint.repo.sqale.qmodel.accesscert.QAccessCertificationDefinition; import com.evolveum.midpoint.repo.sqale.qmodel.assignment.*; +import com.evolveum.midpoint.repo.sqale.qmodel.cases.MCase; +import com.evolveum.midpoint.repo.sqale.qmodel.cases.QCase; import com.evolveum.midpoint.repo.sqale.qmodel.common.MContainer; import com.evolveum.midpoint.repo.sqale.qmodel.common.MContainerType; import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainer; @@ -58,6 +57,7 @@ import com.evolveum.midpoint.repo.sqale.qmodel.task.MTask; import com.evolveum.midpoint.repo.sqale.qmodel.task.QTask; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; +import com.evolveum.midpoint.repo.sqlbase.perfmon.SqlPerformanceMonitorImpl; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.MiscUtil; @@ -65,6 +65,7 @@ import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; public class SqaleRepoAddDeleteObjectTest extends SqaleRepoBaseTest { @@ -191,6 +192,25 @@ public void test111AddSecondObjectWithTheSameOidThrowsObjectAlreadyExists() assertCount(QUser.class, baseCount); } + @Test + public void test150AddOperationUpdatesPerformanceMonitor() + throws ObjectAlreadyExistsException, SchemaException { + OperationResult result = createOperationResult(); + + given("object to add and cleared performance information"); + UserType userType = new UserType(prismContext).name("user" + getTestNumber()); + SqlPerformanceMonitorImpl pm = repositoryService.getPerformanceMonitor(); + pm.clearGlobalPerformanceInformation(); + assertThat(pm.getGlobalPerformanceInformation().getAllData()).isEmpty(); + + when("object is added to the repository"); + repositoryService.addObject(userType.asPrismObject(), null, result); + + then("performance monitor is updated"); + assertThatOperationResult(result).isSuccess(); + assertSingleOperationRecorded(pm, RepositoryService.OP_ADD_OBJECT); + } + @Test public void test200AddObjectWithMultivalueContainers() throws ObjectAlreadyExistsException, SchemaException { @@ -320,7 +340,7 @@ public void test206AddObjectWithMultivalueRefsOnAssignment() String userName = "user" + getTestNumber(); UUID approverRef1 = UUID.randomUUID(); UUID approverRef2 = UUID.randomUUID(); - QName approverRelation = QName.valueOf("{https://random.org/ns}conn-rel"); // TODO + QName approverRelation = QName.valueOf("{https://random.org/ns}conn-rel"); UserType user = new UserType(prismContext) .name(userName) .assignment(new AssignmentType() diff --git a/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoModifyObjectTest.java b/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoModifyObjectTest.java index eaad0d84937..c375ac60320 100644 --- a/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoModifyObjectTest.java +++ b/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoModifyObjectTest.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.polystring.PolyString; +import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.sqale.SqaleRepoBaseTest; import com.evolveum.midpoint.repo.sqale.qmodel.assignment.*; import com.evolveum.midpoint.repo.sqale.qmodel.common.MContainerType; @@ -38,6 +39,7 @@ import com.evolveum.midpoint.repo.sqale.qmodel.shadow.QShadow; import com.evolveum.midpoint.repo.sqale.qmodel.task.MTask; import com.evolveum.midpoint.repo.sqale.qmodel.task.QTask; +import com.evolveum.midpoint.repo.sqlbase.perfmon.SqlPerformanceMonitorImpl; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; @@ -2115,6 +2117,26 @@ public void test910ModificationsOfNonexistentObjectFails() throws SchemaExceptio assertThatOperationResult(result).isFatalError(); } + @Test + public void test920ModifyOperationUpdatesPerformanceMonitor() + throws SchemaException, ObjectNotFoundException, ObjectAlreadyExistsException { + OperationResult result = createOperationResult(); + + given("object modification and cleared performance information"); + ObjectDelta delta = prismContext.deltaFor(UserType.class) + .item(UserType.F_EMAIL_ADDRESS).add(getTestNameShort() + "@email.com") + .asObjectDelta(user1Oid); + SqlPerformanceMonitorImpl pm = repositoryService.getPerformanceMonitor(); + pm.clearGlobalPerformanceInformation(); + assertThat(pm.getGlobalPerformanceInformation().getAllData()).isEmpty(); + + when("object is modified in the repository"); + repositoryService.modifyObject(UserType.class, user1Oid, delta.getModifications(), result); + + then("performance monitor is updated"); + assertThatOperationResult(result).isSuccess(); + assertSingleOperationRecorded(pm, RepositoryService.OP_MODIFY_OBJECT); + } @Test public void test990ChangeOfNonPersistedAttributeWorksOk() throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException { diff --git a/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoSearchObjectTest.java b/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoSearchObjectTest.java index ebd492ab500..92f65c4416e 100644 --- a/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoSearchObjectTest.java +++ b/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoSearchObjectTest.java @@ -19,8 +19,10 @@ import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.sqale.SqaleRepoBaseTest; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObject; +import com.evolveum.midpoint.repo.sqlbase.perfmon.SqlPerformanceMonitorImpl; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SearchResultList; import com.evolveum.midpoint.schema.SelectorOptions; @@ -411,6 +413,25 @@ public void test900SearchByWholeContainerIsNotPossible() { // even if query was possible this would fail in the actual repo search, which is expected } + + @Test + public void test950SearchOperationUpdatesPerformanceMonitor() throws SchemaException { + OperationResult operationResult = createOperationResult(); + + given("cleared performance information"); + SqlPerformanceMonitorImpl pm = repositoryService.getPerformanceMonitor(); + pm.clearGlobalPerformanceInformation(); + assertThat(pm.getGlobalPerformanceInformation().getAllData()).isEmpty(); + + when("search is called on the repository"); + SearchResultList result = searchObjects(FocusType.class, + prismContext.queryFor(FocusType.class).build(), + operationResult); + + then("performance monitor is updated"); + assertThatOperationResult(operationResult).isSuccess(); + assertSingleOperationRecorded(pm, RepositoryService.OP_SEARCH_OBJECTS); + } // endregion // support methods diff --git a/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoSmokeTest.java b/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoSmokeTest.java index 84ecf5f18eb..309382e380a 100644 --- a/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoSmokeTest.java +++ b/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoSmokeTest.java @@ -12,7 +12,9 @@ import org.testng.annotations.Test; +import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.repo.api.DeleteObjectResult; +import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.sqale.SqaleRepoBaseTest; import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainer; import com.evolveum.midpoint.repo.sqale.qmodel.focus.MUser; @@ -20,6 +22,7 @@ import com.evolveum.midpoint.repo.sqale.qmodel.object.QObject; import com.evolveum.midpoint.repo.sqale.qmodel.ref.QReference; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; +import com.evolveum.midpoint.repo.sqlbase.perfmon.SqlPerformanceMonitorImpl; import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase; import com.evolveum.midpoint.repo.sqlbase.querydsl.Jsonb; import com.evolveum.midpoint.schema.result.OperationResult; @@ -59,14 +62,35 @@ public void test000Sanity() { public void test100AddObject() throws ObjectAlreadyExistsException, SchemaException { OperationResult result = createOperationResult(); + when("correct object is added to the repository"); UserType userType = new UserType(prismContext) .name("sanity-user"); sanityUserOid = repositoryService.addObject(userType.asPrismObject(), null, result); + then("added object is assigned OID and operation is success"); assertThat(sanityUserOid).isNotNull(); + assertThat(userType.getOid()).isEqualTo(sanityUserOid); assertThatOperationResult(result).isSuccess(); } + @Test + public void test200GetObject() throws SchemaException, ObjectNotFoundException { + OperationResult result = createOperationResult(); + + given("cleared performance information"); + SqlPerformanceMonitorImpl pm = repositoryService.getPerformanceMonitor(); + pm.clearGlobalPerformanceInformation(); + assertThat(pm.getGlobalPerformanceInformation().getAllData()).isEmpty(); + + when("getObject is called for known OID"); + PrismObject object = + repositoryService.getObject(UserType.class, sanityUserOid, null, result); + + then("object is obtained and performance monitor is updated"); + assertThatOperationResult(result).isSuccess(); + assertSingleOperationRecorded(pm, RepositoryService.OP_GET_OBJECT); + } + @Test(enabled = false) // TODO deleteObject not implemented yet public void test800DeleteObject() throws ObjectNotFoundException { OperationResult result = createOperationResult(); From f28532f1b631ee2d413655f9e254ed883f3099d3 Mon Sep 17 00:00:00 2001 From: Richard Richter Date: Wed, 19 May 2021 16:13:26 +0200 Subject: [PATCH 8/8] repo-sqale: added overwrite and first tests, ignoring version in add Now addObject ignores provided version, both for initial (1 is set) and for overwrite (updates version + 1). --- .../repo/sqale/SqaleRepositoryService.java | 89 ++++++++++++++++--- .../AddObjectContext.java} | 44 ++++----- .../func/SqaleRepoAddDeleteObjectTest.java | 85 +++++++++++++++++- 3 files changed, 174 insertions(+), 44 deletions(-) rename repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/{operations/AddObjectOperation.java => update/AddObjectContext.java} (79%) diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryService.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryService.java index 1f66c9ac0f5..56f16622092 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryService.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryService.java @@ -26,17 +26,19 @@ import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ItemDeltaCollectionsUtil; +import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.PropertyDelta; +import com.evolveum.midpoint.prism.equivalence.EquivalenceStrategy; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.repo.api.*; import com.evolveum.midpoint.repo.api.perf.OperationRecord; import com.evolveum.midpoint.repo.api.query.ObjectFilterExpressionEvaluator; -import com.evolveum.midpoint.repo.sqale.operations.AddObjectOperation; import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTableMapping; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObjectType; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObject; +import com.evolveum.midpoint.repo.sqale.update.AddObjectContext; import com.evolveum.midpoint.repo.sqale.update.RootUpdateContext; import com.evolveum.midpoint.repo.sqlbase.*; import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; @@ -260,7 +262,11 @@ public String addObject( object.setVersion("1"); } - return executeAddObject(object, options, operationResult); + return object.getOid() == null || !options.isOverwrite() + ? executeAddObject(object, options, operationResult) + : executeOverwriteObject(object, options, operationResult); + } catch (RepositoryException | RuntimeException e) { + throw handledGeneralException(e, operationResult); } catch (Throwable t) { operationResult.recordFatalError(t); throw t; @@ -275,9 +281,7 @@ private String executeAddObject( @NotNull RepoAddOptions options, @NotNull OperationResult operationResult) throws SchemaException, ObjectAlreadyExistsException { - long opHandle = registerOperationStart( - options.isOverwrite() ? OP_ADD_OBJECT_OVERWRITE : OP_ADD_OBJECT, - object); + long opHandle = registerOperationStart(OP_ADD_OBJECT, object); /* old repo code missing in new repo: int attempt = 1; int restarts = 0; @@ -287,8 +291,8 @@ private String executeAddObject( // TODO use executeAttempts try { - String oid = new AddObjectOperation<>(object, options, operationResult) - .execute(repositoryContext); + String oid = new AddObjectContext<>(repositoryContext, object, options, operationResult) + .execute(); invokeConflictWatchers((w) -> w.afterAddObject(oid, object)); return oid; /* @@ -310,6 +314,52 @@ private String executeAddObject( } } + /** Overwrite is more like update than add. */ + private String executeOverwriteObject( + @NotNull PrismObject newObject, + @NotNull RepoAddOptions options, + @NotNull OperationResult operationResult) + throws SchemaException, RepositoryException, ObjectAlreadyExistsException { + + String oid = newObject.getOid(); + UUID oidUuid = UUID.fromString(oid); + long opHandle = registerOperationStart(OP_ADD_OBJECT_OVERWRITE, newObject); + // TODO use executeAttempts + try (JdbcSession jdbcSession = repositoryContext.newJdbcSession().startTransaction()) { + try { + //noinspection ConstantConditions + RootUpdateContext, MObject> updateContext = + prepareUpdateContext(jdbcSession, newObject.getCompileTimeClass(), oidUuid); + PrismObject prismObject = updateContext.getPrismObject(); + // no precondition check for overwrite + + // TODO beforeModify? then afterModify lower too... +// invokeConflictWatchers(w -> w.beforeModifyObject(prismObject)); + newObject.setUserData(RepositoryService.KEY_ORIGINAL_OBJECT, prismObject.clone()); + ObjectDelta delta = prismObject.diff(newObject, EquivalenceStrategy.LITERAL); + Collection> modifications = delta.getModifications(); + + LOGGER.trace("overwriteAddObjectAttempt: originalOid={}, modifications={}", + oid, modifications); + + updateContext.execute(modifications); + + // TODO do we want this conflict watcher or modify one? +// invokeConflictWatchers((w) -> w.afterAddObject(oid, object)); + LOGGER.trace("OBJECT after:\n{}", prismObject.debugDumpLazily()); + } catch (ObjectNotFoundException e) { + // so it is just plain addObject after all + new AddObjectContext<>(repositoryContext, newObject, options, operationResult) + .execute(); + invokeConflictWatchers((w) -> w.afterAddObject(oid, newObject)); + } + jdbcSession.commit(); + return oid; + } finally { + registerOperationFinish(opHandle, 1); // TODO attempt + } + } + @Override @NotNull public ModifyObjectResult modifyObject( @@ -425,6 +475,7 @@ private ModifyObjectResult executeModifyObject( LOGGER.trace("OBJECT after:\n{}", prismObject.debugDumpLazily()); + invokeConflictWatchers((w) -> w.afterModifyObject(prismObject.getOid())); return new ModifyObjectResult<>(originalObject, prismObject, modifications); } finally { registerOperationFinish(opHandle, 1); // TODO attempt @@ -500,13 +551,7 @@ private void logTraceModifications(@NotNull Collection .addParam("oid", oid) .build(); try { - try (JdbcSession jdbcSession = repositoryContext.newJdbcSession().startTransaction()) { - DeleteObjectResult result = deleteObjectAttempt(type, oidUuid, jdbcSession); - invokeConflictWatchers((w) -> w.afterDeleteObject(oid)); - - jdbcSession.commit(); - return result; - } + return executeDeleteObject(type, oid, oidUuid); } catch (RuntimeException e) { throw handledGeneralException(e, operationResult); } catch (Throwable t) { @@ -517,6 +562,22 @@ private void logTraceModifications(@NotNull Collection } } + @NotNull + private DeleteObjectResult executeDeleteObject( + Class type, String oid, UUID oidUuid) throws ObjectNotFoundException { + + long opHandle = registerOperationStart(OP_DELETE_OBJECT, type); + try (JdbcSession jdbcSession = repositoryContext.newJdbcSession().startTransaction()) { + DeleteObjectResult result = deleteObjectAttempt(type, oidUuid, jdbcSession); + invokeConflictWatchers((w) -> w.afterDeleteObject(oid)); + + jdbcSession.commit(); + return result; + } finally { + registerOperationFinish(opHandle, 1); // TODO attempt + } + } + private , R extends MObject> DeleteObjectResult deleteObjectAttempt(Class type, UUID oid, JdbcSession jdbcSession) throws ObjectNotFoundException { diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/operations/AddObjectOperation.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/AddObjectContext.java similarity index 79% rename from repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/operations/AddObjectOperation.java rename to repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/AddObjectContext.java index c0614196cad..076bcc31245 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/operations/AddObjectOperation.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/AddObjectContext.java @@ -4,7 +4,7 @@ * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. */ -package com.evolveum.midpoint.repo.sqale.operations; +package com.evolveum.midpoint.repo.sqale.update; import java.util.Objects; import java.util.UUID; @@ -24,35 +24,31 @@ import com.evolveum.midpoint.repo.sqale.qmodel.object.QObject; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlRepoContext; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -/* -TODO: implementation note: - Typically I'd use "technical" dependencies in a constructor and then the object/options/result - would be parameters of execute(). Unfortunately I don't know how to do that AND capture - the parametric types in the operations object. I could hide it behind this object and then capture - it in another "actual operation" object, but that does not make any sense. - That's why the creation is with actual parameters and execute() takes technical ones (possibly - some richer "context" object later to provide more dependencies if necessary). - The "context" could go to construction too, but than it would be all mixed too much. Sorry. -*/ -public class AddObjectOperation, R extends MObject> { +/** + * Add object operation context; used only for true add, not overwrite which is more like modify. + */ +public class AddObjectContext, R extends MObject> { + private final SqaleRepoContext repositoryContext; private final PrismObject object; private final RepoAddOptions options; private final OperationResult result; - private SqlRepoContext repositoryContext; private Q root; private QObjectMapping rootMapping; private MObjectType objectType; - public AddObjectOperation(@NotNull PrismObject object, - @NotNull RepoAddOptions options, @NotNull OperationResult result) { + public AddObjectContext( + @NotNull SqaleRepoContext repositoryContext, + @NotNull PrismObject object, + @NotNull RepoAddOptions options, + @NotNull OperationResult result) { + this.repositoryContext = repositoryContext; this.object = object; this.options = options; this.result = result; @@ -61,24 +57,20 @@ public AddObjectOperation(@NotNull PrismObject object, /** * Inserts the object provided to the constructor and returns its OID. */ - public String execute(SqaleRepoContext repositoryContext) + public String execute() throws SchemaException, ObjectAlreadyExistsException { try { // TODO utilize options and result - this.repositoryContext = repositoryContext; + object.setVersion("1"); // initial add always uses 1 as version number Class schemaObjectClass = object.getCompileTimeClass(); objectType = MObjectType.fromSchemaType(schemaObjectClass); rootMapping = repositoryContext.getMappingBySchemaType(schemaObjectClass); root = rootMapping.defaultAlias(); - // we don't want CID generation here, because overwrite works different then normal add - if (object.getOid() == null) { return addObjectWithoutOid(); - } else if (options.isOverwrite()) { - return overwriteObject(); } else { - // OID is not null, but it's not overwrite either + // this also handles overwrite after ObjectNotFoundException return addObjectWithOid(); } } catch (QueryException e) { @@ -90,10 +82,6 @@ public String execute(SqaleRepoContext repositoryContext) } } - private String overwriteObject() { - throw new UnsupportedOperationException(); // TODO - } - private String addObjectWithOid() throws SchemaException { long lastCid = new ContainerValueIdGenerator().generateForNewObject(object); try (JdbcSession jdbcSession = repositoryContext.newJdbcSession().startTransaction()) { @@ -150,6 +138,8 @@ private String addObjectWithoutOid() throws SchemaException { } } + // TODO can be static. Should it move to other SQL exception handling code? + /** Throws more specific exception or returns and then original exception should be rethrown. */ private void handlePostgresException(PSQLException psqlException) throws ObjectAlreadyExistsException { diff --git a/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoAddDeleteObjectTest.java b/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoAddDeleteObjectTest.java index 58ddd2c4487..1a37bd42e91 100644 --- a/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoAddDeleteObjectTest.java +++ b/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoAddDeleteObjectTest.java @@ -77,7 +77,8 @@ public void test100AddNamedUserWithoutOidWorksOk() given("user with a name"); String userName = "user" + getTestNumber(); UserType userType = new UserType(prismContext) - .name(userName); + .name(userName) + .version("5"); // version will be ignored and set to 1 when("adding it to the repository"); String returnedOid = repositoryService.addObject(userType.asPrismObject(), null, result); @@ -90,7 +91,7 @@ public void test100AddNamedUserWithoutOidWorksOk() MUser row = selectOne(u, u.nameOrig.eq(userName)); assertThat(row.oid).isEqualTo(UUID.fromString(returnedOid)); assertThat(row.nameNorm).isNotNull(); // normalized name is stored - assertThat(row.version).isEqualTo(1); // initial version is set + assertThat(row.version).isEqualTo(1); // initial version is set, ignoring provided version // read-only column with value generated/stored in the database assertThat(row.objectType).isEqualTo(MObjectType.USER); assertThat(row.subtypes).isNull(); // we don't store empty lists as empty arrays @@ -139,6 +140,65 @@ public void test102AddWithoutOidIgnoresOverwriteOption() assertThat(users.get(0).oid).isNotNull(); } + @Test + public void test105AddWithOverwriteOption() + throws ObjectAlreadyExistsException, SchemaException { + OperationResult result = createOperationResult(); + + given("user already in the repository"); + long baseCount = count(QUser.class); + String userName = "user" + getTestNumber(); + UserType userType = new UserType(prismContext) + .name(userName); + repositoryService.addObject(userType.asPrismObject(), null, result); + assertThat(count(QUser.class)).isEqualTo(baseCount + 1); + + when("adding it to the repository again with overwrite option"); + userType.setFullName(PolyStringType.fromOrig("Overwritten User")); + userType.setVersion("5"); // should be ignored + repositoryService.addObject(userType.asPrismObject(), createOverwrite(), result); + + then("operation is successful"); + assertThatOperationResult(result).isSuccess(); + + and("existing user row is modified/overwritten"); + assertThat(count(QUser.class)).isEqualTo(baseCount + 1); // no change in count + MUser row = selectObjectByOid(QUser.class, userType.getOid()); + assertThat(row.fullNameOrig).isEqualTo("Overwritten User"); + + and("provided version for overwrite is ignored"); + assertThat(row.version).isEqualTo(2); + } + + @Test + public void test106AddWithOverwriteOptionWithNewOidActsLikeNormalAdd() + throws ObjectAlreadyExistsException, SchemaException { + OperationResult result = createOperationResult(); + + given("user with random OID is not in the repository"); + long baseCount = count(QUser.class); + UUID oid = UUID.randomUUID(); + assertThat(selectNullableObjectByOid(QUser.class, oid)).isNull(); + + when("adding it to the repository again with overwrite option"); + String userName = "user" + getTestNumber(); + UserType userType = new UserType(prismContext) + .oid(oid.toString()) + .name(userName) + .version("5"); + repositoryService.addObject(userType.asPrismObject(), createOverwrite(), result); + + then("operation is successful"); + assertThatOperationResult(result).isSuccess(); + + and("existing user row is modified/overwritten"); + assertThat(count(QUser.class)).isEqualTo(baseCount + 1); // no change in count + MUser row = selectObjectByOid(QUser.class, userType.getOid()); + + and("provided version for overwrite is ignored"); + assertThat(row.version).isEqualTo(1); + } + @Test public void test110AddUserWithProvidedOidWorksOk() throws ObjectAlreadyExistsException, SchemaException { @@ -1258,7 +1318,26 @@ public void test911DeleteUserUsingFocusWorksOk() throws Exception { } @Test - public void test920DeleteAllOtherObjects() throws Exception { + public void test920DeleteOperationUpdatesPerformanceMonitor() + throws ObjectNotFoundException { + OperationResult result = createOperationResult(); + + given("object to delete and cleared performance information"); + UUID userOid = randomExistingOid(QUser.class); + SqlPerformanceMonitorImpl pm = repositoryService.getPerformanceMonitor(); + pm.clearGlobalPerformanceInformation(); + assertThat(pm.getGlobalPerformanceInformation().getAllData()).isEmpty(); + + when("object is deleted from the repository"); + repositoryService.deleteObject(FocusType.class, userOid.toString(), result); + + then("performance monitor is updated"); + assertThatOperationResult(result).isSuccess(); + assertSingleOperationRecorded(pm, RepositoryService.OP_DELETE_OBJECT); + } + + @Test + public void test999DeleteAllOtherObjects() throws Exception { // this doesn't follow given-when-then, sorry OperationResult result = createOperationResult();