Skip to content

Commit

Permalink
Support DISTINCT option in repo diag requests
Browse files Browse the repository at this point in the history
This is support during execution. What is missing is the GUI part.
  • Loading branch information
mederly committed Oct 26, 2018
1 parent 9dfae57 commit 8e4264e
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 9 deletions.
Expand Up @@ -27,10 +27,7 @@
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.QueryJaxbConvertor;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.RepositoryQueryDiagRequest;
import com.evolveum.midpoint.schema.RepositoryQueryDiagResponse;
import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
import com.evolveum.midpoint.schema.*;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
Expand Down Expand Up @@ -79,6 +76,9 @@
import java.io.InputStream;
import java.util.*;

import static com.evolveum.midpoint.schema.GetOperationOptions.*;
import static com.evolveum.midpoint.schema.SelectorOptions.createCollection;

/**
* @author lazyman
* @author mederly
Expand Down Expand Up @@ -367,7 +367,7 @@ private void useInObjectListPerformed(AjaxRequestTarget target) {
Task task = createSimpleTask(OPERATION_CHECK_QUERY);
OperationResult result = task.getResult();
try {
updateRequestWithMidpointQuery(request, dto.getObjectType(), queryText, task, result); // just to parse the query
updateRequestWithMidpointQuery(request, dto.getObjectType(), queryText, dto.isDistinct(), task, result); // just to parse the query

ObjectFilter parsedFilter = request.getQuery().getFilter();
String filterAsString;
Expand Down Expand Up @@ -433,7 +433,7 @@ private void queryPerformed(Action action, AjaxRequestTarget target) {
case EXECUTE_MIDPOINT:
queryPresent = StringUtils.isNotBlank(dto.getMidPointQuery());
if (queryPresent) {
updateRequestWithMidpointQuery(request, dto.getObjectType(), dto.getMidPointQuery(), task, result);
updateRequestWithMidpointQuery(request, dto.getObjectType(), dto.getMidPointQuery(), dto.isDistinct(), task, result);
}
break;
default:
Expand All @@ -459,7 +459,7 @@ private void queryPerformed(Action action, AjaxRequestTarget target) {
if (action != Action.TRANSLATE_ONLY) {
// not an admin, so have to fetch objects via model
queryResult = getModelService().searchObjects(request.getType(), request.getQuery(),
GetOperationOptions.createRawCollection(), task, result);
createRawCollection(), task, result);
} else {
queryResult = null;
}
Expand Down Expand Up @@ -501,7 +501,7 @@ private void warnNoQuery(AjaxRequestTarget target) {
}

private void updateRequestWithMidpointQuery(RepositoryQueryDiagRequest request, QName objectType, String queryText,
Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException {
boolean distinct, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException {
PrismContext prismContext = getPrismContext();
if (objectType == null) {
objectType = ObjectType.COMPLEX_TYPE;
Expand All @@ -517,6 +517,9 @@ private void updateRequestWithMidpointQuery(RepositoryQueryDiagRequest request,
ObjectQuery queryWithExprEvaluated = ExpressionUtil.evaluateQueryExpressions(objectQuery, new ExpressionVariables(),
getExpressionFactory(), getPrismContext(), "evaluate query expressions", task, result);
request.setQuery(queryWithExprEvaluated);

Collection<SelectorOptions<GetOperationOptions>> options = distinct ? createCollection(createDistinct()) : null;
request.setOptions(options);
}

private String formatQueryResult(List<?> objects) {
Expand Down
Expand Up @@ -39,6 +39,7 @@ public class RepoQueryDto implements Serializable {
private String hibernateParameters = "";
private String queryResultText = EMPTY_RESULT;
private Object queryResultObject = null;
private boolean distinct;

public QName getObjectType() {
return objectType;
Expand Down Expand Up @@ -91,4 +92,12 @@ public void setQueryResultObject(Object queryResultObject) {
public void resetQueryResultText() {
setQueryResultText(EMPTY_RESULT);
}

public boolean isDistinct() {
return distinct;
}

public void setDistinct(boolean distinct) {
this.distinct = distinct;
}
}
Expand Up @@ -20,6 +20,7 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

import java.io.Serializable;
import java.util.Collection;

/**
* Query diagnostics request: contains query to be executed (or at least translated) and some options.
Expand All @@ -32,6 +33,7 @@ public class RepositoryQueryDiagRequest implements Serializable {

private Class<? extends ObjectType> type;
private ObjectQuery query;
private Collection<SelectorOptions<GetOperationOptions>> options;

private Serializable implementationLevelQuery; // this is used if specified

Expand All @@ -53,6 +55,14 @@ public void setQuery(ObjectQuery query) {
this.query = query;
}

public Collection<SelectorOptions<GetOperationOptions>> getOptions() {
return options;
}

public void setOptions(Collection<SelectorOptions<GetOperationOptions>> options) {
this.options = options;
}

public Serializable getImplementationLevelQuery() {
return implementationLevelQuery;
}
Expand Down
Expand Up @@ -970,7 +970,7 @@ public RepositoryQueryDiagResponse executeQueryDiagnosticsRequest(RepositoryQuer
final boolean isMidpointQuery = request.getImplementationLevelQuery() == null;
if (isMidpointQuery) {
QueryEngine2 engine = new QueryEngine2(getConfiguration(), extItemDictionary, prismContext, relationRegistry);
RQueryImpl rQuery = (RQueryImpl) engine.interpret(request.getQuery(), request.getType(), null, false, session);
RQueryImpl rQuery = (RQueryImpl) engine.interpret(request.getQuery(), request.getType(), request.getOptions(), false, session);
query = rQuery.getQuery();
implementationLevelQuery = query.getQueryString();
implementationLevelQueryParameters = new HashMap<>();
Expand Down

0 comments on commit 8e4264e

Please sign in to comment.