Skip to content

Commit

Permalink
update context + delta processor moved from sqlbase to sqale only
Browse files Browse the repository at this point in the history
  • Loading branch information
virgo47 committed Mar 31, 2021
1 parent 380d2e3 commit 0fad0cd
Show file tree
Hide file tree
Showing 24 changed files with 169 additions and 98 deletions.
Expand Up @@ -456,7 +456,7 @@ void modifyObjectAttempt(
// TODO APPLY modifications HERE (generate update/set clauses)
for (ItemDelta<?, ?> modification : modifications) {
System.out.println("modification = " + modification);
// updateContext.processModification(modification); // TODO expected NPE right now
updateContext.processModification(modification); // TODO expected NPE right now
}

updateContext.incrementVersion();
Expand Down
Expand Up @@ -7,38 +7,67 @@
package com.evolveum.midpoint.repo.sqale;

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

import com.querydsl.sql.dml.SQLUpdateClause;

import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.repo.sqale.delta.SqaleItemSqlMapper;
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;
import com.evolveum.midpoint.repo.sqlbase.JdbcSession;
import com.evolveum.midpoint.repo.sqlbase.RepositoryException;
import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport;
import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping;
import com.evolveum.midpoint.repo.sqlbase.mapping.delta.SqlUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.ItemSqlMapper;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

public class SqaleUpdateContext<S extends ObjectType, Q extends QObject<R>, R extends MObject>
extends SqlUpdateContext<S, Q, R> {
/**
* TODO
*
* @param <S> schema type
* @param <Q> type of entity path
* @param <R> row type related to the {@link Q}
*/
public class SqaleUpdateContext<S extends ObjectType, Q extends QObject<R>, R extends MObject> {

protected final SqaleTableMapping<S, Q, R> mapping;
protected final JdbcSession jdbcSession;
protected final PrismObject<S> prismObject;
protected final Q rootPath;
private final SQLUpdateClause update;

public SqaleUpdateContext(QueryTableMapping<S, Q, R> mapping, JdbcSession jdbcSession, PrismObject<S> prismObject) {
super(mapping, jdbcSession, prismObject);

public SqaleUpdateContext(
SqaleTableMapping<S, Q, R> mapping,
JdbcSession jdbcSession,
PrismObject<S> prismObject) {
this.mapping = mapping;
this.jdbcSession = jdbcSession;
this.prismObject = prismObject;
rootPath = mapping.defaultAlias();
update = jdbcSession.newUpdate(rootPath)
.where(rootPath.oid.eq(UUID.fromString(prismObject.getOid())));
}

public Q path() {
return rootPath;
}

public void processModification(ItemDelta<?, ?> modification) throws RepositoryException {
mapping.itemMapper(modification.getPath().asSingleName())
.createItemDeltaProcessor(this)
.process(modification);
QName itemPath = modification.getPath().asSingleName();
// TODO later resolution of complex paths just like for filters
ItemSqlMapper itemSqlMapper = mapping.itemMapper(itemPath);
if (itemSqlMapper instanceof SqaleItemSqlMapper) {
((SqaleItemSqlMapper) itemSqlMapper)
.createItemDeltaProcessor(this)
.process(modification);
} else {
throw new IllegalArgumentException("No delta processor available for " + itemPath
+ " in mapping " + mapping + "! (Only query mapping is available.)");
}
}

/** Updates version in enclosed {@link #prismObject} and adds corresponding set clause. */
Expand Down
Expand Up @@ -4,19 +4,20 @@
* 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.sqlbase.mapping.delta;
package com.evolveum.midpoint.repo.sqale.delta;

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

/**
* TODO
*/
public abstract class ItemDeltaProcessor {

protected final SqlUpdateContext<?, ?, ?> context;
protected final SqaleUpdateContext<?, ?, ?> context;

protected ItemDeltaProcessor(SqlUpdateContext<?, ?, ?> context) {
protected ItemDeltaProcessor(SqaleUpdateContext<?, ?, ?> context) {
this.context = context;
}

Expand Down
@@ -0,0 +1,36 @@
/*
* 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.delta;

import java.util.function.Function;

import com.querydsl.core.types.EntityPath;
import com.querydsl.core.types.Path;

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

public class SimpleItemDeltaProcessor<P extends Path<?>> extends ItemDeltaProcessor {

protected final P path;

public SimpleItemDeltaProcessor(
SqaleUpdateContext<?, ?, ?> context, Function<EntityPath<?>, P> rootToQueryItem) {
super(context);
this.path = rootToQueryItem.apply(context.path());
}

@Override
public void process(ItemDelta<?, ?> modification) throws RepositoryException {
System.out.println(path + " <= applying modification: " + modification); // TODO out
if (modification.isDelete()) {
// context.update(path, NULL);
}
// context.update(path, modification.getv)
}
}
@@ -0,0 +1,57 @@
/*
* 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.delta;

import java.util.Objects;
import java.util.function.Function;

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

import com.evolveum.midpoint.repo.sqale.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.SqlQueryContext;
import com.evolveum.midpoint.repo.sqlbase.filtering.item.ItemFilterProcessor;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.ItemSqlMapper;

/**
* Declarative information how an item (from schema/prism world) is to be processed
* when interpreting query or applying delta (delta application is addition to sqlbase superclass).
*/
public class SqaleItemSqlMapper extends ItemSqlMapper {

@NotNull private final
Function<SqaleUpdateContext<?, ?, ?>, ItemDeltaProcessor> deltaProcessorFactory;

public <P extends Path<?>> SqaleItemSqlMapper(
@NotNull Function<SqlQueryContext<?, ?, ?>, ItemFilterProcessor<?>> filterProcessorFactory,
@NotNull Function<SqaleUpdateContext<?, ?, ?>, ItemDeltaProcessor> deltaProcessorFactory,
@Nullable Function<EntityPath<?>, P> primaryItemMapping) {
super(filterProcessorFactory, primaryItemMapping);
this.deltaProcessorFactory = Objects.requireNonNull(deltaProcessorFactory);
}

public <P extends Path<?>> SqaleItemSqlMapper(
@NotNull Function<SqlQueryContext<?, ?, ?>, ItemFilterProcessor<?>> filterProcessorFactory,
@NotNull Function<SqaleUpdateContext<?, ?, ?>, ItemDeltaProcessor> deltaProcessorFactory) {
super(filterProcessorFactory);
this.deltaProcessorFactory = Objects.requireNonNull(deltaProcessorFactory);
}

/**
* Creates {@link ItemDeltaProcessor} based on this mapping.
* Provided {@link SqaleUpdateContext} is used to figure out the query paths when this is
* executed (as the entity path instance is not yet available when the mapping is configured
* in a declarative manner).
*
* The type of the returned filter is adapted to the client code needs for convenience.
*/
public ItemDeltaProcessor createItemDeltaProcessor(SqaleUpdateContext<?, ?, ?> sqlUpdateContext) {
return deltaProcessorFactory.apply(sqlUpdateContext);
}
}
Expand Up @@ -6,16 +6,23 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel;

import java.util.function.Function;
import javax.xml.namespace.QName;

import com.querydsl.core.types.EntityPath;
import com.querydsl.core.types.dsl.StringPath;
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.repo.sqale.ObjectRefTableItemFilterProcessor;
import com.evolveum.midpoint.repo.sqale.delta.SimpleItemDeltaProcessor;
import com.evolveum.midpoint.repo.sqale.delta.SqaleItemSqlMapper;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QObject;
import com.evolveum.midpoint.repo.sqale.qmodel.ref.QObjectReferenceMapping;
import com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor;
import com.evolveum.midpoint.repo.sqlbase.mapping.QueryModelMapping;
import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping;
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;

Expand Down Expand Up @@ -53,4 +60,13 @@ public final void addRefMapping(
ObjectRefTableItemFilterProcessor.mapper(qReferenceMapping));
// TODO add relation mapping too
}

/** Returns the mapper creating the string filter/delta processors from context. */
protected ItemSqlMapper stringMapper(
Function<EntityPath<?>, StringPath> rootToQueryItem) {
return new SqaleItemSqlMapper(
ctx -> new SimpleItemFilterProcessor<>(ctx, rootToQueryItem),
ctx -> new SimpleItemDeltaProcessor<>(ctx, rootToQueryItem),
rootToQueryItem);
}
}
Expand Up @@ -7,7 +7,6 @@
package com.evolveum.midpoint.repo.sqale.qmodel.assignment;

import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.integerMapper;
import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType.*;

import com.evolveum.midpoint.repo.sqale.RefItemFilterProcessor;
Expand Down
Expand Up @@ -6,7 +6,6 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel.cases;

import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType.*;

import com.evolveum.midpoint.repo.sqale.RefItemFilterProcessor;
Expand Down
Expand Up @@ -6,7 +6,6 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel.connector;

import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorHostType.F_HOSTNAME;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorHostType.F_PORT;

Expand Down
Expand Up @@ -6,7 +6,6 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel.connector;

import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType.*;

import com.evolveum.midpoint.repo.sqale.RefItemFilterProcessor;
Expand Down
Expand Up @@ -6,7 +6,6 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel.focus;

import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType.*;

import java.util.Collection;
Expand Down
Expand Up @@ -6,7 +6,6 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel.focus;

import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.UserType.*;

import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport;
Expand Down
Expand Up @@ -6,7 +6,6 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel.lookuptable;

import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType.*;

import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTableMapping;
Expand Down
Expand Up @@ -6,7 +6,6 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel.node;

import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.NodeType.F_NODE_IDENTIFIER;

import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping;
Expand Down
Expand Up @@ -6,7 +6,6 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel.object;

import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.uuidMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType.F_ARCHETYPE_REF;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType.F_ROLE_MEMBERSHIP_REF;
Expand Down
Expand Up @@ -7,7 +7,6 @@
package com.evolveum.midpoint.repo.sqale.qmodel.role;

import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.booleanMapper;
import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType.*;

import org.jetbrains.annotations.NotNull;
Expand Down
Expand Up @@ -6,7 +6,6 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel.role;

import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType.F_ROLE_TYPE;

import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport;
Expand Down
Expand Up @@ -7,7 +7,6 @@
package com.evolveum.midpoint.repo.sqale.qmodel.shadow;

import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.booleanMapper;
import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType.*;

import com.evolveum.midpoint.repo.sqale.RefItemFilterProcessor;
Expand Down
Expand Up @@ -6,8 +6,6 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel.task;

import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.stringMapper;

import com.evolveum.midpoint.repo.sqale.RefItemFilterProcessor;
import com.evolveum.midpoint.repo.sqale.UriItemFilterProcessor;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping;
Expand Down
Expand Up @@ -7,7 +7,6 @@
package com.evolveum.midpoint.repo.sql.audit.mapping;

import static com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditEventRecord.TABLE_NAME;
import static com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordType.*;

import com.evolveum.midpoint.repo.sql.audit.beans.MAuditEventRecord;
Expand Down
Expand Up @@ -13,7 +13,6 @@
import com.querydsl.core.types.Predicate;
import com.querydsl.core.types.dsl.BooleanPath;
import com.querydsl.core.types.dsl.NumberPath;
import com.querydsl.core.types.dsl.StringPath;

import com.evolveum.midpoint.prism.query.PropertyValueFilter;
import com.evolveum.midpoint.repo.sqlbase.QueryException;
Expand All @@ -28,12 +27,8 @@
public class SimpleItemFilterProcessor<T, P extends Path<T>>
extends SinglePathItemFilterProcessor<PropertyValueFilter<T>, P> {

/** Returns the mapper creating the string filter processor from context. */
public static ItemSqlMapper stringMapper(
Function<EntityPath<?>, StringPath> rootToQueryItem) {
return new ItemSqlMapper(ctx ->
new SimpleItemFilterProcessor<>(ctx, rootToQueryItem), rootToQueryItem);
}
// TODO these factory methods go away from filter processor as we want to create
// also delta processor in one go.

/** Returns the mapper creating the integer filter processor from context. */
public static ItemSqlMapper integerMapper(
Expand Down

0 comments on commit 0fad0cd

Please sign in to comment.