Skip to content

Commit

Permalink
Interim commit.
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Oct 11, 2016
1 parent 5f1db0c commit 54438a8
Show file tree
Hide file tree
Showing 13 changed files with 126 additions and 2,053 deletions.
Expand Up @@ -23,6 +23,7 @@
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer;
import com.evolveum.midpoint.prism.query.*;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.DebugDumpable;
Expand Down Expand Up @@ -196,7 +197,8 @@ private ObjectFilter createFilterForSearchValue(SearchItem item, DisplayableValu
//or if it's boolean value
DisplayableValue displayableValue = (DisplayableValue) searchValue.getValue();
Object value = displayableValue.getValue();
return EqualFilter.createEqual(path, propDef, value);
return QueryBuilder.queryFor(ObjectType.class, ctx)
.item(path, propDef).eq(value).buildFilter();
} else if (DOMUtil.XSD_INT.equals(propDef.getTypeName())
|| DOMUtil.XSD_INTEGER.equals(propDef.getTypeName())
|| DOMUtil.XSD_LONG.equals(propDef.getTypeName())
Expand All @@ -208,7 +210,8 @@ private ObjectFilter createFilterForSearchValue(SearchItem item, DisplayableValu
return null;
}
Object value = Long.parseLong((String) searchValue.getValue());
return EqualFilter.createEqual(path, propDef, value);
return QueryBuilder.queryFor(ObjectType.class, ctx)
.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);
Expand Down
Expand Up @@ -16,7 +16,6 @@

package com.evolveum.midpoint.prism.query;

import java.util.Collection;
import java.util.List;

import javax.xml.namespace.QName;
Expand All @@ -30,7 +29,6 @@
import com.evolveum.midpoint.prism.Item;
import com.evolveum.midpoint.prism.Itemable;
import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismProperty;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
Expand All @@ -46,9 +44,9 @@ public class EqualFilter<T> extends PropertyValueFilter<PrismPropertyValue<T>> i

public static final QName ELEMENT_NAME = new QName(PrismConstants.NS_QUERY, "equal");

private EqualFilter(@NotNull ItemPath parentPath, PrismPropertyDefinition<T> definition, QName matchingRule,
private EqualFilter(@NotNull ItemPath fullPath, PrismPropertyDefinition<T> definition, QName matchingRule,
@NotNull ItemPath rightSidePath, ItemDefinition rightSideDefinition) {
super(parentPath, definition, matchingRule, rightSidePath, rightSideDefinition);
super(fullPath, definition, matchingRule, rightSidePath, rightSideDefinition);
}

private EqualFilter(@NotNull ItemPath fullPath, PrismPropertyDefinition<T> definition, QName matchingRule,
Expand All @@ -59,6 +57,12 @@ private EqualFilter(@NotNull ItemPath fullPath, PrismPropertyDefinition<T> defin
//factory methods
// Do not require definition. We may want queries for which the definition is supplied later.

// right-side-related
@NotNull
public static <C extends Containerable, T> EqualFilter<T> createEqual(ItemPath propertyPath, PrismPropertyDefinition<T> propertyDefinition, QName matchingRule, ItemPath rightSidePath, ItemDefinition rightSideDefinition) {
return new EqualFilter<>(propertyPath, propertyDefinition, matchingRule, rightSidePath, rightSideDefinition);
}

// expression-related
@NotNull
public static <T> EqualFilter<T> createEqual(@NotNull ItemPath path, @Nullable PrismPropertyDefinition<T> definition,
Expand All @@ -73,42 +77,19 @@ public static <T> EqualFilter<T> createEqual(@NotNull ItemPath path, @Nullable P
return new EqualFilter<T>(path, definition, matchingRule, values, null);
}

// -------------------------------- PPV
// canonical

@NotNull
public static <T> EqualFilter<T> createEqual(@NotNull ItemPath path, @NotNull PrismPropertyDefinition<T> itemDefinition, PrismPropertyValue<T> value) {
List<PrismPropertyValue<T>> pValues = createPropertyList(itemDefinition, value);
return new EqualFilter<>(path, itemDefinition, null, pValues, null);
}


// List<values>
// Array of values

@NotNull
@SafeVarargs
public static <T> EqualFilter<T> createEqualMultiple(@NotNull ItemPath path, @NotNull PrismPropertyDefinition<T> definition,
@Nullable QName matchingRule, T... realValues) {
return new EqualFilter<>(path, definition, matchingRule, createPropertyListFromArray(definition, realValues), null);
}

// -------------------------------- single value
// ------------------- with matching rule
// canonical
@NotNull
public static <T> EqualFilter<T> createEqual(@NotNull ItemPath path, @NotNull PrismPropertyDefinition<T> definition,
@Nullable QName matchingRule, @Nullable T realValue) {
return new EqualFilter<>(path, definition, matchingRule, realValueToPropertyList(definition, realValue), null);
}

// ------------------- without matching rule
@NotNull
public static <T> EqualFilter<T> createEqual(@NotNull ItemPath path, @NotNull PrismPropertyDefinition<T> itemDefinition, @Nullable T realValue) {
return createEqual(path, itemDefinition, null, realValue);
}

// definition from container
private static <C extends Containerable, T> EqualFilter<T> createEqual(@NotNull ItemPath propertyPath, @NotNull Class<C> type, @NotNull PrismContext prismContext,
@Nullable QName matchingRule, T realValue) {
@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -137,41 +118,13 @@ public static <C extends Containerable, T> EqualFilter<T> createEqual(@NotNull Q

// taking values from existing item (item's values are cloned)
@NotNull
@Deprecated
public static <T> EqualFilter<T> createEqual(@NotNull ItemPath path, @NotNull PrismProperty<T> item) {
List<PrismPropertyValue<T>> clonedValues = (List<PrismPropertyValue<T>>) PrismPropertyValue.cloneCollection(item.getValues());
return createEqual(path, item.getDefinition(), null, clonedValues);
}






@NotNull
public static <C extends Containerable, T> EqualFilter<T> createEqual(@NotNull ItemPath itemPath, @NotNull PrismContainerDefinition<C> containerDef,
T realValues) throws SchemaException {
PrismPropertyDefinition<T> propertyDef = (PrismPropertyDefinition) FilterUtils.findItemDefinition(itemPath, containerDef);
return createEqual(itemPath, propertyDef, realValues);
}


public static <C extends Containerable, T> EqualFilter<T> createEqual(ItemPath propertyPath, Class<C> type, PrismContext prismContext, QName matchingRule, ItemPath rightSidePath) {
PrismPropertyDefinition propertyDefinition = (PrismPropertyDefinition) FilterUtils.findItemDefinition(propertyPath, type, prismContext);
EqualFilter<T> filter = new EqualFilter(propertyPath, propertyDefinition, matchingRule, rightSidePath, null);
return filter;
}

public static <C extends Containerable, T> EqualFilter<T> createEqual(ItemPath propertyPath, Class<C> type, PrismContext prismContext, QName matchingRule, ItemPath rightSidePath, ItemDefinition rightSideDefinition) {
PrismPropertyDefinition propertyDefinition = (PrismPropertyDefinition) FilterUtils.findItemDefinition(propertyPath, type, prismContext);
EqualFilter<T> filter = new EqualFilter(propertyPath, propertyDefinition, matchingRule, rightSidePath, rightSideDefinition);
return filter;
}

public static <C extends Containerable, T> EqualFilter<T> createEqual(ItemPath propertyPath, PrismPropertyDefinition propertyDefinition, QName matchingRule, ItemPath rightSidePath, ItemDefinition rightSideDefinition) {
EqualFilter<T> filter = new EqualFilter(propertyPath, propertyDefinition, matchingRule, rightSidePath, rightSideDefinition);
return filter;
}

public static <T> EqualFilter<T> createNullEqual(ItemPath itemPath, PrismPropertyDefinition<T> propertyDef, QName matchingRule){
return new EqualFilter(itemPath, propertyDef, matchingRule, (List) null, null);

Expand Down
Expand Up @@ -486,11 +486,11 @@ public void test300EqualItem() throws Exception {
ObjectQuery actual = QueryBuilder.queryFor(UserType.class, getPrismContext())
.item(UserType.F_LOCALITY).eq().item(UserType.F_NAME)
.build();
PrismContainerDefinition userPcd = getPrismContext().getSchemaRegistry().findContainerDefinitionByCompileTimeClass(UserType.class);
ObjectQuery expected = ObjectQuery.createObjectQuery(
EqualFilter.createEqual(
new ItemPath(UserType.F_LOCALITY),
UserType.class,
getPrismContext(),
userPcd.findPropertyDefinition(UserType.F_LOCALITY),
null,
new ItemPath(UserType.F_NAME),
null
Expand Down
Expand Up @@ -506,12 +506,11 @@ private <T> Integer countAccounts(ResourceType resourceType, QName attributeName
RefinedResourceSchema rSchema = RefinedResourceSchema.getRefinedSchema(resourceType);
RefinedObjectClassDefinition rAccountDef = rSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT);
RefinedAttributeDefinition attrDef = rAccountDef.findAttributeDefinition(attributeName);
EqualFilter idFilter = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, attrDef.getName()), attrDef, attributeValue);
EqualFilter ocFilter = EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, prismContext, null,
rAccountDef.getObjectClassDefinition().getTypeName());
RefFilter resourceRefFilter = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, resourceType);
AndFilter filter = AndFilter.createAnd(idFilter, ocFilter, resourceRefFilter);
ObjectQuery query = ObjectQuery.createObjectQuery(filter);
ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext)
.itemWithDef(attrDef, ShadowType.F_ATTRIBUTES, attrDef.getName()).eq(attributeValue)
.and().item(ShadowType.F_OBJECT_CLASS).eq(rAccountDef.getObjectClassDefinition().getTypeName())
.and().item(ShadowType.F_RESOURCE_REF).ref(resourceType.getOid())
.build();
return modelObjectResolver.countObjects(ShadowType.class, query, null, task, result);
}

Expand Down Expand Up @@ -606,13 +605,14 @@ private <T> boolean isUniqueAccountValue(ResourceType resourceType, final Shadow
RefinedResourceSchema rSchema = RefinedResourceSchema.getRefinedSchema(resourceType);
RefinedObjectClassDefinition rAccountDef = rSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT);
RefinedAttributeDefinition attrDef = rAccountDef.findAttributeDefinition(attributeName);
EqualFilter idFilter = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, attrDef.getName()), attrDef, attributeValue);
EqualFilter ocFilter = EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, prismContext,
null, rAccountDef.getObjectClassDefinition().getTypeName());
RefFilter resourceRefFilter = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, resourceType);
AndFilter filter = AndFilter.createAnd(idFilter, ocFilter, resourceRefFilter);
ObjectQuery query = ObjectQuery.createObjectQuery(filter);
LOGGER.trace("Determining uniqueness of attribute {} using query:\n{}", attributeName, query.debugDump());
ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext)
.itemWithDef(attrDef, ShadowType.F_ATTRIBUTES, attrDef.getName()).eq(attributeValue)
.and().item(ShadowType.F_OBJECT_CLASS).eq(rAccountDef.getObjectClassDefinition().getTypeName())
.and().item(ShadowType.F_RESOURCE_REF).ref(resourceType.getOid())
.build();
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Determining uniqueness of attribute {} using query:\n{}", attributeName, query.debugDump());
}

final Holder<Boolean> isUniqueHolder = new Holder<Boolean>(true);
ResultHandler<ShadowType> handler = new ResultHandler<ShadowType>() {
Expand Down
Expand Up @@ -36,6 +36,7 @@
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.test.annotation.DirtiesContext;
Expand Down Expand Up @@ -706,19 +707,17 @@ private <T> void searchDeGhoulash(String testName, QName propName, T propValue)
assumeAssignmentPolicy(AssignmentPolicyEnforcementType.FULL);

// Simple query
ObjectFilter filter = EqualFilter.createEqual(new ItemPath(UserType.F_EXTENSION, propName), UserType.class, prismContext,
propValue);
ObjectQuery query = new ObjectQuery();
query.setFilter(filter);
ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext)
.item(UserType.F_EXTENSION, propName).eq(propValue)
.build();
// WHEN, THEN
searchDeGhoulash(testName, query, task, result);

// Complex query, combine with a name. This results in join down in the database
filter = AndFilter.createAnd(
EqualFilter.createEqual(UserType.F_NAME, UserType.class, prismContext, null, USER_DEGHOULASH_NAME),
EqualFilter.createEqual(new ItemPath(UserType.F_EXTENSION, propName), UserType.class, prismContext, propValue)
);
query.setFilter(filter);
query = QueryBuilder.queryFor(UserType.class, prismContext)
.item(UserType.F_NAME).eq(USER_DEGHOULASH_NAME)
.and().item(UserType.F_EXTENSION, propName).eq(propValue)
.build();
// WHEN, THEN
searchDeGhoulash(testName, query, task, result);
}
Expand Down
Expand Up @@ -64,6 +64,7 @@
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.OrgFilter;
import com.evolveum.midpoint.prism.query.RefFilter;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.prism.util.PrismAsserts;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
Expand Down Expand Up @@ -1237,13 +1238,11 @@ protected ObjectQuery createAccountShadowQuery(String username, PrismObject<Reso
assert identifierDefs.size() == 1 : "Unexpected identifier set in "+resource+" refined schema: "+identifierDefs;
ResourceAttributeDefinition identifierDef = identifierDefs.iterator().next();
//TODO: set matching rule instead of null
EqualFilter idFilter = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, identifierDef.getName()), identifierDef, username);
EqualFilter ocFilter = EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, prismContext,
rAccount.getObjectClassDefinition().getTypeName());
RefFilter resourceRefFilter = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class,
resource);
AndFilter filter = AndFilter.createAnd(idFilter, ocFilter, resourceRefFilter);
return ObjectQuery.createObjectQuery(filter);
return QueryBuilder.queryFor(ShadowType.class, prismContext)
.itemWithDef(identifierDef, ShadowType.F_ATTRIBUTES, identifierDef.getName()).eq(username)
.and().item(ShadowType.F_OBJECT_CLASS).eq(rAccount.getObjectClassDefinition().getTypeName())
.and().item(ShadowType.F_RESOURCE_REF).ref(resource.getOid())
.build();
}

protected <F extends FocusType> String getSingleLinkOid(PrismObject<F> focus) {
Expand Down
Expand Up @@ -28,6 +28,7 @@
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.OrFilter;
import com.evolveum.midpoint.prism.query.RefFilter;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.provisioning.api.ConstraintViolationConfirmer;
import com.evolveum.midpoint.provisioning.api.ConstraintsCheckingResult;
import com.evolveum.midpoint.provisioning.api.ProvisioningService;
Expand Down Expand Up @@ -165,18 +166,17 @@ private boolean checkAttributeUniqueness(PrismProperty identifier, RefinedObject
throw new SchemaException("Empty identifier "+identifier+" while checking uniqueness of "+oid+" ("+resourceType+")");
}

OrFilter isNotDead = OrFilter.createOr(
EqualFilter.createEqual(ShadowType.F_DEAD, ShadowType.class, prismContext, false),
EqualFilter.createEqual(ShadowType.F_DEAD, ShadowType.class, prismContext, null));
//TODO: set matching rule instead of null
ObjectQuery query = ObjectQuery.createObjectQuery(
AndFilter.createAnd(
RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, prismContext, resourceType.getOid()),
EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, prismContext, accountDefinition.getTypeName()),
EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, identifier.getDefinition().getName()), identifier.getDefinition(),
PrismPropertyValue.cloneCollection(identifierValues)),
isNotDead));

ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext)
.itemWithDef(identifier.getDefinition(), ShadowType.F_ATTRIBUTES, identifier.getDefinition().getName())
.eq(PrismPropertyValue.cloneCollection(identifierValues))
.and().item(ShadowType.F_OBJECT_CLASS).eq(accountDefinition.getObjectClassDefinition().getTypeName())
.and().item(ShadowType.F_RESOURCE_REF).ref(resourceType.getOid())
.and().block()
.item(ShadowType.F_DEAD).eq(false)
.or().item(ShadowType.F_DEAD).isNull()
.endBlock()
.build();
boolean unique = checkUniqueness(oid, identifier, query, task, result);
return unique;
}
Expand Down

0 comments on commit 54438a8

Please sign in to comment.