Skip to content

Commit

Permalink
createFilter impl for search item wrappers
Browse files Browse the repository at this point in the history
  • Loading branch information
KaterynaHonchar committed Dec 27, 2021
1 parent 7935396 commit 283b4d3
Show file tree
Hide file tree
Showing 14 changed files with 347 additions and 125 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -427,7 +427,7 @@ private static <C extends Containerable> void createSearchItemWrapperList(Class<
searchConfigWrapper.addSearchItem(property);
}
} else if (item.getFilter() != null) {
searchConfigWrapper.addSearchItem(new FilterSearchItemWrapper(item));
searchConfigWrapper.addSearchItem(new FilterSearchItemWrapper(item, searchConfigWrapper.getTypeClass()));
}
});
}
Expand Down Expand Up @@ -515,6 +515,7 @@ public static <C extends Containerable> PropertySearchItemWrapper createPropert
if (item.isVisibleByDefault() != null && item.isVisibleByDefault().booleanValue()) {
itemWrapper.setDisplayed(true);
}
itemWrapper.setItemDef(itemDef);
return itemWrapper;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
package com.evolveum.midpoint.web.component.search.refactored;


import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.ModelServiceLocator;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.util.DisplayableValue;

import java.io.Serializable;
Expand All @@ -22,7 +26,7 @@ public abstract class AbstractSearchItemWrapper<T extends Serializable> implemen
public static final String F_HELP = "help";
public static final String F_TITLE = "title";

protected DisplayableValue<T> value;
private DisplayableValue<T> value;
private boolean displayed;
private boolean selected;

Expand All @@ -36,6 +40,8 @@ public abstract class AbstractSearchItemWrapper<T extends Serializable> implemen

public abstract DisplayableValue<T> getDefaultValue();

public abstract ObjectFilter createFilter(PageBase pageBase);

public boolean isVisible() {
return true;
}
Expand All @@ -48,6 +54,10 @@ public boolean canRemoveSearchItem() {
return true;
}

public boolean isApplyFilter() {
return true;
}

public DisplayableValue<T> getValue() {
if (value == null) {
setValue(getDefaultValue());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
package com.evolveum.midpoint.web.component.search.refactored;

import com.evolveum.midpoint.util.DisplayableValue;
import com.evolveum.midpoint.web.component.search.SearchValue;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SearchItemType;

Expand All @@ -29,7 +30,7 @@ public LookupTableType getLookupTable() {
}

public DisplayableValue<String> getDefaultValue() {
return null;
return new SearchValue<>();
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
package com.evolveum.midpoint.web.component.search.refactored;

import com.evolveum.midpoint.util.DisplayableValue;
import com.evolveum.midpoint.web.component.search.SearchValue;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SearchItemType;

import java.util.List;
Expand All @@ -29,7 +30,7 @@ public List<DisplayableValue<T>> getAvailableValues() {
}

public DisplayableValue<T> getDefaultValue() {
return null;
return new SearchValue();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,18 @@
*/
package com.evolveum.midpoint.web.component.search.refactored;

import javax.xml.datatype.XMLGregorianCalendar;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.util.DisplayableValue;
import com.evolveum.midpoint.web.component.search.SearchValue;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SearchItemType;

import javax.xml.datatype.XMLGregorianCalendar;

public class DateSearchItemWrapper extends PropertySearchItemWrapper {

private static final long serialVersionUID = 1L;
Expand Down Expand Up @@ -48,6 +55,32 @@ public Class<DateSearchItemPanel> getSearchItemPanelClass() {

@Override
public DisplayableValue<XMLGregorianCalendar> getDefaultValue() {
return new SearchValue();
}

@Override
public ObjectFilter createFilter(PageBase pageBase) {
PrismContext ctx = PrismContext.get();
ItemPath path = getSearchItem().getPath().getItemPath();
if (fromDate != null && toDate != null) {
return ctx.queryFor(ObjectType.class)
.item(path)
.gt(fromDate)
.and()
.item(path)
.lt(toDate)
.buildFilter();
} else if (fromDate != null) {
return ctx.queryFor(ObjectType.class)
.item(path)
.gt(fromDate)
.buildFilter();
} else if (toDate != null) {
return ctx.queryFor(ObjectType.class)
.item(path)
.lt(toDate)
.buildFilter();
}
return null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,37 @@
*/
package com.evolveum.midpoint.web.component.search.refactored;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.repo.common.expression.ExpressionUtil;
import com.evolveum.midpoint.schema.constants.ExpressionConstants;
import com.evolveum.midpoint.schema.expression.TypedValue;
import com.evolveum.midpoint.schema.expression.VariablesMap;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.MiscSchemaUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.DisplayableValue;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SearchFilterParameterType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SearchItemType;

import javax.xml.datatype.XMLGregorianCalendar;
import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType;

public class FilterSearchItemWrapper extends AbstractSearchItemWrapper {

private static final Trace LOGGER = TraceManager.getTrace(FilterSearchItemWrapper.class);
SearchItemType searchItem;
private Class<? extends Containerable> typeClass;

public FilterSearchItemWrapper(SearchItemType searchItem) {
public FilterSearchItemWrapper(SearchItemType searchItem, Class<? extends Containerable> typeClass) {
this.searchItem = searchItem;
this.typeClass = typeClass;
}

public Class<AbstractSearchItemPanel> getSearchItemPanelClass() {
Expand All @@ -39,4 +60,52 @@ public DisplayableValue<?> getDefaultValue() {
return null;
}

@Override
public ObjectFilter createFilter(PageBase pageBase) {
PrismContext ctx = PrismContext.get();
VariablesMap variables = getFilterVariables();
if (isEnabled() && isApplyFilter()) {
SearchFilterType filter = searchItem.getFilter();
if (filter == null && searchItem.getFilterExpression() != null) {
ItemDefinition outputDefinition = ctx.definitionFactory().createPropertyDefinition(
ExpressionConstants.OUTPUT_ELEMENT_NAME, SearchFilterType.COMPLEX_TYPE);
Task task = pageBase.createSimpleTask("evaluate filter expression");
try {
PrismValue filterValue = ExpressionUtil.evaluateExpression(variables, outputDefinition, searchItem.getFilterExpression(),
MiscSchemaUtil.getExpressionProfile(), pageBase.getExpressionFactory(), "", task, task.getResult());
if (filterValue == null || filterValue.getRealValue() == null) {
LOGGER.error("FilterExpression return null, ", searchItem.getFilterExpression());
}
filter = filterValue.getRealValue();
} catch (Exception e) {
LOGGER.error("Unable to evaluate filter expression, {} ", searchItem.getFilterExpression());
}
}
if (filter != null) {
try {
ObjectFilter convertedFilter = ctx.getQueryConverter().parseFilter(filter, typeClass);
convertedFilter = WebComponentUtil.evaluateExpressionsInFilter(convertedFilter, variables, new OperationResult("evaluated filter"), pageBase);
if (convertedFilter != null) {
return convertedFilter;
}
} catch (SchemaException e) {
LOGGER.error("Unable to parse filter {}, {} ", filter, e);
}
}
}
return null;
}

public VariablesMap getFilterVariables() {
VariablesMap variables = new VariablesMap();
SearchFilterParameterType functionParameter = searchItem.getParameter();
if (functionParameter != null && functionParameter.getType() != null) {
Class<?> inputClass = PrismContext.get().getSchemaRegistry().determineClassForType(functionParameter.getType());
TypedValue value = new TypedValue(getValue().getValue(), inputClass);
variables.put(functionParameter.getName(), value);
}
return variables;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,14 @@
*/
package com.evolveum.midpoint.web.component.search.refactored;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.ModelServiceLocator;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.util.DisplayableValue;
import com.evolveum.midpoint.web.component.search.SearchValue;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SearchItemType;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;

Expand All @@ -23,7 +30,13 @@ public Class<ItemPathSearchItemPanel> getSearchItemPanelClass() {

@Override
public DisplayableValue<ItemPathType> getDefaultValue() {
return null;
return new SearchValue<>();
}

@Override
public ObjectFilter createFilter(PageBase pageBase) {
ItemPathType itemPath = (ItemPathType) getValue().getValue();
return PrismContext.get().queryFor(ObjectType.class)
.item(getSearchItem().getPath().getItemPath()).eq(itemPath).buildFilter();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,12 @@
*/
package com.evolveum.midpoint.web.component.search.refactored;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.util.DisplayableValue;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.LoggingUtils;
Expand Down Expand Up @@ -93,6 +96,11 @@ public String getHelp() {
return objectCollectionView.getObjectCollectionDescription();
}


public ObjectFilter createFilter(PageBase pageBase) {
return null;
}

@Override
public DisplayableValue<String> getDefaultValue() {
return new SearchValue<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,18 @@
*/
package com.evolveum.midpoint.web.component.search.refactored;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.util.DisplayableValue;
import com.evolveum.midpoint.web.component.search.SearchValue;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;

import org.apache.commons.lang3.StringUtils;

public class OidSearchItemWrapper extends AbstractSearchItemWrapper {

Expand Down Expand Up @@ -37,4 +46,13 @@ public DisplayableValue<String> getDefaultValue() {
return new SearchValue<>();
}

@Override
public ObjectFilter createFilter(PageBase pageBase) {
if (StringUtils.isEmpty((String)getValue().getValue())) {
return null;
}
return pageBase.getPrismContext().queryFor(ObjectType.class)
.id((String)getValue().getValue())
.buildFilter();
}
}

0 comments on commit 283b4d3

Please sign in to comment.