Skip to content

Commit

Permalink
SQALE: support for Processed Objects (squashed multiple commits)
Browse files Browse the repository at this point in the history
Signed-off-by: Tony Tkacik <tonydamage@gmail.com>
  • Loading branch information
tonydamage committed Nov 29, 2022
1 parent 7468980 commit 67d2bca
Show file tree
Hide file tree
Showing 9 changed files with 324 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,19 +48,40 @@
<xsd:sequence>
<xsd:element name="metric" type="tns:SimulationMetricType" maxOccurs="unbounded"/>
<xsd:element name="processedObject" type="tns:SimulationResultProcessedObjectType" maxOccurs="unbounded" />
<xsd:element name="useOwnPartitionForProcessedObjects" type="xsd:boolean" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

<xsd:element name="simulationResult" type="tns:SimulationResultType" substitutionGroup="c:object"/>

<xsd:complexType name="SimulationMetricDefinitionType">
<xsd:annotation>
<xsd:documentation>
Result of Simulation run.
</xsd:documentation>
<xsd:appinfo>
<a:container/>
<a:since>4.7</a:since>
</xsd:appinfo>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="identifier" type="xsd:string "/>
<xsd:element name="displayName" type="t:PolyStringType"/>
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="SimulationMetricType">
<xsd:annotation>
<xsd:documentation>
Result of Simulation run.
</xsd:documentation>
<xsd:appinfo>
<a:container/>
<a:since>4.7</a:since>
</xsd:appinfo>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="identifier" type="xsd:string" />
<xsd:element name="definition" type="tns:SimulationMetricDefinitionType" />
Expand All @@ -70,17 +91,25 @@
</xsd:complexType>

<xsd:complexType name="SimulationResultProcessedObjectType">
<xsd:annotation>
<xsd:documentation>
Result of Simulation run.
</xsd:documentation>
<xsd:appinfo>
<a:container/>
<a:since>4.7</a:since>
</xsd:appinfo>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="oid" type="xsd:string" />
<xsd:element name="type" type="xsd:QName" />
<xsd:element name="name" type="t:PolyStringType" />
<xsd:element name="state" type="tns:ObjectProcessingStateType" />
<xsd:element name="metricIdentifier" type="xsd:string" maxOccurs="unbounded" />

<!-- Extra stored state -->
<xsd:element name="before" type="tns:ObjectType" />
<xsd:element name="after" type="tns:ObjectType" />


<xsd:element name="metricIdentifier" type="string" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
import com.evolveum.midpoint.repo.sqale.qmodel.role.QRoleMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.role.QServiceMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.shadow.QShadowMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.simulation.QProcessedObjectMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.simulation.QSimulationResultMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.system.QSecurityPolicyMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.system.QSystemConfigurationMapping;
Expand Down Expand Up @@ -188,6 +189,7 @@ public SqaleRepoContext sqlRepoContext(
.register(QContainerMapping.initContainerMapping(repositoryContext))
.register(QReferenceMapping.init(repositoryContext))
.register(SimulationResultType.COMPLEX_TYPE, QSimulationResultMapping.initSimulationResultMapping(repositoryContext))
.register(SimulationResultProcessedObjectType.COMPLEX_TYPE, QProcessedObjectMapping.initProcessedResultMapping(repositoryContext))
.seal();

return repositoryContext;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,6 @@ public enum MContainerType {
INDUCEMENT, // also represented by AssignmentType,
LOOKUP_TABLE_ROW,
OPERATION_EXECUTION,
SIMULATION_RESULT_PROCESSED_OBJECT,
TRIGGER
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import com.evolveum.midpoint.repo.sqale.qmodel.system.QSystemConfiguration;
import com.evolveum.midpoint.repo.sqale.qmodel.system.QValuePolicy;
import com.evolveum.midpoint.repo.sqale.qmodel.task.QTask;
import com.evolveum.midpoint.repo.sqale.qmodel.simulation.QSimulationResult;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

Expand Down Expand Up @@ -80,6 +81,7 @@ public enum MObjectType {
SEQUENCE(QSequence.class, SequenceType.class),
SERVICE(QService.class, ServiceType.class),
SHADOW(QShadow.class, ShadowType.class),
SIMULATION_RESULT(QSimulationResult.class, SimulationResultType.class),
SYSTEM_CONFIGURATION(QSystemConfiguration.class, SystemConfigurationType.class),
TASK(QTask.class, TaskType.class),
USER(QUser.class, UserType.class),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.evolveum.midpoint.repo.sqale.qmodel.simulation;

import java.util.UUID;

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

public class MProcessedObject extends MContainer {

public UUID oid;
public MObjectType objectType;
public String nameOrig;
public String nameNorm;

public ObjectProcessingStateType state;
public String[] metricIdentifiers;

public byte[] fullObject;

public byte[] objectBefore;
public byte[] objectAfter;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.evolveum.midpoint.repo.sqale.qmodel.simulation;

import java.sql.Types;

import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainer;
import com.evolveum.midpoint.repo.sqale.qmodel.object.MObjectType;
import com.evolveum.midpoint.repo.sqlbase.querydsl.UuidPath;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectProcessingStateType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType;
import com.querydsl.core.types.dsl.ArrayPath;
import com.querydsl.core.types.dsl.EnumPath;
import com.querydsl.core.types.dsl.StringPath;
import com.querydsl.sql.ColumnMetadata;

public class QProcessedObject extends QContainer<MProcessedObject, MSimulationResult> {

public static final String TABLE_NAME = "m_simulation_result_processed_object";


public static final ColumnMetadata OID =
ColumnMetadata.named("oid").ofType(UuidPath.UUID_TYPE).notNull();
public static final ColumnMetadata OBJECT_TYPE =
ColumnMetadata.named("objectType").ofType(Types.OTHER).notNull();
public static final ColumnMetadata NAME_ORIG =
ColumnMetadata.named("nameOrig").ofType(Types.VARCHAR).notNull();
public static final ColumnMetadata NAME_NORM =
ColumnMetadata.named("nameNorm").ofType(Types.VARCHAR).notNull();
public static final ColumnMetadata STATE =
ColumnMetadata.named("state").ofType(Types.OTHER);

public static final ColumnMetadata FULL_OBJECT =
ColumnMetadata.named("fullObject").ofType(Types.BINARY);
public static final ColumnMetadata OBJECT_BEFORE =
ColumnMetadata.named("objectBefore").ofType(Types.BINARY);

public static final ColumnMetadata OBJECT_AFTER =
ColumnMetadata.named("objectAfter").ofType(Types.BINARY);

public static final ColumnMetadata METRIC_IDENTIFIERS =
ColumnMetadata.named("metricIdentifiers").ofType(Types.ARRAY);

public final UuidPath oid = createUuid("oid", OID);
public final EnumPath<MObjectType> objectType = createEnum("objectType", MObjectType.class, OBJECT_TYPE);
public final StringPath nameOrig = createString("nameOrig", NAME_ORIG);
public final StringPath nameNorm = createString("nameNorm", NAME_NORM);
public final EnumPath<ObjectProcessingStateType> state =
createEnum("outcome", ObjectProcessingStateType.class, STATE);

public final ArrayPath<byte[], Byte> fullObject = createByteArray("fullObject", FULL_OBJECT);
public final ArrayPath<byte[], Byte> objectBefore = createByteArray("objectBefore", OBJECT_BEFORE);
public final ArrayPath<byte[], Byte> objectAfter = createByteArray("objectAfter", OBJECT_AFTER);


public final ArrayPath<String[], String> metricIdentifiers =
createArray("metricIdentifiers", String[].class, METRIC_IDENTIFIERS);

public QProcessedObject(String variable) {
this(variable, DEFAULT_SCHEMA_NAME, TABLE_NAME);
}

public QProcessedObject(String variable, String schema, String table) {
super(MProcessedObject.class, variable, schema, table);
}



}
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
package com.evolveum.midpoint.repo.sqale.qmodel.simulation;

import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.prism.path.PathSet;
import com.evolveum.midpoint.repo.sqale.SqaleRepoContext;
import com.evolveum.midpoint.repo.sqale.SqaleUtils;
import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainerMapping;
import com.evolveum.midpoint.repo.sqlbase.JdbcSession;
import com.evolveum.midpoint.repo.sqlbase.mapping.TableRelationResolver;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SimulationResultProcessedObjectType;
import com.querydsl.core.types.Path;

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

import java.util.Collection;
import java.util.Objects;


public class QProcessedObjectMapping extends QContainerMapping<SimulationResultProcessedObjectType, QProcessedObject, MProcessedObject, MSimulationResult> {

public static final String DEFAULT_ALIAS_NAME = "po";

// FIXME: This constants should be provided by generated schema code
public static final ItemName F_BEFORE = new ItemName(F_OID.getNamespaceURI(), "before");
public static final ItemName F_AFTER = new ItemName(F_OID.getNamespaceURI(), "after");


private static QProcessedObjectMapping instance;

public static @NotNull QProcessedObjectMapping initProcessedResultMapping(@NotNull SqaleRepoContext repositoryContext) {
if (needsInitialization(instance, repositoryContext)) {
instance = new QProcessedObjectMapping(repositoryContext);
}
return instance;
}

public static QProcessedObjectMapping getProcessedObjectMapping() {
return Objects.requireNonNull(instance);
}

public QProcessedObjectMapping(@NotNull SqaleRepoContext repositoryContext) {
super(QProcessedObject.TABLE_NAME, DEFAULT_ALIAS_NAME,SimulationResultProcessedObjectType.class, QProcessedObject.class, repositoryContext);

addRelationResolver(PrismConstants.T_PARENT,
// mapping supplier is used to avoid cycles in the initialization code
TableRelationResolver.usingJoin(
QSimulationResultMapping::getSimulationResultMapping,
(q, p) -> q.ownerOid.eq(p.oid)));
// This could be done also by auditRefMapping, but we currently do not support filters which allows searching for target name
// without dereferencing, which may be unusable for new simulated objects

addItemMapping(F_OID, uuidMapper(q -> q.oid));
addItemMapping(F_NAME, polyStringMapper(
q -> q.nameOrig, q -> q.nameNorm));
// addItemMapping(F_OBJECT_TYPE, ));

addItemMapping(F_STATE, enumMapper(q -> q.state));
addItemMapping(F_METRIC_IDENTIFIER, multiStringMapper(q -> q.metricIdentifiers));
}

/*
@Override
public @NotNull Path<?>[] selectExpressions(QProcessedObject row,
Collection<SelectorOptions<GetOperationOptions>> options) {
return new Path<?>[] {row.ownerOid, row.cid, row.fullObject};
}
*/

@Override
public SimulationResultProcessedObjectType toSchemaObject(MProcessedObject row) throws SchemaException {
return parseSchemaObject(row.fullObject, row.ownerOid + "," + row.cid);
}

@Override
public MProcessedObject newRowObject() {
return new MProcessedObject();
}

@Override
protected QProcessedObject newAliasInstance(String alias) {
return new QProcessedObject(alias);
}

@Override
public MProcessedObject newRowObject(MSimulationResult ownerRow) {
MProcessedObject row = newRowObject();
row.ownerOid = ownerRow.oid;
return row;
}

@Override
protected PathSet fullObjectItemsToSkip() {
// Do not store full objects
return PathSet.of(F_BEFORE, F_AFTER);
}

@Override
public MProcessedObject insert(SimulationResultProcessedObjectType object, MSimulationResult ownerRow,
JdbcSession jdbcSession) throws SchemaException {
MProcessedObject row = initRowObject(object, ownerRow);
//row.oid
row.oid = SqaleUtils.oidToUUid(object.getOid());
row.nameOrig = object.getName().getOrig();
row.nameNorm = object.getName().getNorm();
row.state = object.getState();

row.metricIdentifiers = stringsToArray(object.getMetricIdentifier());
row.fullObject = createFullObject(object);

// Before / After not serialized
insert(row, jdbcSession);
return row;
}


}
Original file line number Diff line number Diff line change
@@ -1,25 +1,32 @@
package com.evolveum.midpoint.repo.sqale.qmodel.simulation;

import java.util.List;
import java.util.Objects;

import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.prism.path.PathSet;
import com.evolveum.midpoint.repo.sqale.SqaleRepoContext;
import com.evolveum.midpoint.repo.sqale.qmodel.accesscert.QAccessCertificationCaseMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping;
import com.evolveum.midpoint.repo.sqlbase.JdbcSession;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SimulationResultProcessedObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SimulationResultType;

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

public class QSimulationResultMapping extends QObjectMapping<SimulationResultType, QSimulationResult, MSimulationResult>{

public static final String DEFAULT_ALIAS_NAME = "sr";

private static QSimulationResultMapping instance;



public static QSimulationResultMapping initSimulationResultMapping(@NotNull SqaleRepoContext repositoryContext) {
instance = new QSimulationResultMapping(repositoryContext);
if (needsInitialization(instance, repositoryContext)) {
instance = new QSimulationResultMapping(repositoryContext);
}
return instance;
}

Expand All @@ -31,13 +38,17 @@ public static QSimulationResultMapping getSimulationResultMapping() {
private QSimulationResultMapping(@NotNull SqaleRepoContext repositoryContext) {
super(QSimulationResult.TABLE_NAME, DEFAULT_ALIAS_NAME,
SimulationResultType.class, QSimulationResult.class, repositoryContext);
addContainerTableMapping(F_PROCESSED_OBJECT,
QProcessedObjectMapping.initProcessedResultMapping(repositoryContext),
joinOn((o, processed) -> o.oid.eq(processed.ownerOid)));
}

@Override
protected QSimulationResult newAliasInstance(String alias) {
return new QSimulationResult(alias);
}


@Override
public MSimulationResult newRowObject() {
return new MSimulationResult();
Expand All @@ -47,4 +58,16 @@ public MSimulationResult newRowObject() {
protected PathSet fullObjectItemsToSkip() {
return PathSet.of(SimulationResultType.F_PROCESSED_OBJECT);
}

@Override
public void storeRelatedEntities(@NotNull MSimulationResult row, @NotNull SimulationResultType schemaObject,
@NotNull JdbcSession jdbcSession) throws SchemaException {
super.storeRelatedEntities(row, schemaObject, jdbcSession);
List<SimulationResultProcessedObjectType> processed = schemaObject.getProcessedObject();
if (!processed.isEmpty()) {
for (var c : processed) {
QProcessedObjectMapping.getProcessedObjectMapping().insert(c, row, jdbcSession);
}
}
}
}

0 comments on commit 67d2bca

Please sign in to comment.