Skip to content

Commit

Permalink
repo-sqale: SqaleModelMapping->STableM, added SqaleNestedMapping
Browse files Browse the repository at this point in the history
  • Loading branch information
virgo47 committed Mar 9, 2021
1 parent faf9ea4 commit 81188b4
Show file tree
Hide file tree
Showing 11 changed files with 142 additions and 80 deletions.
Expand Up @@ -8,7 +8,7 @@

import com.querydsl.sql.SQLQuery;

import com.evolveum.midpoint.repo.sqale.qmodel.SqaleModelMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTableMapping;
import com.evolveum.midpoint.repo.sqlbase.SqlQueryContext;
import com.evolveum.midpoint.repo.sqlbase.SqlRepoContext;
import com.evolveum.midpoint.repo.sqlbase.SqlTransformerContext;
Expand All @@ -22,7 +22,7 @@ public class SqaleQueryContext<S, Q extends FlexibleRelationalPathBase<R>, R>
public static <S, Q extends FlexibleRelationalPathBase<R>, R> SqaleQueryContext<S, Q, R> from(
Class<S> schemaType, SqlTransformerContext transformerContext, SqlRepoContext sqlRepoContext) {

SqaleModelMapping<S, Q, R> rootMapping = sqlRepoContext.getMappingBySchemaType(schemaType);
SqaleTableMapping<S, Q, R> rootMapping = sqlRepoContext.getMappingBySchemaType(schemaType);
Q rootPath = rootMapping.defaultAlias();
SQLQuery<?> query = sqlRepoContext.newQuery().from(rootPath);
// Turns on validations of aliases, does not ignore duplicate JOIN expressions,
Expand All @@ -34,7 +34,7 @@ public static <S, Q extends FlexibleRelationalPathBase<R>, R> SqaleQueryContext<

private SqaleQueryContext(
Q entityPath,
SqaleModelMapping<S, Q, R> mapping,
SqaleTableMapping<S, Q, R> mapping,
SqlTransformerContext transformerContext,
SqlRepoContext sqlRepoContext,
SQLQuery<?> query) {
Expand All @@ -55,7 +55,7 @@ protected SqlTransformer<S, Q, R> createTransformer() {
protected <DQ extends FlexibleRelationalPathBase<DR>, DR> SqlQueryContext<?, DQ, DR>
deriveNew(DQ newPath, QueryTableMapping<?, DQ, DR> newMapping) {
return (SqlQueryContext<?, DQ, DR>) new SqaleQueryContext(
newPath, (SqaleModelMapping<?, ?, ?>) newMapping,
newPath, (SqaleTableMapping<?, ?, ?>) newMapping,
transformerContext, sqlRepoContext, sqlQuery);
}
}
Expand Up @@ -32,7 +32,7 @@
import com.evolveum.midpoint.repo.api.perf.PerformanceMonitor;
import com.evolveum.midpoint.repo.api.query.ObjectFilterExpressionEvaluator;
import com.evolveum.midpoint.repo.sqale.operations.AddObjectOperation;
import com.evolveum.midpoint.repo.sqale.qmodel.SqaleModelMapping;
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.ObjectSqlTransformer;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QObject;
Expand Down Expand Up @@ -164,7 +164,7 @@ private <S extends ObjectType, Q extends QObject<R>, R extends MObject> S readBy

// context.processOptions(options); TODO how to process option, is setting of select expressions enough?

SqaleModelMapping<S, Q, R> rootMapping =
SqaleTableMapping<S, Q, R> rootMapping =
sqlRepoContext.getMappingBySchemaType(schemaType);
final Q root = rootMapping.defaultAlias();

Expand Down Expand Up @@ -197,7 +197,7 @@ private <S extends ObjectType, Q extends QObject<R>, R extends MObject> S readBy

// context.processOptions(options); TODO how to process option, is setting of select expressions enough?

SqaleModelMapping<S, Q, R> rootMapping =
SqaleTableMapping<S, Q, R> rootMapping =
sqlRepoContext.getMappingBySchemaType(schemaType);
final Q root = rootMapping.defaultAlias();

Expand Down Expand Up @@ -439,7 +439,7 @@ void modifyObjectAttempt(
EquivalenceStrategy.REAL_VALUE_CONSIDER_DIFFERENT_IDS, true);
LOGGER.trace("Narrowed modifications:\n{}", DebugUtil.debugDumpLazily(narrowedModifications));

SqaleModelMapping<S, Q, R> rootMapping =
SqaleTableMapping<S, Q, R> rootMapping =
sqlRepoContext.getMappingBySchemaType(prismObject.getCompileTimeClass());
Q root = rootMapping.defaultAlias();
// TODO update will probably be replaced by some "update context" to be able to update multiple tables (+insert/delete of details)
Expand Down
Expand Up @@ -18,7 +18,7 @@
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.repo.api.RepoAddOptions;
import com.evolveum.midpoint.repo.sqale.SqaleTransformerContext;
import com.evolveum.midpoint.repo.sqale.qmodel.SqaleModelMapping;
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.ObjectSqlTransformer;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QObject;
Expand Down Expand Up @@ -52,7 +52,8 @@ public String execute(SqaleTransformerContext transformerContext)
try {
// TODO utilize options and result
sqlRepoContext = transformerContext.sqlRepoContext();
SqaleModelMapping<S, Q, R> rootMapping = sqlRepoContext.getMappingBySchemaType(object.getCompileTimeClass());
SqaleTableMapping<S, Q, R> rootMapping =
sqlRepoContext.getMappingBySchemaType(object.getCompileTimeClass());
root = rootMapping.defaultAlias();
transformer = (ObjectSqlTransformer<S, Q, R>)
rootMapping.createTransformer(transformerContext);
Expand Down

This file was deleted.

@@ -0,0 +1,58 @@
/*
* 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;

import javax.xml.namespace.QName;

import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.repo.sqale.RefTableItemFilterProcessor;
import com.evolveum.midpoint.repo.sqale.qmodel.ref.QReferenceMapping;
import com.evolveum.midpoint.repo.sqlbase.mapping.QueryModelMapping;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.ItemSqlMapper;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.NestedMappingResolver;
import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;

/**
* Sqale implementation for nested mapping with support for sqale specific types.
* This allows for fluent calls of methods like {@link #addRefMapping(QName, QReferenceMapping)}
* which depend on sqale-specific types like {@link QReferenceMapping} in this example.
*/
public class SqaleNestedMapping<S, Q extends FlexibleRelationalPathBase<R>, R>
extends QueryModelMapping<S, Q, R> {

protected SqaleNestedMapping(@NotNull Class<S> schemaType, @NotNull Class<Q> queryType) {
super(schemaType, queryType);
}

@Override
public SqaleNestedMapping<S, Q, R> addItemMapping(
@NotNull QName itemName, @NotNull ItemSqlMapper itemMapper) {
super.addItemMapping(itemName, itemMapper);
return this;
}

// TODO will the version for RefItemFilterProcessor be useful too? Yes, if it needs relation mapping too!
public final SqaleNestedMapping<S, Q, R> addRefMapping(
@NotNull QName itemName, @NotNull QReferenceMapping qReferenceMapping) {
((QueryModelMapping<?, ?, ?>) this).addItemMapping(itemName,
RefTableItemFilterProcessor.mapper(qReferenceMapping));
// TODO add relation mapping too
return this;
}

/** Nested mapping adaptation for repo-sqale. */
@Override
public <N> SqaleNestedMapping<N, Q, R> nestedMapping(
@NotNull ItemName itemName, @NotNull Class<N> nestedSchemaType) {
SqaleNestedMapping<N, Q, R> nestedMapping =
new SqaleNestedMapping<>(nestedSchemaType, queryType());
addRelationResolver(itemName, new NestedMappingResolver<>(nestedMapping));
return nestedMapping;
}
}
@@ -0,0 +1,56 @@
/*
* 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;

import javax.xml.namespace.QName;

import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.repo.sqale.RefTableItemFilterProcessor;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QObject;
import com.evolveum.midpoint.repo.sqale.qmodel.ref.QReferenceMapping;
import com.evolveum.midpoint.repo.sqlbase.mapping.QueryModelMapping;
import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.NestedMappingResolver;
import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;

/**
* Mapping superclass with common functions for {@link QObject} and non-objects (e.g. containers).
*
* @see QueryTableMapping
*/
public abstract class SqaleTableMapping<S, Q extends FlexibleRelationalPathBase<R>, R>
extends QueryTableMapping<S, Q, R> {

protected SqaleTableMapping(
@NotNull String tableName,
@NotNull String defaultAliasName,
@NotNull Class<S> schemaType,
@NotNull Class<Q> queryType) {
super(tableName, defaultAliasName, schemaType, queryType);
}

/** Nested mapping adaptation for repo-sqale. */
@Override
public <N> SqaleNestedMapping<N, Q, R> nestedMapping(
@NotNull ItemName itemName, @NotNull Class<N> nestedSchemaType) {
SqaleNestedMapping<N, Q, R> nestedMapping =
new SqaleNestedMapping<>(nestedSchemaType, queryType());
addRelationResolver(itemName, new NestedMappingResolver<>(nestedMapping));
return nestedMapping;
}

// TODO will the version for RefItemFilterProcessor be useful too?
// Yes, if it needs relation mapping too!
public final void addRefMapping(
@NotNull QName itemName, @NotNull QReferenceMapping qReferenceMapping) {
((QueryModelMapping<?, ?, ?>) this).addItemMapping(itemName,
RefTableItemFilterProcessor.mapper(qReferenceMapping));
// TODO add relation mapping too
}
}
Expand Up @@ -9,13 +9,13 @@
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.repo.sqale.qmodel.SqaleModelMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTableMapping;

/**
* Mapping between {@link QContainer} and {@link Containerable}.
*/
public class QContainerMapping<S extends Containerable, Q extends QContainer<R>, R extends MContainer>
extends SqaleModelMapping<S, Q, R> {
extends SqaleTableMapping<S, Q, R> {

public static final String DEFAULT_ALIAS_NAME = "c";

Expand Down
Expand Up @@ -9,7 +9,7 @@
import static com.evolveum.midpoint.repo.sqlbase.mapping.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType.*;

import com.evolveum.midpoint.repo.sqale.qmodel.SqaleModelMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTableMapping;
import com.evolveum.midpoint.repo.sqlbase.SqlTransformerContext;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.PolyStringItemFilterProcessor;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.TimestampItemFilterProcessor;
Expand All @@ -19,7 +19,7 @@
* Mapping between {@link QLookupTableRow} and {@link LookupTableRowType}.
*/
public class QLookupTableRowMapping
extends SqaleModelMapping<LookupTableRowType, QLookupTableRow, MLookupTableRow> {
extends SqaleTableMapping<LookupTableRowType, QLookupTableRow, MLookupTableRow> {

public static final String DEFAULT_ALIAS_NAME = "ltr";

Expand Down
Expand Up @@ -13,20 +13,17 @@
import static com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType.*;

import java.util.Collection;
import javax.xml.namespace.QName;

import com.querydsl.core.types.Path;
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.repo.sqale.RefItemFilterProcessor;
import com.evolveum.midpoint.repo.sqale.RefTableItemFilterProcessor;
import com.evolveum.midpoint.repo.sqale.UriItemFilterProcessor;
import com.evolveum.midpoint.repo.sqale.qmodel.SqaleModelMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTableMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.assignment.QAssignment;
import com.evolveum.midpoint.repo.sqale.qmodel.ref.QReferenceMapping;
import com.evolveum.midpoint.repo.sqlbase.SqlTransformerContext;
import com.evolveum.midpoint.repo.sqlbase.mapping.QueryModelMapping;
import com.evolveum.midpoint.repo.sqlbase.mapping.SqlTransformer;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.PolyStringItemFilterProcessor;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.TableRelationResolver;
Expand All @@ -41,7 +38,7 @@
* Mapping between {@link QObject} and {@link ObjectType}.
*/
public class QObjectMapping<S extends ObjectType, Q extends QObject<R>, R extends MObject>
extends SqaleModelMapping<S, Q, R> {
extends SqaleTableMapping<S, Q, R> {

public static final String DEFAULT_ALIAS_NAME = "o";

Expand All @@ -60,7 +57,7 @@ protected QObjectMapping(
addItemMapping(F_NAME,
PolyStringItemFilterProcessor.mapper(
path(q -> q.nameOrig), path(q -> q.nameNorm)));
var metadataMapping = nestedMapping(F_METADATA, MetadataType.class)
nestedMapping(F_METADATA, MetadataType.class)
.addItemMapping(MetadataType.F_CREATOR_REF, RefItemFilterProcessor.mapper(
path(q -> q.creatorRefTargetOid),
path(q -> q.creatorRefTargetType),
Expand All @@ -76,11 +73,11 @@ protected QObjectMapping(
.addItemMapping(MetadataType.F_MODIFY_CHANNEL,
UriItemFilterProcessor.mapper(path(q -> q.modifyChannelId)))
.addItemMapping(MetadataType.F_MODIFY_TIMESTAMP,
TimestampItemFilterProcessor.mapper(path(q -> q.modifyTimestamp)));
addRefMapping(metadataMapping, MetadataType.F_CREATE_APPROVER_REF,
QReferenceMapping.INSTANCE_CREATE_APPROVER);
addRefMapping(metadataMapping, MetadataType.F_MODIFY_APPROVER_REF,
QReferenceMapping.INSTANCE_MODIFY_APPROVER);
TimestampItemFilterProcessor.mapper(path(q -> q.modifyTimestamp)))
.addRefMapping(MetadataType.F_CREATE_APPROVER_REF,
QReferenceMapping.INSTANCE_CREATE_APPROVER)
.addRefMapping(MetadataType.F_MODIFY_APPROVER_REF,
QReferenceMapping.INSTANCE_MODIFY_APPROVER);

addItemMapping(F_TENANT_REF, RefItemFilterProcessor.mapper(
path(q -> q.tenantRefTargetOid),
Expand All @@ -104,26 +101,6 @@ protected QObjectMapping(
joinOn((o, t) -> o.oid.eq(t.ownerOid))));
}

// TODO will the version for RefItemFilterProcessor be useful too? Yes, if it needs relation mapping too!
public final void addRefMapping(
@NotNull QName itemName, @NotNull QReferenceMapping qReferenceMapping) {
addRefMapping(this, itemName, qReferenceMapping);
}

/**
* Adding reference mapping for not-this mapping, handy for nested mappings.
* Mapping (nested or not) is more general repo-sqlbase concept while
* {@link RefTableItemFilterProcessor} is Sqale specific, so it can't be fluent.
*/
public final void addRefMapping(
@NotNull QueryModelMapping<?, ?, ?> mapping,
@NotNull QName itemName,
@NotNull QReferenceMapping qReferenceMapping) {
mapping.addItemMapping(itemName,
RefTableItemFilterProcessor.mapper(qReferenceMapping));
// TODO add relation mapping too
}

@Override
public @NotNull Path<?>[] selectExpressions(
Q entity, Collection<SelectorOptions<GetOperationOptions>> options) {
Expand Down
Expand Up @@ -10,15 +10,15 @@
import static com.evolveum.midpoint.repo.sqlbase.mapping.item.SimpleItemFilterProcessor.uuidMapper;

import com.evolveum.midpoint.repo.sqale.UriItemFilterProcessor;
import com.evolveum.midpoint.repo.sqale.qmodel.SqaleModelMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTableMapping;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;

/**
* Mapping between {@link QReference} (and its subclasses) and {@link ObjectReferenceType}.
* The mapping is the same for all subtypes, see different `INSTANCE_*` constants below.
*/
public class QReferenceMapping
extends SqaleModelMapping<ObjectReferenceType, QReference, MReference> {
extends SqaleTableMapping<ObjectReferenceType, QReference, MReference> {

// see also subtype specific alias names defined for instances below
public static final String DEFAULT_ALIAS_NAME = "ref";
Expand Down

0 comments on commit 81188b4

Please sign in to comment.