Skip to content

Commit

Permalink
Moved operation tracker to sqlbase
Browse files Browse the repository at this point in the history
Signed-off-by: Tony Tkáčik <tonydamage@gmail.com>
  • Loading branch information
tonydamage committed Jan 10, 2024
1 parent 3cfc72d commit 2ea4e5a
Show file tree
Hide file tree
Showing 7 changed files with 128 additions and 76 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ public SqaleRepositoryService(
.build();

PrismObject<T> object = null;
try (var sqResult = SqaleOperationResult.with(operationResult)) {
try (var sqResult = SqlBaseOperationTracker.with(operationResult)) {
object = executeGetObject(type, oidUuid, options);
return object;
} catch (ObjectNotFoundException e) {
Expand Down Expand Up @@ -230,12 +230,18 @@ private <S extends ObjectType, Q extends QObject<R>, R extends MObject> MappedTu
if (forUpdate) {
query.forUpdate();
}
Tuple result = query.fetchOne();

Tuple result;
var opResult = SqlBaseOperationTracker.fetchPrimary();
try {
result = query.fetchOne();
} finally {
opResult.close();
}
if (result == null || result.get(root.fullObject) == null) {
throw new ObjectNotFoundException(rootMapping.schemaType(), oid.toString(), isAllowNotFound(options));
}


var ret = new MappedTuple<S>();
ret.tuple = result;
var queryContext = SqaleQueryContext.from(rootMapping, sqlRepoContext, query, this::readByOid);
Expand Down Expand Up @@ -597,7 +603,7 @@ private <T extends ObjectType> ModifyObjectResult<T> modifyObjectInternal(
@Nullable RepoModifyOptions options,
@NotNull OperationResult operationResult)
throws SchemaException, PreconditionViolationException, RepositoryException {
try (var sqaleResult = SqaleOperationResult.with(operationResult)){
try (var sqaleResult = SqlBaseOperationTracker.with(operationResult)){
if (options == null) {
options = new RepoModifyOptions();
}
Expand Down Expand Up @@ -933,7 +939,7 @@ private <T extends ObjectType> int executeCountObjects(
.addParam(OperationResult.PARAM_OPTIONS, String.valueOf(options))
.build();

try (var sqaleResult = SqaleOperationResult.with(operationResult)) {
try (var sqaleResult = SqlBaseOperationTracker.with(operationResult)) {
logSearchInputParameters(type, query, "Search objects");

query = ObjectQueryUtil.simplifyQuery(query);
Expand Down Expand Up @@ -988,7 +994,7 @@ public <T extends ObjectType> SearchResultMetadata searchObjectsIterative(
.addParam(OperationResult.PARAM_QUERY, query)
.build();

try (var sqaleResult = SqaleOperationResult.with(operationResult)) {
try (var sqaleResult = SqlBaseOperationTracker.with(operationResult)) {
logSearchInputParameters(type, query, "Iterative search objects");

query = ObjectQueryUtil.simplifyQuery(query);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

import java.util.*;

import com.evolveum.midpoint.repo.sqlbase.SqlBaseOperationTracker;

import com.querydsl.core.Tuple;
import org.jetbrains.annotations.NotNull;

Expand Down Expand Up @@ -72,24 +74,30 @@ public Impl(List<? extends ItemPath> paths) {

@Override
protected <S> S resolve(S object, JdbcSession session) {

if (!(object instanceof Containerable)) {
return object;
}
PrismContainerValue<?> container = ((Containerable) object).asPrismContainerValue();
Visitor initialWalk = visitable -> {
if (visitable instanceof PrismReferenceValue) {
initialVisit((PrismReferenceValue) visitable);
}
};
container.accept(initialWalk);
resolveNames(session);
Visitor updater = visitable -> {
if (visitable instanceof PrismReferenceValue) {
updateReference((PrismReferenceValue) visitable);
}
};
container.accept(updater);
return object;
var result = SqlBaseOperationTracker.resolveNames();
try {
PrismContainerValue<?> container = ((Containerable) object).asPrismContainerValue();
Visitor initialWalk = visitable -> {
if (visitable instanceof PrismReferenceValue) {
initialVisit((PrismReferenceValue) visitable);
}
};
container.accept(initialWalk);
resolveNames(session);
Visitor updater = visitable -> {
if (visitable instanceof PrismReferenceValue) {
updateReference((PrismReferenceValue) visitable);
}
};
container.accept(updater);
return object;
} finally {
result.close();
}
}

private void resolveNames(JdbcSession session) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.path.PathSet;
import com.evolveum.midpoint.prism.path.UniformItemPath;
import com.evolveum.midpoint.repo.sqale.SqaleOperationResult;
import com.evolveum.midpoint.repo.sqale.mapping.ReferenceNameResolver;
import com.evolveum.midpoint.repo.sqlbase.SqlBaseOperationTracker;
import com.evolveum.midpoint.repo.sqale.mapping.SqaleMappingMixin;
import com.evolveum.midpoint.repo.sqale.qmodel.common.*;

Expand Down Expand Up @@ -97,10 +96,7 @@ public class QObjectMapping<S extends ObjectType, Q extends QObject<R>, R extend
return Objects.requireNonNull(instance);
}

private static String DOT_NAME = QObjectMapping.class.getName() + ".";
private static String PARSE_FULL_OBJECT = DOT_NAME + "parseFullObject";
private static String FETCH_CHILDREN = DOT_NAME + "fetchChildren";
private static String PARSE_CHILDREN = DOT_NAME + "parseChildren";



protected QObjectMapping(
Expand Down Expand Up @@ -217,7 +213,7 @@ public S toSchemaObjectCompleteSafe(
Collection<SelectorOptions<GetOperationOptions>> options,
@NotNull JdbcSession jdbcSession,
boolean forceFull) {
var result = SqaleOperationResult.createSubresult(PARSE_FULL_OBJECT);
var result = SqlBaseOperationTracker.parsePrimary();
try {
return toSchemaObjectComplete(tuple, entityPath, options, jdbcSession, forceFull);
} catch (SchemaException e) {
Expand Down Expand Up @@ -485,24 +481,23 @@ public ResultListRowTransformer<S, Q, R> createRowTransformer(SqlQueryContext<S,
@Override
public void beforeTransformation(List<Tuple> tuples, Q entityPath) throws SchemaException {
// get uuids?
var result = SqaleOperationResult.createSubresult(FETCH_CHILDREN);
try {
var oidList = tuples.stream().map(t -> t.get(entityPath.oid)).collect(Collectors.toList());
for (var mapping : mappingToData.entrySet()) {
var oidList = tuples.stream().map(t -> t.get(entityPath.oid)).collect(Collectors.toList());
for (var mapping : mappingToData.entrySet()) {
var result = SqlBaseOperationTracker.fetchChildren(mapping.getKey().mapping.tableName());
try {
mapping.setValue(mapping.getKey().fetchChildren(oidList, jdbcSession));
} finally {
result.close();
}
} finally {
result.close();
}

}

@Override
public S transform(Tuple tuple, Q entityPath) {
// Parsing full object
S baseObject = toSchemaObjectCompleteSafe(tuple, entityPath, options, jdbcSession, false);
var uuid = tuple.get(entityPath.oid);
var childrenResult = SqaleOperationResult.createSubresult(PARSE_CHILDREN);
var childrenResult = SqlBaseOperationTracker.parseChildren("all");
try {
for (var entry : mappingToData.entrySet()) {
var mapping = entry.getKey();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,5 @@ public interface QSeparatelySerializedItem<Q extends FlexibleRelationalPathBase<
UUID getOwner(R row);
PrismValue toSchemaObjectEmbedded(R row) throws SchemaException;
Class<? extends Item<? extends PrismValue,?>> getPrismItemType();
String tableName();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package com.evolveum.midpoint.repo.sqlbase;

import com.evolveum.midpoint.schema.result.OperationResult;

public class SqlBaseOperationTracker implements AutoCloseable {
private static final ThreadLocal<OperationResult> CURRENT_OPERATION_RESULT = new ThreadLocal<>();

private static final String DOT_NAME = SqlBaseOperationTracker.class.getName() + ".";

private static final String FETCH_ONE_PRIMARY = DOT_NAME + "primary.fetch.one";

private static final String FETCH_MULTIPLE_PRIMARY = DOT_NAME + "primary.fetch.multiple";

private static final String FETCH_CHILDREN = DOT_NAME + "children.fetch.";
private static final String PARSE_CHILDREN = DOT_NAME + "children.parse.";

private static final String PARSE_PRIMARY = DOT_NAME + "primary.parse";

private static final String RESOLVE_NAMES = DOT_NAME + "primary.resolveNames";

public static OperationResult get() {
var maybe = CURRENT_OPERATION_RESULT.get();
if (maybe != null) {
return maybe;
}
// Nullables (for operations we are not tracking)
return new OperationResult("temporary");
}

public static OperationResult set(OperationResult result) {
CURRENT_OPERATION_RESULT.set(result);
return result;
}

public static void free() {
CURRENT_OPERATION_RESULT.remove();
}

public static OperationResult createSubresult(String name) {
return get().createSubresult(name);
}

public static OperationResult fetchMultiplePrimaries() {
return createSubresult(FETCH_MULTIPLE_PRIMARY);
}

public static OperationResult fetchPrimary() {
return createSubresult(FETCH_ONE_PRIMARY);
}

public static OperationResult parsePrimary() {
return createSubresult(PARSE_PRIMARY);
}

public static OperationResult fetchChildren(String name) {
return createSubresult(FETCH_CHILDREN + name);
}

public static OperationResult parseChildren(String name) {
return createSubresult(PARSE_CHILDREN + name);
}

public static OperationResult resolveNames() {
return createSubresult(RESOLVE_NAMES);
}

public static SqlBaseOperationTracker with(OperationResult result) {
set(result);
return new SqlBaseOperationTracker();
}

@Override
public void close() {
free();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,12 @@ public <S, Q extends FlexibleRelationalPathBase<R>, R> int count(
context.beforeQuery();
PageOf<Tuple> result;
try (JdbcSession jdbcSession = sqlRepoContext.newJdbcSession().startReadOnlyTransaction()) {
result = context.executeQuery(jdbcSession);
var opResult = SqlBaseOperationTracker.fetchMultiplePrimaries();
try {
result = context.executeQuery(jdbcSession);
} finally {
opResult.close();
}
PageOf<S> transformedResult = context.transformToSchemaType(result, jdbcSession);
return createSearchResultList(transformedResult);
}
Expand Down

0 comments on commit 2ea4e5a

Please sign in to comment.