Skip to content

Commit

Permalink
Simplification of search queries in provisioning.
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed Oct 23, 2014
1 parent 6a02713 commit 9e51b64
Show file tree
Hide file tree
Showing 9 changed files with 112 additions and 9 deletions.
Expand Up @@ -34,7 +34,6 @@ public class AndFilter extends NaryLogicalFilter {

public AndFilter(List<ObjectFilter> condition) {
super(condition);

}

public static AndFilter createAnd(ObjectFilter... conditions){
Expand All @@ -55,6 +54,11 @@ public AndFilter clone() {
return new AndFilter(getClonedConditions());
}

@Override
public AndFilter cloneEmpty() {
return new AndFilter(new ArrayList<ObjectFilter>());
}

@Override
public String debugDump() {
return debugDump(0);
Expand Down
Expand Up @@ -46,6 +46,8 @@ public boolean contains(ObjectFilter condition) {
return this.conditions.contains(condition);
}

abstract public LogicalFilter cloneEmpty();

protected List<ObjectFilter> getClonedConditions() {
if (conditions == null) {
return null;
Expand All @@ -56,6 +58,10 @@ protected List<ObjectFilter> getClonedConditions() {
}
return clonedConditions;
}

public boolean isEmpty() {
return conditions == null || conditions.isEmpty();
}

@Override
public void accept(Visitor visitor) {
Expand Down
Expand Up @@ -49,6 +49,11 @@ public NotFilter clone() {
return new NotFilter(getFilter().clone());
}

@Override
public NotFilter cloneEmpty() {
return new NotFilter();
}

@Override
public String debugDump() {
return debugDump(0);
Expand Down
Expand Up @@ -78,17 +78,20 @@ public static <T extends Objectable> boolean match(PrismObject<T> object, Object
}

public ObjectQuery clone() {
ObjectQuery clone = new ObjectQuery();
ObjectQuery clone = cloneEmpty();
if (this.filter != null) {
clone.filter = this.filter.clone();
}
return clone;
}

public ObjectQuery cloneEmpty() {
ObjectQuery clone = new ObjectQuery();
if (this.paging != null) {
clone.paging = this.paging.clone();
}
return clone;
}


}

@Override
public String debugDump() {
Expand Down
Expand Up @@ -50,6 +50,11 @@ public OrFilter clone() {
return new OrFilter(getClonedConditions());
}

@Override
public OrFilter cloneEmpty() {
return new OrFilter(new ArrayList<ObjectFilter>());
}

@Override
public String debugDump() {
return debugDump(0);
Expand Down
Expand Up @@ -16,6 +16,9 @@

package com.evolveum.midpoint.schema.util;

import java.util.ArrayList;
import java.util.List;

import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.match.PolyStringOrigMatchingRule;
Expand All @@ -31,7 +34,9 @@
import com.evolveum.midpoint.prism.query.AndFilter;
import com.evolveum.midpoint.prism.query.EqualFilter;
import com.evolveum.midpoint.prism.query.InOidFilter;
import com.evolveum.midpoint.prism.query.LogicalFilter;
import com.evolveum.midpoint.prism.query.NoneFilter;
import com.evolveum.midpoint.prism.query.NotFilter;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.OrFilter;
Expand Down Expand Up @@ -264,4 +269,61 @@ public static boolean isAll(ObjectFilter filter) {
public static boolean isNone(ObjectFilter filter) {
return filter != null && filter instanceof NoneFilter;
}

public static ObjectFilter simplify(ObjectFilter filter) {
if (filter instanceof AndFilter) {
List<ObjectFilter> conditions = ((AndFilter)filter).getConditions();
AndFilter simplifiedFilter = ((AndFilter)filter).cloneEmpty();
for (ObjectFilter subfilter: conditions) {
if (subfilter instanceof NoneFilter) {
// AND with "false"
return NoneFilter.createNone();
} else if (subfilter instanceof AllFilter) {
// AND with "true", just skip it
} else {
ObjectFilter simplifiedSubfilter = simplify(subfilter);
simplifiedFilter.addCondition(simplifiedSubfilter);
}
}
if (simplifiedFilter.isEmpty()) {
return AllFilter.createAll();
}
return simplifiedFilter;

} else if (filter instanceof OrFilter) {
List<ObjectFilter> conditions = ((OrFilter)filter).getConditions();
OrFilter simplifiedFilter = ((OrFilter)filter).cloneEmpty();
for (ObjectFilter subfilter: conditions) {
if (subfilter instanceof NoneFilter) {
// OR with "false", just skip it
} else if (subfilter instanceof AllFilter) {
// OR with "true"
return AllFilter.createAll();
} else {
ObjectFilter simplifiedSubfilter = simplify(subfilter);
simplifiedFilter.addCondition(simplifiedSubfilter);
}
}
if (simplifiedFilter.isEmpty()) {
return AllFilter.createAll();
}
return simplifiedFilter;

} else if (filter instanceof NotFilter) {
ObjectFilter subfilter = ((NotFilter)filter).getFilter();
ObjectFilter simplifiedSubfilter = simplify(subfilter);
if (subfilter instanceof NoneFilter) {
return AllFilter.createAll();
} else if (subfilter instanceof AllFilter) {
return NoneFilter.createNone();
} else {
NotFilter simplifiedFilter = ((NotFilter)filter).cloneEmpty();
simplifiedFilter.setFilter(simplifiedSubfilter);
return simplifiedFilter;
}
} else {
// Cannot simplify
return filter.clone();
}
}
}
Expand Up @@ -377,8 +377,7 @@ private static ObjectFilter evaluateFilterExpressionsInternal(ObjectFilter filte

if (filter instanceof LogicalFilter) {
List<ObjectFilter> conditions = ((LogicalFilter) filter).getConditions();
LogicalFilter evaluatedFilter = (LogicalFilter) filter.clone();
evaluatedFilter.getConditions().clear();
LogicalFilter evaluatedFilter = ((LogicalFilter)filter).cloneEmpty();
for (ObjectFilter condition : conditions) {
ObjectFilter evaluatedSubFilter = evaluateFilterExpressionsInternal(condition, variables, expressionFactory, prismContext, shortDesc, task, result);
evaluatedFilter.addCondition(evaluatedSubFilter);
Expand Down
Expand Up @@ -25,8 +25,8 @@
import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition;
import com.evolveum.midpoint.common.refinery.RefinedResourceSchema;
import com.evolveum.midpoint.prism.*;

import com.evolveum.midpoint.provisioning.ucf.api.ConnectorInstance;

import org.apache.commons.lang.Validate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
Expand All @@ -38,6 +38,7 @@
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.delta.PropertyDelta;
import com.evolveum.midpoint.prism.query.AndFilter;
import com.evolveum.midpoint.prism.query.NoneFilter;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.ObjectQuery;
Expand Down Expand Up @@ -1097,7 +1098,16 @@ public <T extends ObjectType> void searchObjectsIterative(final Class<T> type, O

ObjectFilter filter = null;
if (query != null) {
filter = query.getFilter();
filter = ObjectQueryUtil.simplify(query.getFilter());
}
query = query.cloneEmpty();
query.setFilter(filter);

if (filter instanceof NoneFilter) {
result.recordSuccessIfUnknown();
result.cleanupResult();
LOGGER.trace("Finished searching. Nothing to do. Filter is NONE");
return;
}

if (!ShadowType.class.isAssignableFrom(type)) {
Expand Down
Expand Up @@ -77,6 +77,7 @@
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.query.AndFilter;
import com.evolveum.midpoint.prism.query.EqualFilter;
import com.evolveum.midpoint.prism.query.NoneFilter;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.schema.PrismSchema;
Expand Down Expand Up @@ -2411,6 +2412,14 @@ public void test168bSearchIcfNameAndUidExactNoFetch() throws Exception {
ACCOUNT_WILL_USERNAME);
}


@Test
public void test170SearchNone() throws Exception {
final String TEST_NAME = "test170SearchNone";
TestUtil.displayTestTile(TEST_NAME);
ObjectFilter attrFilter = NoneFilter.createNone();
testSeachIterative(TEST_NAME, attrFilter, null, true, true, false);
}

protected <T> void testSeachIterativeSingleAttrFilter(final String TEST_NAME, String attrName, T attrVal,
GetOperationOptions rootOptions, boolean fullShadow, String... expectedAccountIds) throws Exception {
Expand Down

0 comments on commit 9e51b64

Please sign in to comment.