Skip to content

Commit

Permalink
Filters cleanup. Interim commit.
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Oct 12, 2016
1 parent fd7095a commit c31a693
Show file tree
Hide file tree
Showing 21 changed files with 169 additions and 249 deletions.
Expand Up @@ -8,6 +8,7 @@
import com.evolveum.midpoint.model.api.RoleSelectionSpecification;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.query.*;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.logging.LoggingUtils;
Expand Down Expand Up @@ -257,14 +258,10 @@ private ObjectQuery createMemberQuery(QName focusTypeClass) {
}

private ObjectQuery createMemberQuery(String oid) {
ObjectFilter filter = OrgFilter.createOrg(oid, OrgFilter.Scope.ONE_LEVEL);

TypeFilter roleTypeFilter = TypeFilter.createType(RoleType.COMPLEX_TYPE, filter);
TypeFilter orgTypeFilter = TypeFilter.createType(OrgType.COMPLEX_TYPE, filter);
TypeFilter serviceTypeFilter = TypeFilter.createType(ServiceType.COMPLEX_TYPE, filter);
ObjectQuery query = ObjectQuery.createObjectQuery(OrFilter.createOr(roleTypeFilter, orgTypeFilter, serviceTypeFilter));
return query;

return QueryBuilder.queryFor(ObjectType.class, getPageBase().getPrismContext())
.type(AbstractRoleType.class)
.isDirectChildOf(oid)
.build();
}

private void refreshItemsPanel() {
Expand Down
Expand Up @@ -215,13 +215,15 @@ private ObjectFilter createFilterForSearchValue(SearchItem item, DisplayableValu
.item(path, propDef).eq(value).buildFilter();
} else if (DOMUtil.XSD_STRING.equals(propDef.getTypeName())) {
String text = (String) searchValue.getValue();
return SubstringFilter.createSubstring(path, propDef, StringIgnoreCaseMatchingRule.NAME, text);
return QueryBuilder.queryFor(ObjectType.class, ctx)
.item(path, propDef).contains(text).matchingCaseIgnore().buildFilter();
} else if (SchemaConstants.T_POLY_STRING_TYPE.equals(propDef.getTypeName())) {
//we're looking for string value, therefore substring filter should be used
String text = (String) searchValue.getValue();
PolyStringNormalizer normalizer = ctx.getDefaultPolyStringNormalizer();
String value = normalizer.normalize(text);
return SubstringFilter.createSubstring(path, propDef, PolyStringNormMatchingRule.NAME, value);
return QueryBuilder.queryFor(ObjectType.class, ctx)
.item(path, propDef).contains(text).matchingNorm().buildFilter();
}

//we don't know how to create filter from search item, should not happen, ha ha ha :)
Expand Down
Expand Up @@ -23,8 +23,10 @@
import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule;
import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer;
import com.evolveum.midpoint.prism.query.AndFilter;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.SubstringFilter;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.util.logging.LoggingUtils;
Expand Down Expand Up @@ -300,10 +302,11 @@ private ObjectQuery createObjectQuery() {
PolyStringNormalizer normalizer = prismContext.getDefaultPolyStringNormalizer();
String normalized = normalizer.normalize(dto.getText());

SubstringFilter filter = SubstringFilter.createSubstring(context.getSearchProperty(), objectType, prismContext,
PolyStringNormMatchingRule.NAME, normalized);
ObjectFilter filter = QueryBuilder.queryFor(objectType, prismContext)
.item(context.getSearchProperty()).contains(normalized).matchingNorm()
.buildFilter();

if(context.getDataProviderQuery() != null){
if (context.getDataProviderQuery() != null) {
AndFilter and = AndFilter.createAnd(context.getDataProviderQuery().getFilter(), filter);
query = ObjectQuery.createObjectQuery(and);
} else {
Expand Down
Expand Up @@ -23,6 +23,7 @@
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.ajax.AjaxRequestTarget;
Expand Down Expand Up @@ -316,12 +317,10 @@ private <T extends ObjectType> List<LookupTableRowType> createLookupTableRows(Ja
Task task = createSimpleTask(OPERATION_LOAD_RESOURCES);

Collection<PrismObject<T>> objects;
SubstringFilter filter = SubstringFilter.createSubstring(new QName(SchemaConstants.NS_C, pLabel), targetType, getPrismContext(), input);
filter.setMatchingRule(new QName(SchemaConstants.NS_MATCHING_RULE, "origIgnoreCase"));
filter.setAnchorStart(true); // =startsWith
ObjectQuery query = ObjectQuery.createObjectQuery(filter);
query.setPaging(ObjectPaging.createPaging(0, AUTO_COMPLETE_BOX_SIZE));

ObjectQuery query = QueryBuilder.queryFor(targetType, getPrismContext())
.item(new QName(SchemaConstants.NS_C, pLabel)).startsWith(input).matchingCaseIgnore()
.maxSize(AUTO_COMPLETE_BOX_SIZE)
.build();
try {
objects = modelService.searchObjects(targetType, query, SelectorOptions.createCollection(GetOperationOptions.createNoFetch()), task, result);

Expand Down
Expand Up @@ -20,6 +20,9 @@
import java.util.Iterator;
import java.util.List;

import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
Expand Down Expand Up @@ -158,42 +161,38 @@ protected ObjectQuery createOrgChildQuery() {
if (StringUtils.isBlank(object)) {
object = null;
}

OrgFilter org;

PageBase page = getPageBase();
PrismContext context = page.getPrismContext();

S_AtomicFilterExit q;
if (object == null || SEARCH_SCOPE_ONE.equals(scope)) {
org = OrgFilter.createOrg(oid, OrgFilter.Scope.ONE_LEVEL);
q = QueryBuilder.queryFor(OrgType.class, context)
.isDirectChildOf(oid);
} else {
org = OrgFilter.createOrg(oid, OrgFilter.Scope.SUBTREE);
q = QueryBuilder.queryFor(OrgType.class, context)
.isChildOf(oid);
}

if (object == null) {
return ObjectQuery.createObjectQuery(org);
return q.build();
}

PageBase page = getPageBase();
PrismContext context = page.getPrismContext();

PolyStringNormalizer normalizer = context.getDefaultPolyStringNormalizer();
String normalizedString = normalizer.normalize(object);
if (StringUtils.isEmpty(normalizedString)) {
return ObjectQuery.createObjectQuery(org);
return q.build();
}

SubstringFilter substringName = SubstringFilter.createSubstring(OrgType.F_NAME, OrgType.class, context,
PolyStringNormMatchingRule.NAME, normalizedString);

SubstringFilter substringDisplayName = SubstringFilter.createSubstring(OrgType.F_DISPLAY_NAME, OrgType.class, context,
PolyStringNormMatchingRule.NAME, normalizedString);
OrFilter orName = OrFilter.createOr(substringName, substringDisplayName);
AndFilter and = AndFilter.createAnd(org, orName);
ObjectQuery query = ObjectQuery.createObjectQuery(and);

if(LOGGER.isTraceEnabled()){
ObjectQuery query = q.and().block()
.item(OrgType.F_NAME).containsPoly(normalizedString).matchingNorm()
.or().item(OrgType.F_DISPLAY_NAME).containsPoly(normalizedString).matchingNorm()
.build();

if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Searching child orgs of org {} with query:\n{}", oid, query.debugDump());
}

return query;
}


}
Expand Up @@ -26,6 +26,8 @@
import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry;
import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang.Validate;
import org.apache.wicket.Component;
Expand Down Expand Up @@ -449,11 +451,10 @@ private MainObjectListPanel<ObjectType> getMemberTable() {
createComponentPath(ID_FORM, ID_CONTAINER_MEMBER, ID_MEMBER_TABLE));
}

private QName getSearchType() {
private ObjectTypes getSearchType() {
DropDownChoice<ObjectTypes> searchByTypeChoice = (DropDownChoice<ObjectTypes>) get(
createComponentPath(ID_FORM, ID_SEARCH_BY_TYPE));
ObjectTypes typeModel = searchByTypeChoice.getModelObject();
return typeModel.getTypeQName();
return searchByTypeChoice.getModelObject();
}

private ObjectQuery createManagerQuery() {
Expand Down Expand Up @@ -561,37 +562,27 @@ protected void recomputeManagersPerformed(QueryScope scope, AjaxRequestTarget ta

@Override
protected ObjectQuery createMemberQuery() {
ObjectQuery query = null;

String oid = getModelObject().getOid();

List<ObjectFilter> filters = new ArrayList<>();

DropDownChoice<String> searchScopeChoice = (DropDownChoice<String>) get(
createComponentPath(ID_FORM, ID_SEARCH_SCOPE));
String scope = searchScopeChoice.getModelObject();

QName searchType = getSearchType();

OrgFilter org;
ObjectTypes searchType = getSearchType();
S_FilterEntryOrEmpty q = QueryBuilder.queryFor(ObjectType.class, getPageBase().getPrismContext());
if (!searchType.equals(ObjectTypes.OBJECT)) {
q = q.type(searchType.getClassDefinition());
}
ObjectQuery query;
if (SEARCH_SCOPE_ONE.equals(scope)) {
filters.add(OrgFilter.createOrg(oid, OrgFilter.Scope.ONE_LEVEL));
query = q.isDirectChildOf(oid).build();
} else {
filters.add(OrgFilter.createOrg(oid, OrgFilter.Scope.SUBTREE));
query = q.isChildOf(oid).build();
}

query = ObjectQuery.createObjectQuery(AndFilter.createAnd(filters));

if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Searching members of org {} with query:\n{}", oid, query.debugDump());
}

if (searchType.equals(ObjectType.COMPLEX_TYPE)) {
return query;
}

return ObjectQuery.createObjectQuery(TypeFilter.createType(searchType, query.getFilter()));

return query;
}

private ObjectQuery createQueryForMemberAction(QueryScope scope, QName orgRelation, boolean isFocus) {
Expand Down Expand Up @@ -634,9 +625,9 @@ private boolean satisfyConstraints(boolean isFocus, Class<? extends ObjectType>

private ObjectQuery createQueryForAll(QueryScope scope, boolean isFocus, QName relation) {
OrgType org = getModelObject();

return ObjectQuery.createObjectQuery(OrgFilter.createOrg(org.getOid(), getScope(scope)));

return QueryBuilder.queryFor(ObjectType.class, getPageBase().getPrismContext())
.isInScopeOf(org.getOid(), getScope(scope))
.build();
}

private Scope getScope(QueryScope queryScope) {
Expand Down
Expand Up @@ -23,6 +23,7 @@
import java.util.List;
import java.util.Set;

import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import org.apache.wicket.Component;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.extensions.markup.html.repeater.util.SortableTreeProvider;
Expand Down Expand Up @@ -99,10 +100,10 @@ public Iterator<? extends SelectableBean<OrgType>> getChildren(SelectableBean<Or
LOGGER.debug("Loading children for {}", new Object[]{node});
Iterator<SelectableBean<OrgType>> iterator = null;

OrgFilter orgFilter = OrgFilter.createOrg(node.getValue().getOid(), OrgFilter.Scope.ONE_LEVEL);
ObjectQuery query = ObjectQuery.createObjectQuery(orgFilter);
query.setPaging(ObjectPaging.createPaging(null, null, ObjectType.F_NAME, OrderDirection.ASCENDING));

ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, getPageBase().getPrismContext())
.isDirectChildOf(node.getValue().getOid())
.asc(ObjectType.F_NAME)
.build();
OperationResult result = new OperationResult(LOAD_ORG_UNITS);
try {
// Collection<SelectorOptions<GetOperationOptions>> options = WebModelServiceUtils.createOptionsForParentOrgRefs();
Expand Down
Expand Up @@ -29,6 +29,7 @@
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.OrgFilter;
import com.evolveum.midpoint.prism.query.OrgFilter.Scope;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.task.api.Task;
Expand Down Expand Up @@ -425,12 +426,14 @@ public void yesPerformed(AjaxRequestTarget target) {
}

private boolean hasChildren(SelectableBean<OrgType> orgToDelete) {
OrgFilter childrenFilter = OrgFilter.createOrg(orgToDelete.getValue().getOid(), Scope.SUBTREE);
ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, getPageBase().getPrismContext())
.isChildOf(orgToDelete.getValue().getOid())
.build();
Task task = getPageBase().createSimpleTask(OPERATION_COUNT_CHILDREN);
OperationResult result = new OperationResult(OPERATION_COUNT_CHILDREN);
try {
int count = getPageBase().getModelService().countObjects(ObjectType.class,
ObjectQuery.createObjectQuery(childrenFilter), null, task, result);
query, null, task, result);
return (count > 0);
} catch (SchemaException | ObjectNotFoundException | SecurityViolationException
| ConfigurationException | CommunicationException e) {
Expand Down
Expand Up @@ -260,8 +260,10 @@ protected void copyValues(PrismValue clone) {
@NotNull
public static <T extends PrismValue> Collection<T> cloneCollection(Collection<T> values) {
Collection<T> clones = new ArrayList<T>();
for (T value: values) {
clones.add((T)value.clone());
if (values != null) {
for (T value : values) {
clones.add((T) value.clone());
}
}
return clones;
}
Expand Down
Expand Up @@ -505,7 +505,17 @@ private static <C extends Containerable> SubstringFilter parseSubstringFilter(Ma
if (preliminaryParsingOnly) {
return null;
} else {
return SubstringFilter.createSubstring(itemPath, (PrismProperty) item, matchingRule, anchorStart, anchorEnd);
List values = item.getValues();
Object realValue;
if (values == null || values.isEmpty()) {
realValue = null; // TODO throw an exception?
} else if (values.size() > 1) {
throw new IllegalArgumentException("Expected at most 1 value, got " + values);
} else {
realValue = ((PrismPropertyValue) values.get(0)).getValue();
}
return SubstringFilter.createSubstring(itemPath, (PrismPropertyDefinition) itemDefinition,
prismContext, matchingRule, realValue, anchorStart, anchorEnd);
}
}

Expand Down
Expand Up @@ -34,12 +34,12 @@ public enum Scope {
private Scope scope;
private boolean root;

public OrgFilter(PrismReferenceValue baseOrgRef, Scope scope) {
private OrgFilter(PrismReferenceValue baseOrgRef, Scope scope) {
this.baseOrgRef = baseOrgRef;
this.scope = scope != null ? scope : Scope.SUBTREE;
}

public OrgFilter() {
private OrgFilter() {
}

public static OrgFilter createOrg(PrismReferenceValue baseOrgRef, Scope scope) {
Expand Down
Expand Up @@ -74,18 +74,10 @@ protected PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition d
this(path, definition, matchingRule, (List<V>) null);
}

PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable ExpressionWrapper expression) {
this(path, definition, null, null, expression);
}

PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable ExpressionWrapper expression, @Nullable List<V> values) {
this(path, definition, null, values, expression);
}

PropertyValueFilter(ItemPath path, ItemDefinition definition, QName matchingRule, ExpressionWrapper expression) {
this(path, definition, matchingRule, null, expression);
}

static protected <T> List<PrismPropertyValue<T>> createPropertyList(@NotNull PrismPropertyDefinition itemDefinition, @Nullable PrismPropertyValue<T> pValue) {
List<PrismPropertyValue<T>> pValues = new ArrayList<>();
if (pValue == null) {
Expand Down Expand Up @@ -120,6 +112,14 @@ static List<PrismPropertyValue<?>> createPropertyListFromArray(PrismContext pris
return pVals;
}

static <T> List<PrismPropertyValue<T>> createPropertyListFromValue(PrismContext prismContext, Object value) {
List<PrismPropertyValue<T>> pVals = new ArrayList<>();
if (value != null) {
addToPrismValues((List) pVals, prismContext, value);
}
return pVals;
}

// static <T> List<PrismPropertyValue<T>> createPropertyListFromCollection(PrismContext prismContext, Collection<T> realValues) {
// List<PrismPropertyValue<T>> pVals = new ArrayList<>();
// for (T realValue : realValues) {
Expand Down
Expand Up @@ -32,16 +32,12 @@ private RefFilter(ItemPath path, PrismReferenceDefinition definition, Expression
super(path, definition, expression, values);
}

private RefFilter(ItemPath path, PrismReferenceDefinition definition, ExpressionWrapper expression) {
super(path, definition, expression, null);
}

public static RefFilter createReferenceEqual(ItemPath path, PrismReferenceDefinition definition, Collection<PrismReferenceValue> values) {
return new RefFilter(path, definition, null, values != null ? new ArrayList<>(values) : null);
}

public static RefFilter createReferenceEqual(ItemPath path, PrismReferenceDefinition definition, ExpressionWrapper expression) {
return new RefFilter(path, definition, expression);
return new RefFilter(path, definition, expression, null);
}

@Override
Expand Down

0 comments on commit c31a693

Please sign in to comment.