use of com.evolveum.midpoint.prism.query.PropertyValueFilter in project midpoint by Evolveum.
the class DefinitionsHelper method applyDefinition.
void applyDefinition(ProvisioningContext ctx, ObjectQuery query) throws SchemaException {
if (query == null) {
return;
}
ObjectFilter filter = query.getFilter();
if (filter == null) {
return;
}
com.evolveum.midpoint.prism.query.Visitor visitor = subFilter -> {
if (subFilter instanceof PropertyValueFilter) {
PropertyValueFilter<?> valueFilter = (PropertyValueFilter<?>) subFilter;
ItemDefinition<?> definition = valueFilter.getDefinition();
if (definition instanceof ResourceAttributeDefinition) {
// already has a resource-related definition
return;
}
if (!ShadowType.F_ATTRIBUTES.equivalent(valueFilter.getParentPath())) {
return;
}
QName attributeName = valueFilter.getElementName();
ResourceAttributeDefinition<?> attributeDefinition = ctx.getObjectDefinitionRequired().findAttributeDefinition(attributeName);
if (attributeDefinition == null) {
throw new TunnelException(new SchemaException("No definition for attribute " + attributeName + " in query " + query));
}
// noinspection unchecked,rawtypes
valueFilter.setDefinition((ResourceAttributeDefinition) attributeDefinition);
}
};
try {
filter.accept(visitor);
} catch (TunnelException te) {
throw (SchemaException) te.getCause();
}
}
use of com.evolveum.midpoint.prism.query.PropertyValueFilter in project midpoint by Evolveum.
the class PropertyRestriction method getValueFromFilter.
private Object getValueFromFilter(ValueFilter filter) throws QueryException {
JpaPropertyDefinition def = linkDefinition.getTargetDefinition();
Object value;
if (filter instanceof PropertyValueFilter) {
value = getValue((PropertyValueFilter) filter);
} else {
throw new QueryException("Unknown filter '" + filter + "', can't get value from it.");
}
Object adaptedValue = adaptValueType(value, filter);
if (def.isEnumerated()) {
return getRepoEnumValue((Enum) adaptedValue, def.getJpaClass());
} else {
return adaptedValue;
}
}
use of com.evolveum.midpoint.prism.query.PropertyValueFilter in project midpoint by Evolveum.
the class ExtensionItemFilterProcessor method process.
@Override
public Predicate process(ValueFilter<?, ?> filter) throws RepositoryException {
ItemDefinition<?> definition = filter.getDefinition();
Objects.requireNonNull(definition, "Item '" + filter.getPath() + "' without definition used in query.");
MExtItem extItem = new ExtensionProcessor((SqaleRepoContext) context.repositoryContext()).resolveExtensionItem(definition, holderType);
assert definition != null;
if (extItem == null) {
throw new QueryException("Extension item " + definition.getItemName() + " is not indexed, filter: " + filter);
}
if (definition instanceof PrismReferenceDefinition) {
return processReference(extItem, (RefFilter) filter);
}
PropertyValueFilter<?> propertyValueFilter = (PropertyValueFilter<?>) filter;
ValueFilterValues<?, ?> values = ValueFilterValues.from(propertyValueFilter);
FilterOperation operation = operation(filter);
List<?> filterValues = filter.getValues();
if (filterValues == null || filterValues.isEmpty()) {
if (operation.isAnyEqualOperation()) {
return extItemIsNull(extItem);
} else {
throw new QueryException("Null value for other than EQUAL filter: " + filter);
}
}
if (extItem.valueType.equals(STRING_TYPE)) {
return processString(extItem, values, operation, filter);
}
// TODO for anything lower we don't support multi-value filter yet, but the solution from string can be adapted.
if (filterValues.size() > 1) {
throw new QueryException("Multiple values in filter are not supported for extension items: " + filter);
}
if (ExtUtils.isEnumDefinition((PrismPropertyDefinition<?>) definition)) {
return processEnum(extItem, values, operation, filter);
} else if (extItem.valueType.equals(INT_TYPE) || extItem.valueType.equals(INTEGER_TYPE) || extItem.valueType.equals(LONG_TYPE) || extItem.valueType.equals(SHORT_TYPE) || extItem.valueType.equals(DOUBLE_TYPE) || extItem.valueType.equals(FLOAT_TYPE) || extItem.valueType.equals(DECIMAL_TYPE)) {
return processNumeric(extItem, values, operation, filter);
} else if (extItem.valueType.equals(BOOLEAN_TYPE)) {
return processBoolean(extItem, values, operation, filter);
} else if (extItem.valueType.equals(DATETIME_TYPE)) {
// noinspection unchecked
PropertyValueFilter<XMLGregorianCalendar> dateTimeFilter = (PropertyValueFilter<XMLGregorianCalendar>) filter;
return processString(extItem, ValueFilterValues.from(dateTimeFilter, ExtUtils::extensionDateTime), operation, filter);
} else if (extItem.valueType.equals(POLY_STRING_TYPE)) {
return processPolyString(extItem, values, operation, propertyValueFilter);
}
throw new QueryException("Unsupported filter for extension item: " + filter);
}
use of com.evolveum.midpoint.prism.query.PropertyValueFilter in project midpoint by Evolveum.
the class PropertyRestriction method getValueFromFilter.
protected Object getValueFromFilter(ValueFilter filter) throws QueryException {
JpaPropertyDefinition def = linkDefinition.getTargetDefinition();
Object value;
if (filter instanceof PropertyValueFilter) {
value = getValue((PropertyValueFilter) filter);
} else {
throw new QueryException("Unknown filter '" + filter + "', can't get value from it.");
}
value = checkValueType(value, filter);
if (def.isEnumerated()) {
value = getRepoEnumValue((Enum) value, def.getJpaClass());
}
return value;
}
use of com.evolveum.midpoint.prism.query.PropertyValueFilter in project midpoint by Evolveum.
the class DetailTableItemFilterProcessor method process.
@Override
public Predicate process(PropertyValueFilter<String> filter) throws RepositoryException {
SqlQueryContext<?, DQ, DR> subcontext = context.subquery(detailQueryType);
SQLQuery<?> subquery = subcontext.sqlQuery();
subquery.where(joinOnPredicate.apply(context.path(), subcontext.path()));
FilterProcessor<ValueFilter<?, ?>> filterProcessor = nestedItemMapper.createFilterProcessor(subcontext);
if (filterProcessor == null) {
throw new QueryException("Filtering on " + filter.getPath() + " is not supported.");
// this should not even happen, we can't even create a Query that would cause this
}
Predicate predicate = filterProcessor.process(filter);
if (predicate instanceof Operation && ((Operation<?>) predicate).getOperator().equals(Ops.IS_NULL)) {
return subquery.notExists();
} else {
return subquery.where(predicate).exists();
}
}
Aggregations