Skip to content

Commit

Permalink
Fixed MID-3463: Lookup table values are not sorted (at least not always)
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Dec 6, 2016
1 parent 47de9ae commit 76d1c5c
Show file tree
Hide file tree
Showing 7 changed files with 33 additions and 27 deletions.
Expand Up @@ -18,10 +18,14 @@

import java.util.*;

import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.OrderDirection;
import com.evolveum.midpoint.schema.RelationalValueSearchQuery;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.task.api.TaskManager;
import com.evolveum.midpoint.web.page.login.PageLogin;
import com.evolveum.midpoint.web.security.MidPointApplication;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang.LocaleUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
Expand Down Expand Up @@ -55,13 +59,6 @@
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.security.SecurityUtils;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;

import org.apache.wicket.RestartResponseException;
import org.apache.wicket.Session;
Expand Down Expand Up @@ -559,4 +556,10 @@ public static <O extends ObjectType> PrismObject<O> reconstructObject(Class<O> t
return null;
}

public static Collection<SelectorOptions<GetOperationOptions>> createLookupTableRetrieveOptions() {
return SelectorOptions.createCollection(LookupTableType.F_ROW,
GetOperationOptions.createRetrieve(
new RelationalValueSearchQuery(
ObjectPaging.createPaging(LookupTableRowType.F_LABEL, OrderDirection.ASCENDING))));
}
}
Expand Up @@ -30,7 +30,6 @@
import com.evolveum.midpoint.prism.xml.XsdTypeMapper;
import com.evolveum.midpoint.schema.DeltaConvertor;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.RetrieveOption;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.processor.ResourceAttribute;
Expand Down Expand Up @@ -463,8 +462,7 @@ private Panel createTypedInputComponent(String id) {
Task task = pageBase.createSimpleTask("loadLookupTable");
OperationResult result = task.getResult();

Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(LookupTableType.F_ROW,
GetOperationOptions.createRetrieve(RetrieveOption.INCLUDE));
Collection<SelectorOptions<GetOperationOptions>> options = WebModelServiceUtils.createLookupTableRetrieveOptions();
final PrismObject<LookupTableType> lookupTable = WebModelServiceUtils.loadObject(LookupTableType.class,
lookupTableUid, options, pageBase, task, result);

Expand Down Expand Up @@ -596,8 +594,7 @@ public Object getObject() {
Task task = pageBase.createSimpleTask("loadLookupTable");
OperationResult result = task.getResult();

Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(LookupTableType.F_ROW,
GetOperationOptions.createRetrieve(RetrieveOption.INCLUDE));
Collection<SelectorOptions<GetOperationOptions>> options = WebModelServiceUtils.createLookupTableRetrieveOptions();
final PrismObject<LookupTableType> lookupTable = WebModelServiceUtils.loadObject(LookupTableType.class,
lookupTableUid, options, pageBase, task, result);

Expand Down
Expand Up @@ -24,7 +24,6 @@
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.RetrieveOption;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
Expand Down Expand Up @@ -236,8 +235,7 @@ private PrismObject<LookupTableType> findLookupTable(ItemDefinition definition)
Task task = page.createSimpleTask("loadLookupTable");
OperationResult result = task.getResult();

Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(LookupTableType.F_ROW,
GetOperationOptions.createRetrieve(RetrieveOption.INCLUDE));
Collection<SelectorOptions<GetOperationOptions>> options = WebModelServiceUtils.createLookupTableRetrieveOptions();
return WebModelServiceUtils.loadObject(LookupTableType.class, lookupTableUid, options, page, task, result);
}

Expand Down
Expand Up @@ -19,13 +19,13 @@
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.model.api.ModelExecuteOptions;
import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.RetrieveOption;
import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.OrderDirection;
import com.evolveum.midpoint.schema.*;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.task.api.Task;
Expand Down Expand Up @@ -153,7 +153,9 @@ private ObjectViewDto loadObject() {
}
if (LookupTableType.class.isAssignableFrom(type)) {
options.add(SelectorOptions.create(LookupTableType.F_ROW,
GetOperationOptions.createRetrieve(RetrieveOption.INCLUDE)));
GetOperationOptions.createRetrieve(
new RelationalValueSearchQuery(
ObjectPaging.createPaging(PrismConstants.T_ID, OrderDirection.ASCENDING)))));
}
if (AccessCertificationCampaignType.class.isAssignableFrom(type)) {
options.add(SelectorOptions.create(AccessCertificationCampaignType.F_CASE,
Expand Down
Expand Up @@ -30,18 +30,20 @@ public class RelationalValueSearchQuery implements Serializable {
private String searchValue;
private RelationalValueSearchType searchType;
private ObjectPaging paging;


public RelationalValueSearchQuery(ObjectPaging paging) {
this.paging = paging;
}

public RelationalValueSearchQuery(QName column, String searchValue, RelationalValueSearchType searchType,
ObjectPaging paging) {
super();
this.column = column;
this.searchValue = searchValue;
this.searchType = searchType;
this.paging = paging;
}

public RelationalValueSearchQuery(QName column, String searchValue, RelationalValueSearchType searchType) {
super();
this.column = column;
this.searchValue = searchValue;
this.searchType = searchType;
Expand Down
Expand Up @@ -65,10 +65,11 @@ public String getOwnerOid() {
return ownerOid;
}

public static final String ID_COLUMN_NAME = "id";
@Id
@GeneratedValue(generator = "ContainerIdGenerator")
@GenericGenerator(name = "ContainerIdGenerator", strategy = "com.evolveum.midpoint.repo.sql.util.ContainerIdGenerator")
@Column(name = "id")
@Column(name = ID_COLUMN_NAME)
@IdQueryProperty
public Integer getId() {
return id;
Expand Down
Expand Up @@ -225,10 +225,13 @@ public <T extends ObjectType> void updateLoadedLookupTable(PrismObject<T> object

ItemPath orderByPath = paging.getOrderBy();
if (paging.getDirection() != null && orderByPath != null && !orderByPath.isEmpty()) {
if (orderByPath.size() > 1 || !(orderByPath.first() instanceof NameItemPathSegment)) {
throw new SchemaException("OrderBy has to consist of just one naming segment");
if (orderByPath.size() > 1 ||
!(orderByPath.first() instanceof NameItemPathSegment) && !(orderByPath.first() instanceof IdentifierPathSegment)) {
throw new SchemaException("OrderBy has to consist of just one naming or identifier segment");
}
String orderBy = ((NameItemPathSegment) (orderByPath.first())).getName().getLocalPart();
ItemPathSegment first = orderByPath.first();
String orderBy = first instanceof NameItemPathSegment ?
((NameItemPathSegment) first).getName().getLocalPart() : RLookupTableRow.ID_COLUMN_NAME;
switch (paging.getDirection()) {
case ASCENDING:
criteria.addOrder(Order.asc(orderBy));
Expand Down

0 comments on commit 76d1c5c

Please sign in to comment.