Skip to content

Commit

Permalink
repo-sqale: update contexts moved to sub-package, javadoc/refactoring
Browse files Browse the repository at this point in the history
Still WIP, nested and table container contexts are not used yet, but
contracts are now much clearer.
TableRelationResolver is still WIP.
*TableMapping#*mapper() factory methods have now flexible schema type
parameter, because it's different for top-level and nested mappings.
  • Loading branch information
virgo47 committed Apr 26, 2021
1 parent 9d0db25 commit 84db425
Show file tree
Hide file tree
Showing 34 changed files with 359 additions and 174 deletions.
Expand Up @@ -36,6 +36,7 @@
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.RootUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.*;
import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping;
import com.evolveum.midpoint.repo.sqlbase.perfmon.SqlPerformanceMonitorImpl;
Expand Down

This file was deleted.

Expand Up @@ -38,4 +38,10 @@ public static int objectVersionAsInt(PrismObject<?> prismObject) {
throw new IllegalArgumentException("Version must be a number: " + version);
}
}

/** Parametrized type friendly version of {@link Object#getClass()}. */
public static <S> Class<S> getClass(S object) {
//noinspection unchecked
return (Class<S>) object.getClass();
}
}
Expand Up @@ -11,10 +11,9 @@
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqale.mapping.SqaleItemRelationResolver;
import com.evolveum.midpoint.repo.sqale.mapping.SqaleItemSqlMapper;
import com.evolveum.midpoint.repo.sqlbase.QueryException;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.RepositoryException;
import com.evolveum.midpoint.repo.sqlbase.filtering.ValueFilterProcessor;
import com.evolveum.midpoint.repo.sqlbase.mapping.ItemRelationResolver;
Expand Down Expand Up @@ -68,12 +67,12 @@ public void process(ItemDelta<?, ?> modification) throws RepositoryException {
// It's a similar case like the fast return after resolving the path.
}

private QName resolvePath(ItemPath path) throws QueryException {
private QName resolvePath(ItemPath path) {
while (!path.isSingleName()) {
ItemName firstName = path.firstName();
path = path.rest();

ItemRelationResolver relationResolver = mapping.getRelationResolver(firstName);
ItemRelationResolver<?, ?> relationResolver = mapping.getRelationResolver(firstName);
if (relationResolver == null) {
return null; // unmapped, not persisted, nothing to do
}
Expand All @@ -83,8 +82,11 @@ private QName resolvePath(ItemPath path) throws QueryException {
throw new IllegalArgumentException("Relation resolver for " + firstName
+ " in mapping " + mapping + " does not support delta modifications!");
}
SqaleItemRelationResolver resolver = (SqaleItemRelationResolver) relationResolver;
SqaleItemRelationResolver.UpdateResolutionResult resolution = resolver.resolve(context);

// we know nothing about context and resolver types, so we have to ignore it
@SuppressWarnings({ "rawtypes", "unchecked" })
SqaleItemRelationResolver.UpdateResolutionResult resolution =
((SqaleItemRelationResolver) relationResolver).resolve(context);
context = resolution.context;
mapping = resolution.mapping;
}
Expand Down
Expand Up @@ -13,7 +13,7 @@
import org.jetbrains.annotations.Nullable;

import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.RepositoryException;

/**
Expand Down
Expand Up @@ -11,11 +11,11 @@
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqale.delta.ItemDeltaValueProcessor;
import com.evolveum.midpoint.repo.sqale.qmodel.common.MContainer;
import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainer;
import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainerMapping;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;

/**
Expand Down
Expand Up @@ -12,10 +12,10 @@
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.Item;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqale.delta.ItemDeltaValueProcessor;
import com.evolveum.midpoint.repo.sqale.mapping.SqaleItemSqlMapper;
import com.evolveum.midpoint.repo.sqale.qmodel.SqaleNestedMapping;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.mapping.ItemSqlMapper;
import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;

Expand Down
Expand Up @@ -10,7 +10,7 @@

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

import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;

/**
Expand Down
Expand Up @@ -10,8 +10,8 @@

import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqale.delta.ItemDeltaValueProcessor;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.RepositoryException;

/**
Expand Down
Expand Up @@ -11,7 +11,7 @@
import com.querydsl.core.types.dsl.StringPath;

import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;

public class PolyStringItemDeltaProcessor extends ItemDeltaSingleValueProcessor<PolyString> {
Expand Down
Expand Up @@ -13,8 +13,8 @@
import com.querydsl.core.types.dsl.NumberPath;

import com.evolveum.midpoint.prism.Referencable;
import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqale.qmodel.object.MObjectType;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;
import com.evolveum.midpoint.repo.sqlbase.querydsl.UuidPath;

Expand Down
Expand Up @@ -10,10 +10,10 @@
import java.util.UUID;

import com.evolveum.midpoint.prism.Referencable;
import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqale.delta.ItemDeltaValueProcessor;
import com.evolveum.midpoint.repo.sqale.qmodel.ref.QReference;
import com.evolveum.midpoint.repo.sqale.qmodel.ref.QReferenceMapping;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;

/**
Expand Down
Expand Up @@ -10,7 +10,7 @@

import com.querydsl.core.types.Path;

import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;

/**
Expand Down
Expand Up @@ -10,7 +10,7 @@

import com.querydsl.core.types.Path;

import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;

/**
Expand Down
Expand Up @@ -11,7 +11,7 @@
import com.querydsl.core.types.dsl.DateTimePath;
import org.jetbrains.annotations.Nullable;

import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;
import com.evolveum.midpoint.repo.sqlbase.querydsl.QuerydslUtils;

Expand Down
Expand Up @@ -11,7 +11,7 @@
import com.querydsl.core.types.dsl.NumberPath;
import org.jetbrains.annotations.Nullable;

import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;

public class UriItemDeltaProcessor
Expand Down
Expand Up @@ -6,33 +6,37 @@
*/
package com.evolveum.midpoint.repo.sqale.mapping;

import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.SqlQueryContext;
import com.evolveum.midpoint.repo.sqlbase.mapping.QueryModelMapping;
import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;

/**
* Resolver that maps the nested items (next component of the path) to the same query type columns.
*
* @param <Q> type of source entity path
* @param <Q> query type of source entity (where the mapping is declared)
* @param <R> row type of {@link Q}
*/
public class NestedMappingResolver<Q extends FlexibleRelationalPathBase<?>>
implements SqaleItemRelationResolver {
public class NestedMappingResolver<Q extends FlexibleRelationalPathBase<R>, R>
implements SqaleItemRelationResolver<Q, R> {

private final QueryModelMapping<?, Q, ?> mapping;
private final QueryModelMapping<?, Q, R> mapping;

public NestedMappingResolver(QueryModelMapping<?, Q, ?> mapping) {
public NestedMappingResolver(QueryModelMapping<?, Q, R> mapping) {
this.mapping = mapping;
}

/** Returns the same context and nested mapping. */
@Override
public ResolutionResult resolve(SqlQueryContext<?, ?, ?> context) {
public ResolutionResult resolve(SqlQueryContext<?, Q, R> context) {
return new ResolutionResult(context, mapping);
}

@Override
public UpdateResolutionResult resolve(SqaleUpdateContext<?, ?, ?> context) {
public UpdateResolutionResult resolve(SqaleUpdateContext<?, Q, R> context) {
// TODO this is OK unless we need to capture new schema object, e.g. nested metadata,
// in the context (SqaleUpdateContext#object). Row stays still the same, update clause
// doesn't change either, that's OK. Currently we're just losing type information.
return new UpdateResolutionResult(context, mapping);
}
}
Expand Up @@ -6,23 +6,25 @@
*/
package com.evolveum.midpoint.repo.sqale.mapping;

import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.mapping.ItemRelationResolver;
import com.evolveum.midpoint.repo.sqlbase.mapping.QueryModelMapping;
import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;

/**
* Extension of {@link ItemRelationResolver}, this is a common contract for resolver
* that helps with navigating over complex (non-single) item paths for both query
* and application of delta modification.
*/
public interface SqaleItemRelationResolver extends ItemRelationResolver {
public interface SqaleItemRelationResolver<Q extends FlexibleRelationalPathBase<R>, R>
extends ItemRelationResolver<Q, R> {

/**
* Resolves current query context to {@link ResolutionResult} with new context and mapping.
* The information about the resolved item is captured in the instance resolver already
* in a manner that is specific for various types of resolution (JOIN or nested mapping).
*/
UpdateResolutionResult resolve(SqaleUpdateContext<?, ?, ?> context);
UpdateResolutionResult resolve(SqaleUpdateContext<?, Q, R> context);

class UpdateResolutionResult {
public final SqaleUpdateContext<?, ?, ?> context;
Expand Down
Expand Up @@ -13,9 +13,9 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqale.delta.ItemDeltaProcessor;
import com.evolveum.midpoint.repo.sqale.delta.ItemDeltaValueProcessor;
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.SqlQueryContext;
import com.evolveum.midpoint.repo.sqlbase.filtering.item.ItemFilterProcessor;
import com.evolveum.midpoint.repo.sqlbase.mapping.ItemRelationResolver;
Expand Down

0 comments on commit 84db425

Please sign in to comment.