Skip to content

Commit

Permalink
repo-sqale: added UriItemFilterProcessor, the rest or QObject is mapped
Browse files Browse the repository at this point in the history
  • Loading branch information
virgo47 committed Feb 15, 2021
1 parent d1bfc04 commit 102d5e0
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 11 deletions.
Expand Up @@ -43,6 +43,11 @@ public Integer searchCachedUriId(QName qName) {
return uriCache.searchId(qName);
}

/** @see UriCache#searchId(String) */
public Integer searchCachedUriId(String uri) {
return uriCache.searchId(uri);
}

/** @see UriCache#resolveToId(QName) */
public Integer resolveToId(String uri) {
return uriCache.resolveToId(uri);
Expand Down
Expand Up @@ -607,8 +607,30 @@ public <T extends Containerable> SearchResultList<T> searchContainers(
Class<T> type, ObjectQuery query,
Collection<SelectorOptions<GetOperationOptions>> options, OperationResult parentResult)
throws SchemaException {
return null;
// TODO

Objects.requireNonNull(type, "Container type must not be null.");
Objects.requireNonNull(parentResult, "Operation result must not be null.");

OperationResult operationResult = parentResult.subresult(OP_NAME_PREFIX + "searchContainers")
.addQualifier(type.getSimpleName())
.addParam("type", type.getName())
.addParam("query", query)
.build();

try {
var queryContext = SqaleQueryContext.from(type, transformerContext, sqlRepoContext);
SearchResultList<T> result =
sqlQueryExecutor.list(queryContext, query, options);
return result;
} catch (QueryException | RuntimeException e) {
handleGeneralException(e, operationResult);
throw new SystemException(e);
} catch (Throwable t) {
operationResult.recordFatalError(t);
throw t;
} finally {
operationResult.computeStatusIfUnknown();
}
}

@Override
Expand Down Expand Up @@ -675,8 +697,14 @@ public void testOrgClosureConsistency(boolean repairIfNecessary, OperationResult
@Override
public RepositoryQueryDiagResponse executeQueryDiagnostics(
RepositoryQueryDiagRequest request, OperationResult result) {
return null;
// TODO

// TODO search like containers + dry run?

RepositoryQueryDiagResponse response = new RepositoryQueryDiagResponse(
null, null, Map.of());
// objects, implementationLevelQuery, implementationLevelQueryParameters);

return response;
}

@Override
Expand Down
@@ -0,0 +1,51 @@
/*
* 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;

import java.util.function.Function;

import com.querydsl.core.types.EntityPath;
import com.querydsl.core.types.Predicate;
import com.querydsl.core.types.dsl.NumberPath;

import com.evolveum.midpoint.prism.query.PropertyValueFilter;
import com.evolveum.midpoint.repo.sqlbase.QueryException;
import com.evolveum.midpoint.repo.sqlbase.SqlQueryContext;
import com.evolveum.midpoint.repo.sqlbase.filtering.ValueFilterValues;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.ItemFilterProcessor;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.ItemSqlMapper;

/**
* Filter processor for URI item paths - represented as strings in schema and by int ID in DB.
* TODO: if used for order it would require join to QUri, otherwise it just sorts by URI ID.
*/
public class UriItemFilterProcessor extends ItemFilterProcessor<PropertyValueFilter<String>> {

/**
* Returns the mapper function creating the ref-filter processor from query context.
*/
public static ItemSqlMapper mapper(
Function<EntityPath<?>, NumberPath<Integer>> rootToPath) {
return new ItemSqlMapper(ctx -> new UriItemFilterProcessor(ctx, rootToPath));
}

private final NumberPath<Integer> path;

private UriItemFilterProcessor(
SqlQueryContext<?, ?, ?> context,
Function<EntityPath<?>, NumberPath<Integer>> rootToPath) {
super(context);
this.path = rootToPath.apply(context.path());
}

@Override
public Predicate process(PropertyValueFilter<String> filter) throws QueryException {
return createBinaryCondition(filter, path,
ValueFilterValues.from(filter,
u -> ((SqaleRepoContext) context.sqlRepoContext()).searchCachedUriId(u)));
}
}
Expand Up @@ -73,6 +73,8 @@ public class QObject<T extends MObject> extends FlexibleRelationalPathBase<T> {
ColumnMetadata.named("tenantRef_relation_id").ofType(Types.INTEGER);
public static final ColumnMetadata LIFECYCLE_STATE =
ColumnMetadata.named("lifecycleState").ofType(Types.VARCHAR).withSize(255);
public static final ColumnMetadata CID_SEQ =
ColumnMetadata.named("cid_seq").ofType(Types.INTEGER).notNull();
public static final ColumnMetadata VERSION =
ColumnMetadata.named("version").ofType(Types.INTEGER).notNull();
public static final ColumnMetadata EXT =
Expand Down Expand Up @@ -110,6 +112,7 @@ public class QObject<T extends MObject> extends FlexibleRelationalPathBase<T> {
public final NumberPath<Integer> tenantRefRelationId =
createInteger("tenantRefRelationId", TENANT_REF_RELATION_ID);
public final StringPath lifecycleState = createString("lifecycleState", LIFECYCLE_STATE);
public final NumberPath<Integer> containerIdSeq = createInteger("containerIdSeq", CID_SEQ);
public final NumberPath<Integer> version = createInteger("version", VERSION);
public final ArrayPath<byte[], Byte> ext = createByteArray("ext", EXT); // TODO is byte[] the right type?

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

import static com.evolveum.midpoint.repo.sqlbase.mapping.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.repo.sqlbase.mapping.item.SimpleItemFilterProcessor.uuidMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType.*;

Expand All @@ -16,15 +17,18 @@

import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.repo.sqale.RefItemFilterProcessor;
import com.evolveum.midpoint.repo.sqale.UriItemFilterProcessor;
import com.evolveum.midpoint.repo.sqale.qmodel.SqaleModelMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.assignment.QAssignment;
import com.evolveum.midpoint.repo.sqlbase.SqlTransformerContext;
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;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.TimestampItemFilterProcessor;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.MetadataType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

/**
Expand All @@ -50,18 +54,31 @@ protected QObjectMapping(
addItemMapping(F_NAME,
PolyStringItemFilterProcessor.mapper(
path(q -> q.nameOrig), path(q -> q.nameNorm)));

nestedMapping(F_METADATA, MetadataType.class)
.addItemMapping(MetadataType.F_CREATOR_REF, RefItemFilterProcessor.mapper(
path(q -> q.creatorRefTargetOid),
path(q -> q.creatorRefTargetType),
path(q -> q.creatorRefRelationId)))
.addItemMapping(MetadataType.F_CREATE_CHANNEL,
UriItemFilterProcessor.mapper(path(q -> q.createChannelId)))
.addItemMapping(MetadataType.F_CREATE_TIMESTAMP,
TimestampItemFilterProcessor.mapper(path(q -> q.createTimestamp)))
.addItemMapping(MetadataType.F_MODIFIER_REF, RefItemFilterProcessor.mapper(
path(q -> q.modifierRefTargetOid),
path(q -> q.modifierRefTargetType),
path(q -> q.modifierRefRelationId)))
.addItemMapping(MetadataType.F_MODIFY_CHANNEL,
UriItemFilterProcessor.mapper(path(q -> q.modifyChannelId)))
.addItemMapping(MetadataType.F_MODIFY_TIMESTAMP,
TimestampItemFilterProcessor.mapper(path(q -> q.modifyTimestamp)));
addItemMapping(F_TENANT_REF, RefItemFilterProcessor.mapper(
path(q -> q.tenantRefTargetOid),
path(q -> q.tenantRefTargetType),
path(q -> q.tenantRefRelationId)));
// version is not mapped for queries or deltas, it's managed by repo explicitly

// TODO mappings
addItemMapping(F_LIFECYCLE_STATE, stringMapper(path(q -> q.lifecycleState)));
// version/cid_seq is not mapped for queries or deltas, it's managed by repo explicitly
// TODO ext mapping can't be done statically

addRelationResolver(F_METADATA,
new TableRelationResolver<>(QAssignment.class,
joinOn((o, a) -> o.oid.eq(a.ownerOid))));
addRelationResolver(AssignmentHolderType.F_ASSIGNMENT,
new TableRelationResolver<>(QAssignment.class,
joinOn((o, a) -> o.oid.eq(a.ownerOid))));
Expand Down

0 comments on commit 102d5e0

Please sign in to comment.