From c31a693c1e342d2460620196e6bde84f38cda46f Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 12 Oct 2016 17:15:52 +0200 Subject: [PATCH] Filters cleanup. Interim commit. --- .../assignment/CatalogItemsPanel.java | 13 +- .../midpoint/web/component/search/Search.java | 6 +- .../component/ObjectSelectionPanel.java | 9 +- .../component/RunReportPopupPanel.java | 11 +- .../component/AbstractTreeTablePanel.java | 41 +++--- .../admin/users/component/OrgMemberPanel.java | 41 +++--- .../users/component/OrgTreeProvider.java | 9 +- .../admin/users/component/TreeTablePanel.java | 7 +- .../evolveum/midpoint/prism/PrismValue.java | 6 +- .../prism/marshaller/QueryConvertor.java | 12 +- .../midpoint/prism/query/OrgFilter.java | 4 +- .../prism/query/PropertyValueFilter.java | 16 +-- .../midpoint/prism/query/RefFilter.java | 6 +- .../midpoint/prism/query/SubstringFilter.java | 136 +++--------------- .../prism/query/builder/R_AtomicFilter.java | 6 +- .../prism/query/builder/R_Filter.java | 10 ++ .../query/builder/S_AtomicFilterEntry.java | 23 +-- .../prism/query/TestQueryBuilder.java | 4 + .../test/AbstractModelIntegrationTest.java | 12 +- .../midpoint/repo/sql/OrgStructTest.java | 17 ++- .../repo/sql/QueryInterpreter2Test.java | 29 ++-- 21 files changed, 169 insertions(+), 249 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/CatalogItemsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/CatalogItemsPanel.java index dae84acae7c..fe71f40ff52 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/CatalogItemsPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/CatalogItemsPanel.java @@ -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; @@ -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() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java index cb996789195..e6a064d6c70 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java @@ -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 :) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ObjectSelectionPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ObjectSelectionPanel.java index 29cfa10ebaa..287603807b4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ObjectSelectionPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ObjectSelectionPanel.java @@ -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; @@ -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 { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java index edc4d810a9c..c51a907edd5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java @@ -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; @@ -316,12 +317,10 @@ private List createLookupTableRows(Ja Task task = createSimpleTask(OPERATION_LOAD_RESOURCES); Collection> 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); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractTreeTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractTreeTablePanel.java index 5d37217a25e..e7fe9a3bd0e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractTreeTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractTreeTablePanel.java @@ -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; @@ -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; } - } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgMemberPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgMemberPanel.java index 6c81bdae25b..8a450e79187 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgMemberPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgMemberPanel.java @@ -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; @@ -449,11 +451,10 @@ private MainObjectListPanel getMemberTable() { createComponentPath(ID_FORM, ID_CONTAINER_MEMBER, ID_MEMBER_TABLE)); } - private QName getSearchType() { + private ObjectTypes getSearchType() { DropDownChoice searchByTypeChoice = (DropDownChoice) get( createComponentPath(ID_FORM, ID_SEARCH_BY_TYPE)); - ObjectTypes typeModel = searchByTypeChoice.getModelObject(); - return typeModel.getTypeQName(); + return searchByTypeChoice.getModelObject(); } private ObjectQuery createManagerQuery() { @@ -561,37 +562,27 @@ protected void recomputeManagersPerformed(QueryScope scope, AjaxRequestTarget ta @Override protected ObjectQuery createMemberQuery() { - ObjectQuery query = null; - String oid = getModelObject().getOid(); - List filters = new ArrayList<>(); - DropDownChoice searchScopeChoice = (DropDownChoice) 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) { @@ -634,9 +625,9 @@ private boolean satisfyConstraints(boolean isFocus, Class 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) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgTreeProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgTreeProvider.java index 6541ef193b1..49e8475cb6f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgTreeProvider.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgTreeProvider.java @@ -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; @@ -99,10 +100,10 @@ public Iterator> getChildren(SelectableBean> 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> options = WebModelServiceUtils.createOptionsForParentOrgRefs(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java index cac93607e80..5a761555508 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java @@ -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; @@ -425,12 +426,14 @@ public void yesPerformed(AjaxRequestTarget target) { } private boolean hasChildren(SelectableBean 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) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java index 0dceb9bf929..4c1c4c881f8 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java @@ -260,8 +260,10 @@ protected void copyValues(PrismValue clone) { @NotNull public static Collection cloneCollection(Collection values) { Collection clones = new ArrayList(); - for (T value: values) { - clones.add((T)value.clone()); + if (values != null) { + for (T value : values) { + clones.add((T) value.clone()); + } } return clones; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java index 1932af12162..9c22e04a9cb 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java @@ -505,7 +505,17 @@ private static 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); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/OrgFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/OrgFilter.java index ef4c47e56f4..30b87629cba 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/OrgFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/OrgFilter.java @@ -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) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java index 1156cddb74f..615aff6b81b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java @@ -74,18 +74,10 @@ protected PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition d this(path, definition, matchingRule, (List) 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 values) { this(path, definition, null, values, expression); } - PropertyValueFilter(ItemPath path, ItemDefinition definition, QName matchingRule, ExpressionWrapper expression) { - this(path, definition, matchingRule, null, expression); - } - static protected List> createPropertyList(@NotNull PrismPropertyDefinition itemDefinition, @Nullable PrismPropertyValue pValue) { List> pValues = new ArrayList<>(); if (pValue == null) { @@ -120,6 +112,14 @@ static List> createPropertyListFromArray(PrismContext pris return pVals; } + static List> createPropertyListFromValue(PrismContext prismContext, Object value) { + List> pVals = new ArrayList<>(); + if (value != null) { + addToPrismValues((List) pVals, prismContext, value); + } + return pVals; + } + // static List> createPropertyListFromCollection(PrismContext prismContext, Collection realValues) { // List> pVals = new ArrayList<>(); // for (T realValue : realValues) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java index 1137ba088ab..356a5dc4f3d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java @@ -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 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 diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java index ccc0049342d..0542a846776 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java @@ -18,10 +18,8 @@ import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.Objectable; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismReferenceValue; @@ -30,7 +28,8 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.SchemaException; -import org.apache.commons.lang.Validate; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.namespace.QName; import java.util.Iterator; @@ -39,109 +38,30 @@ import java.util.regex.Pattern; public class SubstringFilter extends PropertyValueFilter> { - - private boolean anchorStart = false; - private boolean anchorEnd = false; - SubstringFilter(ItemPath parentPath, ItemDefinition definition, QName matchingRule, List> value) { - super(parentPath, definition, matchingRule, value); - } - - SubstringFilter(ItemPath parentPath, ItemDefinition definition, QName matchingRule) { - super(parentPath, definition, matchingRule); - } - - SubstringFilter(ItemPath parentPath, ItemDefinition definition, QName matchingRule, List> value, boolean anchorStart, boolean anchorEnd) { - super(parentPath, definition, matchingRule, value); + private boolean anchorStart; + private boolean anchorEnd; + + SubstringFilter(ItemPath parentPath, ItemDefinition definition, QName matchingRule, List> values, boolean anchorStart, boolean anchorEnd) { + super(parentPath, definition, matchingRule, values); this.anchorStart = anchorStart; this.anchorEnd = anchorEnd; } - - public static SubstringFilter createSubstring(ItemPath path, PrismProperty item, QName matchingRule, - boolean anchorStart, boolean anchorEnd) { - List> values = item.getValues(); - PrismPropertyValue value; - if (values.size() > 1) { - throw new IllegalArgumentException("Expected at most 1 value, got " + values); - } else if (values.size() == 1) { - value = values.get(0).clone(); - } else { - value = null; - } - return createSubstring(path, item.getDefinition(), matchingRule, value, anchorStart, anchorEnd); - } - - public static SubstringFilter createSubstring(ItemPath path, PrismPropertyDefinition itemDefinition, QName matchingRule, T realValues) { - return createSubstring(path, itemDefinition, matchingRule, realValues, false, false); - } - public static SubstringFilter createSubstring(ItemPath path, PrismPropertyDefinition itemDefinition, QName matchingRule, T realValues, boolean anchorStart, boolean anchorEnd) { - if (realValues == null){ - return createNullSubstring(path, itemDefinition, matchingRule); - } - List> pValues = realValueToPropertyList(itemDefinition, realValues); - SubstringFilter substringFilter = new SubstringFilter(path, itemDefinition, matchingRule, pValues, anchorStart, anchorEnd); - for (PrismPropertyValue pVal: pValues) { - pVal.setParent(substringFilter); - } - return substringFilter; - } - - public static SubstringFilter createSubstring(ItemPath path, PrismPropertyDefinition itemDefinition, QName matchingRule, - PrismPropertyValue values, boolean anchorStart, boolean anchorEnd) { - Validate.notNull(path, "Item path in substring filter must not be null."); - Validate.notNull(itemDefinition, "Item definition in substring filter must not be null."); - - if (values == null){ - return createNullSubstring(path, itemDefinition, matchingRule); - } - - List> pValues = createPropertyList(itemDefinition, values); - - SubstringFilter substringFilter = new SubstringFilter<>(path, itemDefinition, matchingRule, pValues, anchorStart, anchorEnd); - for (PrismPropertyValue pVal: pValues) { - pVal.setParent(substringFilter); - } - return substringFilter; + /** + * Creates a substring filter. + * + * @param itemDefinition TODO about nullability + * @param value real value or prism property value; TODO about nullability + */ + public static SubstringFilter createSubstring(@NotNull ItemPath path, @Nullable PrismPropertyDefinition itemDefinition, + @NotNull PrismContext prismContext, + @Nullable QName matchingRule, Object value, boolean anchorStart, boolean anchorEnd) { + List> pValues = createPropertyListFromValue(prismContext, value); + return new SubstringFilter(path, itemDefinition, matchingRule, pValues, anchorStart, anchorEnd); } - - public static SubstringFilter createSubstring(ItemPath path, Class clazz, PrismContext prismContext, T realValue) { - return createSubstring(path, clazz, prismContext, null, realValue); - } - - public static SubstringFilter createSubstring(ItemPath path, Class clazz, PrismContext prismContext, QName matchingRule, T realValue) { - - ItemDefinition itemDefinition = FilterUtils.findItemDefinition(path, clazz, prismContext); - - if (!(itemDefinition instanceof PrismPropertyDefinition)){ - throw new IllegalStateException("Bad definition. Expected property definition, but got " + itemDefinition); - } - - if (realValue == null){ - return createNullSubstring(path, (PrismPropertyDefinition) itemDefinition, matchingRule); - } - - List> pVals = realValueToPropertyList((PrismPropertyDefinition) itemDefinition, realValue); - - SubstringFilter substringFilter = new SubstringFilter<>(path, itemDefinition, matchingRule, pVals); - for (PrismPropertyValue pVal: pVals) { - pVal.setParent(substringFilter); - } - return substringFilter; - } - - public static SubstringFilter createSubstring(QName propertyName, Class clazz, PrismContext prismContext, String value) { - return createSubstring(propertyName, clazz, prismContext, null, value); - } - public static SubstringFilter createSubstring(QName propertyName, Class clazz, PrismContext prismContext, QName matchingRule, String value) { - return createSubstring(new ItemPath(propertyName), clazz, prismContext, matchingRule, value); - } - - private static SubstringFilter createNullSubstring(ItemPath itemPath, PrismPropertyDefinition propertyDef, QName matchingRule){ - return new SubstringFilter<>(itemPath, propertyDef, matchingRule); - - } + // TODO expression based substring filter public boolean isAnchorStart() { return anchorStart; @@ -151,25 +71,9 @@ public boolean isAnchorEnd() { return anchorEnd; } - public void setAnchorStart(boolean anchorStart) { - this.anchorStart = anchorStart; - } - - public void setAnchorEnd(boolean anchorEnd) { - this.anchorEnd = anchorEnd; - } - @Override public SubstringFilter clone() { - List> clonedValues = getCloneValuesList(); - SubstringFilter filter = new SubstringFilter<>(getFullPath(), getDefinition(), getMatchingRule(), clonedValues); - for (PrismPropertyValue clonedValue: clonedValues) { - clonedValue.setParent(filter); - } - filter.anchorStart = anchorStart; - filter.anchorEnd = anchorEnd; - - return filter; + return new SubstringFilter<>(getFullPath(), getDefinition(), getMatchingRule(), getCloneValuesList(), anchorStart, anchorEnd); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java index 6cdec61fa9b..1fadc0bfa8c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java @@ -179,7 +179,7 @@ public S_RightHandItemEntry le() { @Override public S_MatchingRuleEntry startsWith(Object value) { - return new R_AtomicFilter(this, SubstringFilter.createSubstring(itemPath, propertyDefinition, null, value, true, false)); + return new R_AtomicFilter(this, SubstringFilter.createSubstring(itemPath, propertyDefinition, owner.getPrismContext(), null, value, true, false)); } @Override @@ -194,7 +194,7 @@ public S_MatchingRuleEntry startsWithPoly(String orig) { @Override public S_MatchingRuleEntry endsWith(Object value) { - return new R_AtomicFilter(this, SubstringFilter.createSubstring(itemPath, propertyDefinition, null, value, false, true)); + return new R_AtomicFilter(this, SubstringFilter.createSubstring(itemPath, propertyDefinition, owner.getPrismContext(), null, value, false, true)); } @Override @@ -209,7 +209,7 @@ public S_MatchingRuleEntry endsWithPoly(String orig) { @Override public S_MatchingRuleEntry contains(Object value) { - return new R_AtomicFilter(this, SubstringFilter.createSubstring(itemPath, propertyDefinition, null, value, false, false)); + return new R_AtomicFilter(this, SubstringFilter.createSubstring(itemPath, propertyDefinition, owner.getPrismContext(), null, value, false, false)); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_Filter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_Filter.java index 9704b76f9c9..3ab3441e023 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_Filter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_Filter.java @@ -235,6 +235,16 @@ public S_AtomicFilterExit isChildOf(String oid) { return addSubfilter(orgFilter); } + @Override + public S_AtomicFilterExit isInScopeOf(String oid, OrgFilter.Scope scope) { + return addSubfilter(OrgFilter.createOrg(oid, scope)); + } + + @Override + public S_AtomicFilterExit isInScopeOf(PrismReferenceValue value, OrgFilter.Scope scope) { + return addSubfilter(OrgFilter.createOrg(value, scope)); + } + @Override public S_AtomicFilterExit isParentOf(String oid) { OrgFilter orgFilter = OrgFilter.createOrg(oid, OrgFilter.Scope.ANCESTORS); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterEntry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterEntry.java index 1050a770130..160096c4953 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterEntry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterEntry.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.query.OrgFilter; import javax.xml.namespace.QName; @@ -35,16 +36,18 @@ public interface S_AtomicFilterEntry { S_ConditionEntry item(PrismContainerDefinition containerDefinition, QName... names); S_ConditionEntry item(PrismContainerDefinition containerDefinition, ItemPath itemPath); S_MatchingRuleEntry itemAs(PrismProperty property); // experimental; TODO choose better name for this method - S_AtomicFilterExit id(String... identifiers) ; - S_AtomicFilterExit id(long... identifiers) ; - S_AtomicFilterExit ownerId(String... identifiers) ; - S_AtomicFilterExit ownerId(long... identifiers) ; - S_AtomicFilterExit isDirectChildOf(PrismReferenceValue value) ; - S_AtomicFilterExit isChildOf(PrismReferenceValue value) ; - S_AtomicFilterExit isDirectChildOf(String oid) ; - S_AtomicFilterExit isChildOf(String oid) ; - S_AtomicFilterExit isParentOf(PrismReferenceValue value) ; // reference should point to OrgType - S_AtomicFilterExit isParentOf(String oid) ; // oid should be of an OrgType + S_AtomicFilterExit id(String... identifiers); + S_AtomicFilterExit id(long... identifiers); + S_AtomicFilterExit ownerId(String... identifiers); + S_AtomicFilterExit ownerId(long... identifiers); + S_AtomicFilterExit isDirectChildOf(PrismReferenceValue value); + S_AtomicFilterExit isChildOf(PrismReferenceValue value); + S_AtomicFilterExit isDirectChildOf(String oid); + S_AtomicFilterExit isChildOf(String oid); + S_AtomicFilterExit isParentOf(PrismReferenceValue value); // reference should point to OrgType + S_AtomicFilterExit isParentOf(String oid); // oid should be of an OrgType + S_AtomicFilterExit isInScopeOf(String oid, OrgFilter.Scope scope); + S_AtomicFilterExit isInScopeOf(PrismReferenceValue value, OrgFilter.Scope scope); S_AtomicFilterExit isRoot() ; S_FilterEntryOrEmpty block(); S_FilterEntryOrEmpty type(Class type) ; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java index 4e5c0ee06d2..ba3286e3faa 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java @@ -350,6 +350,7 @@ public void test150ExistsWithEquals() throws Exception{ SubstringFilter.createSubstring( new ItemPath(AssignmentType.F_DESCRIPTION), assCtd.findPropertyDefinition(AssignmentType.F_DESCRIPTION), + getPrismContext(), null, "desc1", true, false) ) ); @@ -371,6 +372,7 @@ public void test151ExistsWithEquals2() throws Exception{ SubstringFilter.createSubstring( new ItemPath(AssignmentType.F_NOTE), assCtd.findPropertyDefinition(AssignmentType.F_NOTE), + getPrismContext(), null, "DONE.", false, true) ) ); @@ -394,6 +396,7 @@ public void test152ExistsWithEqualsInBlock() throws Exception{ SubstringFilter.createSubstring( new ItemPath(AssignmentType.F_NOTE), assCtd.findPropertyDefinition(AssignmentType.F_NOTE), + getPrismContext(), null, "DONE.", false, true) ) ); @@ -419,6 +422,7 @@ public void test154ExistsWithEqualsAndAllInBlock() throws Exception{ SubstringFilter.createSubstring( new ItemPath(AssignmentType.F_NOTE), assCtd.findPropertyDefinition(AssignmentType.F_NOTE), + getPrismContext(), null, "DONE.", false, true ), AllFilter.createAll() diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java index b8968884d6b..39f37e6e2b6 100644 --- a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java @@ -1479,10 +1479,9 @@ protected void assertSubOrgs(PrismObject baseOrg, int expected) throws } protected List> getSubOrgs(String baseOrgOid, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { - ObjectQuery query = new ObjectQuery(); - PrismReferenceValue baseOrgRef = new PrismReferenceValue(baseOrgOid); - ObjectFilter filter = OrgFilter.createOrg(baseOrgRef, OrgFilter.Scope.ONE_LEVEL); - query.setFilter(filter); + ObjectQuery query = QueryBuilder.queryFor(OrgType.class, prismContext) + .isDirectChildOf(baseOrgOid) + .build(); return modelService.searchObjects(OrgType.class, query, null, task, result); } @@ -1908,8 +1907,9 @@ protected void purgeResourceSchema(String resourceOid) throws ObjectAlreadyExist } protected List> searchOrg(String baseOrgOid, OrgFilter.Scope scope, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { - ObjectFilter filter = OrgFilter.createOrg(baseOrgOid, scope); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(OrgType.class, prismContext) + .isInScopeOf(baseOrgOid, scope) + .build(); return modelService.searchObjects(OrgType.class, query, null, task, result); } diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java index f2bbd952fe2..045e5c16842 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java @@ -543,9 +543,10 @@ public void test007searchOrgStructOrgDepth() throws Exception { session.getTransaction().commit(); session.close(); - ObjectQuery objectQuery = ObjectQuery.createObjectQuery(OrgFilter.createOrg(SEARCH_ORG_OID_DEPTH1, OrgFilter.Scope.ONE_LEVEL)); - objectQuery.setPaging(ObjectPaging.createPaging(null, null, ObjectType.F_NAME, OrderDirection.ASCENDING)); - + ObjectQuery objectQuery = QueryBuilder.queryFor(ObjectType.class, prismContext) + .isDirectChildOf(SEARCH_ORG_OID_DEPTH1) + .asc(ObjectType.F_NAME) + .build(); List> sOrgClosure = repositoryService.searchObjects(ObjectType.class, objectQuery, null, parentResult); for (PrismObject u : sOrgClosure) { @@ -600,12 +601,10 @@ public void test011OrgFilter() throws Exception { TestUtil.displayTestTile(TEST_NAME); OperationResult opResult = new OperationResult(TEST_NAME); - ObjectQuery query = new ObjectQuery(); - PrismReferenceValue baseOrgRef = new PrismReferenceValue(ORG_F001_OID); - ObjectFilter filter = OrgFilter.createOrg(baseOrgRef, OrgFilter.Scope.ONE_LEVEL); - ObjectPaging paging = ObjectPaging.createPaging(null, null, ObjectType.F_NAME, null); - query.setFilter(filter); - query.setPaging(paging); + ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, prismContext) + .isDirectChildOf(ORG_F001_OID) + .asc(ObjectType.F_NAME) + .build(); // WHEN List> orgClosure = repositoryService.searchObjects(ObjectType.class, query, null, opResult); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java index 49bbf509fe4..62b3f113673 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java @@ -2075,10 +2075,9 @@ public void test530queryUserSubstringName() throws Exception { Session session = open(); try { - SubstringFilter substring = SubstringFilter.createSubstring(F_NAME, ObjectType.class, - prismContext, PolyStringOrigMatchingRule.NAME, "a"); - substring.setAnchorStart(true); - ObjectQuery objectQuery = ObjectQuery.createObjectQuery(substring); + ObjectQuery objectQuery = QueryBuilder.queryFor(ObjectType.class, prismContext) + .item(F_NAME).startsWith("a").matchingOrig() + .build(); objectQuery.setUseNewQueryInterpreter(true); String real = getInterpretedQuery2(session, ObjectType.class, objectQuery); @@ -2100,9 +2099,9 @@ public void test530queryUserSubstringName() throws Exception { int count = repositoryService.countObjects(ObjectType.class, objectQuery, result); assertEquals(2, count); - substring = SubstringFilter.createSubstring(F_NAME, ObjectType.class, - prismContext, PolyStringOrigMatchingRule.NAME, "a"); - objectQuery = ObjectQuery.createObjectQuery(substring); + objectQuery = QueryBuilder.queryFor(ObjectType.class, prismContext) + .item(F_NAME).containsPoly("a").matchingOrig() + .build(); objectQuery.setUseNewQueryInterpreter(true); count = repositoryService.countObjects(ObjectType.class, objectQuery, result); assertEquals(20, count); @@ -2974,10 +2973,9 @@ public void test750DereferenceLink() throws Exception { * ### UserType: linkRef/@/name contains 'test.com' */ - ObjectFilter filter = SubstringFilter.createSubstring( - new ItemPath(UserType.F_LINK_REF, PrismConstants.T_OBJECT_REFERENCE, F_NAME), - UserType.class, prismContext, "test.com"); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_LINK_REF, PrismConstants.T_OBJECT_REFERENCE, F_NAME).containsPoly("test.com") + .build(); String real = getInterpretedQuery2(session, UserType.class, query); String expected = "select\n" + @@ -3012,12 +3010,11 @@ public void test752DereferenceLinkedResourceName() throws Exception { * ### UserType: linkRef/@/resourceRef/@/name contains 'CSV' (norm) */ - ObjectFilter filter = SubstringFilter.createSubstring( - new ItemPath(UserType.F_LINK_REF, PrismConstants.T_OBJECT_REFERENCE, + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_LINK_REF, PrismConstants.T_OBJECT_REFERENCE, ShadowType.F_RESOURCE_REF, PrismConstants.T_OBJECT_REFERENCE, - F_NAME), - UserType.class, prismContext, PolyStringNormMatchingRule.NAME, "CSV"); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + F_NAME).containsPoly("CSV").matchingNorm() + .build(); String real = getInterpretedQuery2(session, UserType.class, query); String expected = "select\n" +