Skip to content

Commit

Permalink
reference iterative search: fixed order by ref target item cases
Browse files Browse the repository at this point in the history
SqaleRepoSearchReferencesIterativeTest was added to test suite
  • Loading branch information
virgo47 committed Feb 6, 2023
1 parent 30cf241 commit 4615257
Show file tree
Hide file tree
Showing 3 changed files with 287 additions and 70 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.impl.query.OwnedByFilterImpl;
import com.evolveum.midpoint.prism.impl.query.RefFilterImpl;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.query.*;
import com.evolveum.midpoint.prism.query.builder.S_ConditionEntry;
Expand Down Expand Up @@ -72,8 +73,8 @@ public SearchResultMetadata execute(
+ " by multiple paths (yet): " + providedOrdering);
}

ObjectQuery pagedQuery = getQueryFactory().createQuery();
ObjectPaging paging = getQueryFactory().createPaging();
ObjectQuery pagedQuery = queryFactory().createQuery();
ObjectPaging paging = queryFactory().createPaging();
if (originalPaging != null && originalPaging.getOrderingInstructions() != null) {
originalPaging.getOrderingInstructions().forEach(o ->
paging.addOrderingInstruction(o.getOrderBy(), o.getDirection()));
Expand Down Expand Up @@ -116,24 +117,23 @@ public SearchResultMetadata execute(
if (!handler.handle(object, operationResult)) {
return new SearchResultMetadata()
.approxNumberOfAllResults(handledObjectsTotal + 1)
.pagingCookie(lastProcessedRef.getOid())
.pagingCookie(pagingCookie(lastProcessedRef))
.partialResults(true);
}
handledObjectsTotal += 1;

if (maxSize != null && handledObjectsTotal >= maxSize) {
return new SearchResultMetadata()
.approxNumberOfAllResults(handledObjectsTotal)
.pagingCookie(lastProcessedRef.getOid());
.pagingCookie(pagingCookie(lastProcessedRef));
}
}

if (objects.isEmpty() || objects.size() < pageSize) {
return new SearchResultMetadata()
.approxNumberOfAllResults(handledObjectsTotal)
.pagingCookie(lastProcessedRef != null
// TODO owner OID + relation
? lastProcessedRef.getOid() : null);
? pagingCookie(lastProcessedRef) : null);
}
pagedQuery.getPaging().setOffset(null);
}
Expand All @@ -145,6 +145,11 @@ public SearchResultMetadata execute(
}
}

private String pagingCookie(ObjectReferenceType lastProcessedRef) {
return Objects.requireNonNull(PrismValueUtil.getParentObject(lastProcessedRef.asReferenceValue()))
.getOid() + '|' + lastProcessedRef.getRelation() + '|' + lastProcessedRef.getOid();
}

/**
* This one is more complicated than for container/object iterative searches, because:
*
Expand Down Expand Up @@ -195,12 +200,55 @@ private ObjectFilter lastRefFilterWithTargetItemOrder(
ObjectReferenceType lastProcessedRef, ObjectFilter filter, ObjectOrdering objectOrdering)
throws SchemaException, ObjectNotFoundException {
PrismReferenceValue refValue = lastProcessedRef.asReferenceValue();
if (refValue.getObject() == null) {
// TODO find the real value of the item for comparison condition
PrismObject<?> target = refValue.getObject();
if (target == null) {
Class<? extends ObjectType> targetType = repoService.sqlRepoContext().qNameToSchemaClass(refValue.getTargetType());
ObjectType target = repoService.readByOid(targetType, SqaleUtils.oidToUuid(refValue.getOid()), null);
target = repoService.readByOid(targetType, SqaleUtils.oidToUuid(refValue.getOid()), null).asPrismObject();
}

ItemPath itemPathInTarget = objectOrdering.getOrderBy().rest(); // skipping the dereference (@) part
Item<PrismValue, ItemDefinition<?>> orderByItem = target.findItem(itemPathInTarget);

if (filter instanceof OwnedByFilter) {
// There is no ref filter and we will add it to enforce strict ordering.
return queryFactory().createAnd(filter,
// Not really equal in this case. ;-)
RefFilterImpl.createReferenceEqual(
ItemPath.SELF_PATH,
lastProcessedRef.asReferenceValue().getDefinition(),
(Collection<PrismReferenceValue>) null,
constructStrictReferenceOrderingCondition(
lastProcessedRef, orderByItem, itemPathInTarget, objectOrdering)));
} else if (filter instanceof AndFilter) {
// There is/are some ref filter(s) and we will amend it/them to enforce strict ordering.
AndFilter andFilter = queryFactory().createAnd();
for (ObjectFilter condition : ((AndFilter) filter).getConditions()) {
if (condition instanceof RefFilter) {
andFilter.addCondition(processRefForTargetItemOrder(
lastProcessedRef, (RefFilter) condition, objectOrdering, itemPathInTarget, orderByItem));
} else {
andFilter.addCondition(condition);
}
}
return andFilter;
} else {
throw new IllegalArgumentException(
"Filter for reference search iteration must by either OWNED-BY or AND."
+ " Used filter: " + filter);
}
return filter; // TODO
}

private ObjectFilter processRefForTargetItemOrder(
ObjectReferenceType lastProcessedRef, RefFilter filter, ObjectOrdering objectOrdering,
ItemPath itemPathInTarget, Item<PrismValue, ItemDefinition<?>> orderByItem) {
ObjectFilter targetFilter = filter.getFilter();
ObjectFilter strictOrderingCondition = constructStrictReferenceOrderingCondition(
lastProcessedRef, orderByItem, itemPathInTarget, objectOrdering);
return RefFilterImpl.createReferenceEqual(filter.getPath(), filter.getDefinition(),
PrismValueCollectionsUtil.cloneCollection(filter.getValues()), // clone to avoid parent reset error
targetFilter == null
? strictOrderingCondition
: queryFactory().createAnd(targetFilter, strictOrderingCondition));
}

private ObjectFilter processParentItemOrder(
Expand All @@ -209,7 +257,7 @@ private ObjectFilter processParentItemOrder(
return processOwnedByForParentItemOrder(lastProcessedRef, (OwnedByFilter) filter, objectOrdering);
} else if (filter instanceof AndFilter) {
// Modify the owned-by filter just like above, the rest stays as-is.
AndFilter andFilter = getQueryFactory().createAnd();
AndFilter andFilter = queryFactory().createAnd();
for (ObjectFilter condition : ((AndFilter) filter).getConditions()) {
if (condition instanceof OwnedByFilter) {
andFilter.addCondition(processOwnedByForParentItemOrder(
Expand Down Expand Up @@ -241,7 +289,7 @@ private ObjectFilter processOwnedByForParentItemOrder(
lastProcessedRef, orderByItem, itemPathInOwner, objectOrdering));
} else {
return OwnedByFilterImpl.create(filter.getType(), filter.getPath(),
getQueryFactory().createAnd(ownerFilter,
queryFactory().createAnd(ownerFilter,
constructStrictReferenceOrderingCondition(
lastProcessedRef, orderByItem, itemPathInOwner, objectOrdering)));
}
Expand Down Expand Up @@ -313,7 +361,7 @@ private static RefItemFilterProcessor.ReferenceRowValue lastProcessedRefToRowVal
}

@NotNull
private QueryFactory getQueryFactory() {
private QueryFactory queryFactory() {
return repoService.prismContext().queryFactory();
}
}

0 comments on commit 4615257

Please sign in to comment.