Skip to content

Commit

Permalink
Sqale: Added mapping and table for assignment/valueMetadata
Browse files Browse the repository at this point in the history
  • Loading branch information
tonydamage committed Apr 23, 2024
1 parent 64e7c3d commit add45ae
Show file tree
Hide file tree
Showing 18 changed files with 599 additions and 21 deletions.
50 changes: 50 additions & 0 deletions config/sql/native/postgres-upgrade.sql
Original file line number Diff line number Diff line change
Expand Up @@ -528,6 +528,56 @@ call apply_change(31, $aa$
ALTER TYPE ShadowKindType ADD VALUE IF NOT EXISTS 'ASSOCIATED' AFTER 'GENERIC';
$aa$);


-- value metatada for assignments and inducements
call apply_change(32, $aa$
ALTER TYPE ContainerType ADD VALUE IF NOT EXISTS 'ASSIGNMENT_METADATA' AFTER 'ASSIGNMENT';
$aa$);

call apply_change(33, $aa$
CREATE TABLE m_assignment_metadata (
ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE,
ownerType ObjectType,
assignmentCid INTEGER NOT NULL,
containerType ContainerType GENERATED ALWAYS AS ('ASSIGNMENT_METADATA') STORED
CHECK (containerType = 'ASSIGNMENT_METADATA'),

-- Storage metadata
creatorRefTargetOid UUID,
creatorRefTargetType ObjectType,
creatorRefRelationId INTEGER REFERENCES m_uri(id),
createChannelId INTEGER REFERENCES m_uri(id),
createTimestamp TIMESTAMPTZ,
modifierRefTargetOid UUID,
modifierRefTargetType ObjectType,
modifierRefRelationId INTEGER REFERENCES m_uri(id),
modifyChannelId INTEGER REFERENCES m_uri(id),
modifyTimestamp TIMESTAMPTZ,

PRIMARY KEY (ownerOid, cid)
) INHERITS(m_container);

CREATE INDEX m_assignment_metadata_createTimestamp_idx ON m_assignment (createTimestamp);
CREATE INDEX m_assignment_metadata_modifyTimestamp_idx ON m_assignment (modifyTimestamp);

ALTER TABLE m_assignment_ref_create_approver ADD COLUMN metadataCid INTEGER;

-- Primary key should also consider metadata

ALTER TABLE "m_assignment_ref_create_approver" DROP CONSTRAINT "m_assignment_ref_create_approver_pkey";

ALTER TABLE "m_assignment_ref_create_approver" ADD CONSTRAINT "m_assignment_ref_create_approver_pkey"
UNIQUE ("owneroid", "assignmentcid", "metadatacid", "referencetype", "relationid", "targetoid");


ALTER TABLE m_assignment_ref_modify_approver ADD COLUMN metadataCid INTEGER;

ALTER TABLE "m_assignment_ref_modify_approver" DROP CONSTRAINT "m_assignment_ref_modify_approver_pkey";

ALTER TABLE "m_assignment_ref_modify_approver" ADD CONSTRAINT "m_assignment_ref_modify_approver_pkey"
UNIQUE ("owneroid", "assignmentcid", "metadatacid", "referencetype", "relationid", "targetoid");

$aa$);
---
-- WRITE CHANGES ABOVE ^^
-- IMPORTANT: update apply_change number at the end of postgres-new.sql
Expand Down
48 changes: 41 additions & 7 deletions config/sql/native/postgres.sql
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ CREATE TYPE ContainerType AS ENUM (
'ACCESS_CERTIFICATION_WORK_ITEM',
'AFFECTED_OBJECTS',
'ASSIGNMENT',
'ASSIGNMENT_METADATA',
'CASE_WORK_ITEM',
'FOCUS_IDENTITY',
'INDUCEMENT',
Expand Down Expand Up @@ -1951,6 +1952,34 @@ CREATE TABLE m_assignment (
PRIMARY KEY (ownerOid, cid)
);

-- Assignment metadata

CREATE TABLE m_assignment_metadata (
ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE,
ownerType ObjectType,
assignmentCid INTEGER NOT NULL,
containerType ContainerType GENERATED ALWAYS AS ('ASSIGNMENT_METADATA') STORED
CHECK (containerType = 'ASSIGNMENT_METADATA'),

-- Storage metadata
creatorRefTargetOid UUID,
creatorRefTargetType ObjectType,
creatorRefRelationId INTEGER REFERENCES m_uri(id),
createChannelId INTEGER REFERENCES m_uri(id),
createTimestamp TIMESTAMPTZ,
modifierRefTargetOid UUID,
modifierRefTargetType ObjectType,
modifierRefRelationId INTEGER REFERENCES m_uri(id),
modifyChannelId INTEGER REFERENCES m_uri(id),
modifyTimestamp TIMESTAMPTZ,

PRIMARY KEY (ownerOid, cid)
) INHERITS(m_container);

CREATE INDEX m_assignment_metadata_createTimestamp_idx ON m_assignment (createTimestamp);
CREATE INDEX m_assignment_metadata_modifyTimestamp_idx ON m_assignment (modifyTimestamp);


CREATE INDEX m_assignment_policySituation_idx
ON m_assignment USING gin(policysituations gin__int_ops);
CREATE INDEX m_assignment_subtypes_idx ON m_assignment USING gin(subtypes);
Expand All @@ -1972,17 +2001,20 @@ CREATE INDEX m_assignment_modifyTimestamp_idx ON m_assignment (modifyTimestamp);
CREATE TABLE m_assignment_ref_create_approver (
ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE,
assignmentCid INTEGER NOT NULL,
metadataCid INTEGER,
referenceType ReferenceType GENERATED ALWAYS AS ('ASSIGNMENT_CREATE_APPROVER') STORED
CHECK (referenceType = 'ASSIGNMENT_CREATE_APPROVER'),

PRIMARY KEY (ownerOid, assignmentCid, referenceType, relationId, targetOid)
CHECK (referenceType = 'ASSIGNMENT_CREATE_APPROVER')
)
INHERITS (m_reference);

-- indexed by first two PK columns
ALTER TABLE m_assignment_ref_create_approver ADD CONSTRAINT m_assignment_ref_create_approver_id_fk
FOREIGN KEY (ownerOid, assignmentCid) REFERENCES m_assignment (ownerOid, cid)
ON DELETE CASCADE;
-- table does not have primary key since metadataCid == null are original values in metadata containar
-- and metadataCid != null are value metadata references
ALTER TABLE "m_assignment_ref_create_approver" ADD CONSTRAINT "m_assignment_ref_create_approver_pkey"
UNIQUE ("owneroid", "assignmentcid", "metadatacid", "referencetype", "relationid", "targetoid");

CREATE INDEX m_assignment_ref_create_approver_targetOidRelationId_idx
ON m_assignment_ref_create_approver (targetOid, relationId);
Expand All @@ -1991,10 +2023,9 @@ CREATE INDEX m_assignment_ref_create_approver_targetOidRelationId_idx
CREATE TABLE m_assignment_ref_modify_approver (
ownerOid UUID NOT NULL REFERENCES m_object_oid(oid) ON DELETE CASCADE,
assignmentCid INTEGER NOT NULL,
metadataCid INTEGER,
referenceType ReferenceType GENERATED ALWAYS AS ('ASSIGNMENT_MODIFY_APPROVER') STORED
CHECK (referenceType = 'ASSIGNMENT_MODIFY_APPROVER'),

PRIMARY KEY (ownerOid, assignmentCid, referenceType, relationId, targetOid)
CHECK (referenceType = 'ASSIGNMENT_MODIFY_APPROVER')
)
INHERITS (m_reference);

Expand All @@ -2003,6 +2034,9 @@ ALTER TABLE m_assignment_ref_modify_approver ADD CONSTRAINT m_assignment_ref_mod
FOREIGN KEY (ownerOid, assignmentCid) REFERENCES m_assignment (ownerOid, cid)
ON DELETE CASCADE;

ALTER TABLE "m_assignment_ref_modify_approver" ADD CONSTRAINT "m_assignment_ref_modify_approver_pkey"
UNIQUE ("owneroid", "assignmentcid", "metadatacid", "referencetype", "relationid", "targetoid");

CREATE INDEX m_assignment_ref_modify_approver_targetOidRelationId_idx
ON m_assignment_ref_modify_approver (targetOid, relationId);
-- endregion
Expand Down Expand Up @@ -2271,4 +2305,4 @@ END $$;
-- This is important to avoid applying any change more than once.
-- Also update SqaleUtils.CURRENT_SCHEMA_CHANGE_NUMBER
-- repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleUtils.java
call apply_change(31, $$ SELECT 1 $$, true);
call apply_change(33, $$ SELECT 1 $$, true);
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ private void processContainerValue(PrismContainerValue<?> val, Set<Long> usedIds
} else {
pcvsWithoutId.add(val);
}
checkExistingContainers(val.getValueMetadataAsContainer());
}

/** Generates container IDs for {@link #pcvsWithoutId} and clears the list. */
Expand Down
2 changes: 1 addition & 1 deletion release-notes.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ For more information see xref:/midpoint/reference//security/credentials/secrets-

* Query Support for searching in value metadata of objects
** Native Repository: Object metadata stored in `metadata` property of `MetadataType` are also indexed and searchable as value metadata. Eg. original `metadata/creatorRef` is `@metadata/storage/creatorRef` as value metadata path.

** Value metadata `storage` and `process` are indexed for assignments and available for search using `assignment/@metadata/storage`.
* Ninja
** Added support for new verification categories: `MULTI_VALUE_REF_WITHOUT_OID`, `MISSING_NATURAL_KEY`, `MULTIVALUE_BYTE_ARRAY`, `PROTECTED_DATA_NOT_EXTERNAL`.
For more information see xref:/midpoint/reference/deployment/ninja/command/verify.adoc[].
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public class SqaleUtils {
*/
public static final String SCHEMA_AUDIT_CHANGE_NUMBER = "schemaAuditChangeNumber";

public static final int CURRENT_SCHEMA_CHANGE_NUMBER = 31;
public static final int CURRENT_SCHEMA_CHANGE_NUMBER = 33;

public static final int CURRENT_SCHEMA_AUDIT_CHANGE_NUMBER = 9;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@
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.BooleanExpression;

/**
* Querydsl "row bean" type related to {@link QAssignment}.
*/
public class MAssignment extends MContainerWithFullObject {
public class MAssignment extends MContainerWithFullObject implements MAssignmentReference.Owner {

public MObjectType ownerType;
public String lifecycleState;
Expand Down Expand Up @@ -63,4 +65,10 @@ public class MAssignment extends MContainerWithFullObject {
public Integer modifyChannelId;
public Instant modifyTimestamp;

@Override
public BooleanExpression owns(QAssignmentReference ref) {
return ref.ownerOid.eq(ownerOid)
.and(ref.assignmentCid.eq(cid))
.and(ref.metadataCid.isNull());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.evolveum.midpoint.repo.sqale.qmodel.assignment;

import com.evolveum.midpoint.repo.sqale.qmodel.metadata.MValueMetadata;

import com.evolveum.midpoint.repo.sqale.qmodel.object.MObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

import com.querydsl.core.types.dsl.BooleanExpression;

public class MAssignmentMetadata extends MValueMetadata implements MAssignmentReference.Owner {

public MObjectType ownerType;
public Long assignmentCid;

@Override
public BooleanExpression owns(QAssignmentReference ref) {
return ref.ownerOid.eq(ownerOid)
.and(ref.assignmentCid.eq(assignmentCid))
.and(ref.metadataCid.eq(cid));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,15 @@

import com.evolveum.midpoint.repo.sqale.qmodel.ref.MReference;

import com.querydsl.core.types.dsl.BooleanExpression;

/**
* Querydsl "row bean" type related to {@link QAssignmentReference}.
*/
public class MAssignmentReference extends MReference {

public Long assignmentCid;
public Long metadataCid;

@Override
public String toString() {
Expand All @@ -26,4 +29,14 @@ public String toString() {
", relationId=" + relationId +
'}';
}

interface Owner {

/**
* Returns condition for owning reference
* @param ref
* @return
*/
BooleanExpression owns(QAssignmentReference ref);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import com.evolveum.midpoint.prism.PrismContainer;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.path.InfraItemName;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainerWithFullObjectMapping;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
Expand Down Expand Up @@ -194,6 +195,11 @@ private QAssignmentMapping(
.addRefMapping(MetadataType.F_MODIFY_APPROVER_REF,
QAssignmentReferenceMapping.initForAssignmentModifyApprover(
repositoryContext));
addContainerTableMapping(InfraItemName.METADATA,
QAssignmentMetadataMapping.init(repositoryContext),
joinOn((o, m) ->
o.ownerOid.eq(m.ownerOid).and(o.cid.eq(m.assignmentCid))
));
}

@Override
Expand Down Expand Up @@ -358,6 +364,13 @@ public MAssignment insert(AssignmentType assignment, OR ownerRow, JdbcSession jd
QAssignmentReferenceMapping.getForAssignmentModifyApprover(), jdbcSession);
}


for(var obj : assignment.asPrismContainerValue().getValueMetadataAsContainer().getRealValues()) {
if (obj instanceof ValueMetadataType valueMetadata) {
QAssignmentMetadataMapping.get().insert(valueMetadata, row, jdbcSession);
}
}

return row;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.evolveum.midpoint.repo.sqale.qmodel.assignment;

import com.evolveum.midpoint.repo.sqale.qmodel.metadata.QValueMetadata;
import com.evolveum.midpoint.repo.sqale.qmodel.metadata.QValueMetadataMapping;

import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.core.types.dsl.NumberPath;
import com.querydsl.sql.ColumnMetadata;

import java.sql.Types;

public class QAssignmentMetadata extends QValueMetadata<MAssignmentMetadata, MAssignment> {

public static final String TABLE_NAME = "m_assignment_metadata";
public static final String ALIAS = "am";

public static final ColumnMetadata ASSIGNMENT_CID =
ColumnMetadata.named("assignmentCid").ofType(Types.BIGINT).notNull();

public final NumberPath<Long> assignmentCid = createLong("assignmentCid", ASSIGNMENT_CID);

public QAssignmentMetadata(String variable) {
super(MAssignmentMetadata.class, variable, DEFAULT_SCHEMA_NAME, TABLE_NAME);
}

@Override
public BooleanExpression isOwnedBy(MAssignment ownerRow) {
return ownerOid.eq(ownerRow.ownerOid)
.and(assignmentCid.eq(ownerRow.cid));
}
}

0 comments on commit add45ae

Please sign in to comment.