Skip to content

Commit

Permalink
repo-sqale: all embedded refs are mapped with new addRefMapping()
Browse files Browse the repository at this point in the history
  • Loading branch information
virgo47 committed Jul 9, 2021
1 parent 243329c commit b3b1f60
Show file tree
Hide file tree
Showing 23 changed files with 198 additions and 84 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ public <TS, TQ extends QObject<TR>, TR extends MObject> EmbeddedReferenceResolve
@NotNull Supplier<QueryTableMapping<TS, TQ, TR>> targetMappingSupplier) {
mapping = new SqaleNestedMapping<>(Referencable.class, queryType);
mapping.addRelationResolver(PrismConstants.T_OBJECT_REFERENCE,
// TODO TableRelationResolver can be configured/subclassed to use LEFT JOIN
// which will allow order by target/name (or other attribute), which is used
// with old repo and in some existing view objects.
// But also order by multi-name item path must be supported as well.
new TableRelationResolver<>(
targetMappingSupplier, (q, t) -> rootToOidPath.apply(q).eq(t.oid)));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,11 @@ default <TS, TQ extends QObject<TR>, TR extends MObject> SqaleMappingMixin<S, Q,
@NotNull Function<Q, EnumPath<MObjectType>> rootToTypePath,
@NotNull Function<Q, NumberPath<Integer>> rootToRelationIdPath,
@NotNull Supplier<QueryTableMapping<TS, TQ, TR>> targetMappingSupplier) {
ItemSqlMapper<Q, R> referenceMapping =
refMapper(rootToOidPath, rootToTypePath, rootToRelationIdPath);
ItemSqlMapper<Q, R> referenceMapping = new SqaleItemSqlMapper<>(
ctx -> new RefItemFilterProcessor(ctx,
rootToOidPath, rootToTypePath, rootToRelationIdPath),
ctx -> new RefItemDeltaProcessor(ctx,
rootToOidPath, rootToTypePath, rootToRelationIdPath));
addItemMapping(itemName, referenceMapping);

// Needed for queries with ref/@/... paths, this resolves the "ref/" part before @
Expand All @@ -105,20 +108,6 @@ default <TS, TQ extends QObject<TR>, TR extends MObject> SqaleMappingMixin<S, Q,
return this;
}

/**
* Returns the mapper creating the reference filter/delta processors from context.
*/
default ItemSqlMapper<Q, R> refMapper(
Function<Q, UuidPath> rootToOidPath,
Function<Q, EnumPath<MObjectType>> rootToTypePath,
Function<Q, NumberPath<Integer>> rootToRelationIdPath) {
return new SqaleItemSqlMapper<>(
ctx -> new RefItemFilterProcessor(ctx,
rootToOidPath, rootToTypePath, rootToRelationIdPath),
ctx -> new RefItemDeltaProcessor(ctx,
rootToOidPath, rootToTypePath, rootToRelationIdPath));
}

/**
* Defines table mapping for multi-value container owned by an object or another container.
* This includes path resolver for queries and delta processor for modifications.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.repo.sqale.SqaleRepoContext;
import com.evolveum.midpoint.repo.sqale.qmodel.focus.QUserMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QAssignmentHolderMapping;
import com.evolveum.midpoint.repo.sqlbase.JdbcSession;
import com.evolveum.midpoint.util.MiscUtil;
Expand Down Expand Up @@ -51,19 +52,21 @@ private QAccessCertificationCampaignMapping(@NotNull SqaleRepoContext repository
AccessCertificationCampaignType.class, QAccessCertificationCampaign.class,
repositoryContext);

addItemMapping(F_DEFINITION_REF, refMapper(
addRefMapping(F_DEFINITION_REF,
q -> q.definitionRefTargetOid,
q -> q.definitionRefTargetType,
q -> q.definitionRefRelationId));
q -> q.definitionRefRelationId,
QAccessCertificationDefinitionMapping::get);
addItemMapping(F_END_TIMESTAMP,
timestampMapper(q -> q.endTimestamp));
addItemMapping(F_HANDLER_URI, uriMapper(q -> q.handlerUriId));
// TODO
// TODO: iteration -> campaignIteration
addItemMapping(F_ITERATION, integerMapper(q -> q.campaignIteration));
addItemMapping(F_OWNER_REF, refMapper(
addRefMapping(F_OWNER_REF,
q -> q.ownerRefTargetOid,
q -> q.ownerRefTargetType,
q -> q.ownerRefRelationId));
q -> q.ownerRefRelationId,
QUserMapping::getUserMapping);
addItemMapping(F_STAGE_NUMBER, integerMapper(q -> q.stageNumber));
addItemMapping(F_START_TIMESTAMP,
timestampMapper(q -> q.startTimestamp));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.repo.sqale.SqaleRepoContext;
import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainerMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.org.QOrgMapping;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.JdbcSession;
import com.evolveum.midpoint.repo.sqlbase.mapping.TableRelationResolver;
Expand Down Expand Up @@ -94,27 +96,31 @@ private QAccessCertificationCaseMapping(@NotNull SqaleRepoContext repositoryCont

// TODO: iteration -> campaignIteration
addItemMapping(F_ITERATION, integerMapper(q -> q.campaignIteration));
addItemMapping(F_OBJECT_REF, refMapper(
addRefMapping(F_OBJECT_REF,
q -> q.objectRefTargetOid,
q -> q.objectRefTargetType,
q -> q.objectRefRelationId));
addItemMapping(F_ORG_REF, refMapper(
q -> q.objectRefRelationId,
QObjectMapping::getObjectMapping);
addRefMapping(F_ORG_REF,
q -> q.orgRefTargetOid,
q -> q.orgRefTargetType,
q -> q.orgRefRelationId));
q -> q.orgRefRelationId,
QOrgMapping::getOrgMapping);
addItemMapping(F_OUTCOME, stringMapper(q -> q.outcome));
addItemMapping(F_REMEDIED_TIMESTAMP, timestampMapper(q -> q.remediedTimestamp));
addItemMapping(F_CURRENT_STAGE_DEADLINE, timestampMapper(q -> q.currentStageCreateTimestamp));
addItemMapping(F_CURRENT_STAGE_CREATE_TIMESTAMP, timestampMapper(q -> q.currentStageCreateTimestamp));
addItemMapping(F_STAGE_NUMBER, integerMapper(q -> q.stageNumber));
addItemMapping(F_TARGET_REF, refMapper(
addRefMapping(F_TARGET_REF,
q -> q.targetRefTargetOid,
q -> q.targetRefTargetType,
q -> q.targetRefRelationId));
addItemMapping(F_TENANT_REF, refMapper(
q -> q.targetRefRelationId,
QObjectMapping::getObjectMapping);
addRefMapping(F_TENANT_REF,
q -> q.tenantRefTargetOid,
q -> q.tenantRefTargetType,
q -> q.tenantRefRelationId));
q -> q.tenantRefRelationId,
QOrgMapping::getOrgMapping);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@

import static com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractAccessCertificationDefinitionType.*;

import java.util.Objects;

import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.repo.sqale.SqaleRepoContext;
import com.evolveum.midpoint.repo.sqale.qmodel.focus.QUserMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QAssignmentHolderMapping;
import com.evolveum.midpoint.repo.sqlbase.JdbcSession;
import com.evolveum.midpoint.util.MiscUtil;
Expand All @@ -26,9 +29,20 @@ public class QAccessCertificationDefinitionMapping

public static final String DEFAULT_ALIAS_NAME = "acd";

private static QAccessCertificationDefinitionMapping instance;

// Explanation in class Javadoc for SqaleTableMapping
public static QAccessCertificationDefinitionMapping init(
@NotNull SqaleRepoContext repositoryContext) {
return new QAccessCertificationDefinitionMapping(repositoryContext);
if (instance == null) {
instance = new QAccessCertificationDefinitionMapping(repositoryContext);
}
return instance;
}

// Explanation in class Javadoc for SqaleTableMapping
public static QAccessCertificationDefinitionMapping get() {
return Objects.requireNonNull(instance);
}

private QAccessCertificationDefinitionMapping(@NotNull SqaleRepoContext repositoryContext) {
Expand All @@ -41,10 +55,11 @@ private QAccessCertificationDefinitionMapping(@NotNull SqaleRepoContext reposito
timestampMapper(q -> q.lastCampaignStartedTimestamp));
addItemMapping(F_LAST_CAMPAIGN_CLOSED_TIMESTAMP,
timestampMapper(q -> q.lastCampaignClosedTimestamp));
addItemMapping(F_OWNER_REF, refMapper(
addRefMapping(F_OWNER_REF,
q -> q.ownerRefTargetOid,
q -> q.ownerRefTargetType,
q -> q.ownerRefRelationId));
q -> q.ownerRefRelationId,
QUserMapping::getUserMapping);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.repo.sqale.SqaleRepoContext;
import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainerMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.focus.QUserMapping;
import com.evolveum.midpoint.repo.sqlbase.JdbcSession;
import com.evolveum.midpoint.repo.sqlbase.mapping.TableRelationResolver;
import com.evolveum.midpoint.util.MiscUtil;
Expand Down Expand Up @@ -61,15 +62,18 @@ private QAccessCertificationWorkItemMapping(@NotNull SqaleRepoContext repository
addNestedMapping(F_OUTPUT, AbstractWorkItemOutputType.class)
.addItemMapping(AbstractWorkItemOutputType.F_OUTCOME, stringMapper(q -> q.outcome));
addItemMapping(F_OUTPUT_CHANGE_TIMESTAMP, timestampMapper(q -> q.outputChangeTimestamp));
addItemMapping(F_PERFORMER_REF, refMapper(
addRefMapping(F_PERFORMER_REF,
q -> q.performerRefTargetOid,
q -> q.performerRefTargetType,
q -> q.performerRefRelationId));
q -> q.performerRefRelationId,
QUserMapping::getUserMapping);

addRefMapping(F_ASSIGNEE_REF,
QAccessCertificationWorkItemReferenceMapping.initForCaseWorkItemAssignee(repositoryContext));
QAccessCertificationWorkItemReferenceMapping
.initForCaseWorkItemAssignee(repositoryContext));
addRefMapping(F_CANDIDATE_REF,
QAccessCertificationWorkItemReferenceMapping.initForCaseWorkItemCandidate(repositoryContext));
QAccessCertificationWorkItemReferenceMapping
.initForCaseWorkItemCandidate(repositoryContext));

addItemMapping(F_STAGE_NUMBER, integerMapper(q -> q.stageNumber));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,11 @@
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.ext.MExtItemHolderType;
import com.evolveum.midpoint.repo.sqale.qmodel.focus.QUserMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QAssignmentHolderMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.org.QOrgMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.resource.QResourceMapping;
import com.evolveum.midpoint.repo.sqlbase.JdbcSession;
import com.evolveum.midpoint.repo.sqlbase.mapping.TableRelationResolver;
import com.evolveum.midpoint.util.MiscUtil;
Expand Down Expand Up @@ -102,27 +105,31 @@ private QAssignmentMapping(
// But this will likely require special treatment/heuristic.
addItemMapping(F_LIFECYCLE_STATE, stringMapper(q -> q.lifecycleState));
addItemMapping(F_ORDER, integerMapper(q -> q.orderValue));
addItemMapping(F_ORG_REF, refMapper(
addRefMapping(F_ORG_REF,
q -> q.orgRefTargetOid,
q -> q.orgRefTargetType,
q -> q.orgRefRelationId));
addItemMapping(F_TARGET_REF, refMapper(
q -> q.orgRefRelationId,
QOrgMapping::getOrgMapping);
addRefMapping(F_TARGET_REF,
q -> q.targetRefTargetOid,
q -> q.targetRefTargetType,
q -> q.targetRefRelationId));
addItemMapping(F_TENANT_REF, refMapper(
q -> q.targetRefRelationId,
QAssignmentHolderMapping::getAssignmentHolderMapping);
addRefMapping(F_TENANT_REF,
q -> q.tenantRefTargetOid,
q -> q.tenantRefTargetType,
q -> q.tenantRefRelationId));
q -> q.tenantRefRelationId,
QOrgMapping::getOrgMapping);
addItemMapping(F_POLICY_SITUATION, multiUriMapper(q -> q.policySituations));

// TODO no idea how extId/Oid works, see RAssignment.getExtension
addExtensionMapping(F_EXTENSION, MExtItemHolderType.EXTENSION, q -> q.ext);
addNestedMapping(F_CONSTRUCTION, ConstructionType.class)
.addItemMapping(ConstructionType.F_RESOURCE_REF, refMapper(
.addRefMapping(ConstructionType.F_RESOURCE_REF,
q -> q.resourceRefTargetOid,
q -> q.resourceRefTargetType,
q -> q.resourceRefRelationId));
q -> q.resourceRefRelationId,
QResourceMapping::get);
addNestedMapping(F_ACTIVATION, ActivationType.class)
.addItemMapping(ActivationType.F_ADMINISTRATIVE_STATUS,
enumMapper(q -> q.administrativeStatus))
Expand All @@ -145,18 +152,20 @@ private QAssignmentMapping(
.addItemMapping(ActivationType.F_ARCHIVE_TIMESTAMP,
timestampMapper(q -> q.archiveTimestamp));
addNestedMapping(F_METADATA, MetadataType.class)
.addItemMapping(MetadataType.F_CREATOR_REF, refMapper(
.addRefMapping(MetadataType.F_CREATOR_REF,
q -> q.creatorRefTargetOid,
q -> q.creatorRefTargetType,
q -> q.creatorRefRelationId))
q -> q.creatorRefRelationId,
QUserMapping::getUserMapping)
.addItemMapping(MetadataType.F_CREATE_CHANNEL,
uriMapper(q -> q.createChannelId))
.addItemMapping(MetadataType.F_CREATE_TIMESTAMP,
timestampMapper(q -> q.createTimestamp))
.addItemMapping(MetadataType.F_MODIFIER_REF, refMapper(
.addRefMapping(MetadataType.F_MODIFIER_REF,
q -> q.modifierRefTargetOid,
q -> q.modifierRefTargetType,
q -> q.modifierRefRelationId))
q -> q.modifierRefRelationId,
QUserMapping::getUserMapping)
.addItemMapping(MetadataType.F_MODIFY_CHANNEL,
uriMapper(q -> q.modifyChannelId))
.addItemMapping(MetadataType.F_MODIFY_TIMESTAMP,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel.cases;

import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType.F_OBJECT_REF;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType.F_TARGET_REF;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType.*;

import java.util.List;
Expand All @@ -15,7 +17,9 @@

import com.evolveum.midpoint.repo.sqale.SqaleRepoContext;
import com.evolveum.midpoint.repo.sqale.qmodel.cases.workitem.QCaseWorkItemMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.focus.QUserMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QAssignmentHolderMapping;
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.util.exception.SchemaException;
Expand Down Expand Up @@ -50,22 +54,26 @@ private QCaseMapping(@NotNull SqaleRepoContext repositoryContext) {

addItemMapping(F_STATE, stringMapper(q -> q.state));
addItemMapping(F_CLOSE_TIMESTAMP, timestampMapper(q -> q.closeTimestamp));
addItemMapping(F_OBJECT_REF, refMapper(
addRefMapping(F_OBJECT_REF,
q -> q.objectRefTargetOid,
q -> q.objectRefTargetType,
q -> q.objectRefRelationId));
addItemMapping(F_PARENT_REF, refMapper(
q -> q.objectRefRelationId,
QObjectMapping::getObjectMapping);
addRefMapping(F_PARENT_REF,
q -> q.parentRefTargetOid,
q -> q.parentRefTargetType,
q -> q.parentRefRelationId));
addItemMapping(F_REQUESTOR_REF, refMapper(
q -> q.parentRefRelationId,
QCaseMapping::getCaseMapping);
addRefMapping(F_REQUESTOR_REF,
q -> q.requestorRefTargetOid,
q -> q.requestorRefTargetType,
q -> q.requestorRefRelationId));
addItemMapping(F_TARGET_REF, refMapper(
q -> q.requestorRefRelationId,
QUserMapping::getUserMapping);
addRefMapping(F_TARGET_REF,
q -> q.targetRefTargetOid,
q -> q.targetRefTargetType,
q -> q.targetRefRelationId));
q -> q.targetRefRelationId,
QObjectMapping::getObjectMapping);

addContainerTableMapping(F_WORK_ITEM,
QCaseWorkItemMapping.initCaseWorkItemMapping(repositoryContext),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.evolveum.midpoint.repo.sqale.qmodel.cases.MCase;
import com.evolveum.midpoint.repo.sqale.qmodel.cases.QCaseMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainerMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.focus.QUserMapping;
import com.evolveum.midpoint.repo.sqlbase.JdbcSession;
import com.evolveum.midpoint.repo.sqlbase.mapping.TableRelationResolver;
import com.evolveum.midpoint.util.MiscUtil;
Expand Down Expand Up @@ -62,18 +63,20 @@ private QCaseWorkItemMapping(@NotNull SqaleRepoContext repositoryContext) {
addItemMapping(F_CREATE_TIMESTAMP, timestampMapper(q -> q.createTimestamp));
addItemMapping(F_DEADLINE, timestampMapper(q -> q.deadline));

addItemMapping(F_ORIGINAL_ASSIGNEE_REF, refMapper(
addRefMapping(F_ORIGINAL_ASSIGNEE_REF,
q -> q.originalAssigneeRefTargetOid,
q -> q.originalAssigneeRefTargetType,
q -> q.originalAssigneeRefRelationId));
q -> q.originalAssigneeRefRelationId,
QUserMapping::getUserMapping);

addNestedMapping(F_OUTPUT, AbstractWorkItemOutputType.class)
.addItemMapping(AbstractWorkItemOutputType.F_OUTCOME, stringMapper(q -> q.outcome));

addItemMapping(F_PERFORMER_REF, refMapper(
addRefMapping(F_PERFORMER_REF,
q -> q.performerRefTargetOid,
q -> q.performerRefTargetType,
q -> q.performerRefRelationId));
q -> q.performerRefRelationId,
QUserMapping::getUserMapping);

addRefMapping(F_ASSIGNEE_REF,
QCaseWorkItemReferenceMapping.initForCaseWorkItemAssignee(repositoryContext));
Expand Down

0 comments on commit b3b1f60

Please sign in to comment.