Skip to content

Commit

Permalink
adding search mode for Query DSL
Browse files Browse the repository at this point in the history
  • Loading branch information
skublik committed Jan 14, 2021
1 parent 0b75fcf commit 88ce59d
Show file tree
Hide file tree
Showing 5 changed files with 128 additions and 30 deletions.
Expand Up @@ -51,6 +51,7 @@ public class Search<C extends Containerable> implements Serializable, DebugDumpa
public static final String F_ITEMS = "items";
public static final String F_SPECIAL_ITEMS = "specialItems";
public static final String F_ADVANCED_QUERY = "advancedQuery";
public static final String F_DSL_QUERY = "dslQuery";
public static final String F_ADVANCED_ERROR = "advancedError";
public static final String F_FULL_TEXT = "fullText";
public static final String F_OID = "oid";
Expand All @@ -70,6 +71,7 @@ public enum PanelType {
private boolean canConfigure = true; //TODO should be changed to false

private String advancedQuery;
private String dslQuery;
private String advancedError;
private String fullText;
private String oid;
Expand Down Expand Up @@ -295,7 +297,7 @@ public ObjectQuery createObjectQuery(ExpressionVariables variables, PageBase pag
} else {
query = createQueryFromDefaultItems(pageBase, variables);
ObjectQuery searchTypeQuery = null;
if (SearchBoxModeType.ADVANCED.equals(searchType)) {
if (SearchBoxModeType.ADVANCED.equals(searchType) || SearchBoxModeType.QUERY_DSL.equals(searchType)) {
searchTypeQuery = createObjectQueryAdvanced(pageBase);
} else if (SearchBoxModeType.FULLTEXT.equals(searchType)) {
searchTypeQuery = createObjectQueryFullText(pageBase);
Expand Down Expand Up @@ -589,7 +591,7 @@ private ObjectFilter createFilterForSearchValue(PropertySearchItem item, Display
}

public boolean isShowAdvanced() {
return SearchBoxModeType.ADVANCED.equals(searchType);
return SearchBoxModeType.ADVANCED.equals(searchType) || SearchBoxModeType.QUERY_DSL.equals(searchType);
}

public String getAdvancedQuery() {
Expand All @@ -600,6 +602,14 @@ public void setAdvancedQuery(String advancedQuery) {
this.advancedQuery = advancedQuery;
}

public String getDslQuery() {
return dslQuery;
}

public void setDslQuery(String dslQuery) {
this.dslQuery = dslQuery;
}

public String getFullText() {
return fullText;
}
Expand Down Expand Up @@ -659,12 +669,20 @@ private ObjectQuery createObjectQueryOid(PageBase pageBase) {
}

private ObjectFilter createAdvancedObjectFilter(PrismContext ctx) throws SchemaException {
if (StringUtils.isEmpty(advancedQuery)) {
return null;
if (SearchBoxModeType.ADVANCED.equals(searchType)) {
if (StringUtils.isEmpty(advancedQuery)) {
return null;
}
SearchFilterType search = ctx.parserFor(advancedQuery).type(SearchFilterType.COMPLEX_TYPE).parseRealValue();
return ctx.getQueryConverter().parseFilter(search, getTypeClass());
} else if (SearchBoxModeType.QUERY_DSL.equals(searchType)) {
if (StringUtils.isEmpty(dslQuery)) {
return null;
}
return ctx.createQueryParser().parseQuery(getTypeClass(), dslQuery);
}

SearchFilterType search = ctx.parserFor(advancedQuery).type(SearchFilterType.COMPLEX_TYPE).parseRealValue();
return ctx.getQueryConverter().parseFilter(search, getTypeClass());
return null;
}

public boolean isAdvancedQueryValid(PrismContext ctx) {
Expand Down Expand Up @@ -721,7 +739,7 @@ private String createErrorMessage(Exception ex) {

Throwable t = ex;
while (t != null) {
sb.append(t.getMessage()).append('\n');
sb.append(t.getMessage() == null ? t.getClass() : t.getMessage()).append('\n');
t = t.getCause();
}

Expand Down
Expand Up @@ -223,7 +223,8 @@ public static <T extends ObjectType> Search createSearch(
boolean isFullTextSearchEnabled = isFullTextSearchEnabled(modelServiceLocator, type.getTypeClass());

Search search = new Search(type, availableDefs, isFullTextSearchEnabled,
getDefaultSearchType(modelServiceLocator, type.getTypeClass(), collectionViewName, panelType), isOidSearchEnabled);
getDefaultSearchType(modelServiceLocator, type.getTypeClass(), collectionViewName, panelType),
isOidSearchEnabled);

SchemaRegistry registry = modelServiceLocator.getPrismContext().getSchemaRegistry();
PrismObjectDefinition objDef = registry.findObjectDefinitionByCompileTimeClass(type.getTypeClass());
Expand Down
Expand Up @@ -9,18 +9,11 @@
<form wicket:id="form" class="form-inline pull-right search-form" style="padding-bottom:5px; width:100%">

<div class="form-inline">
<!-- <div class="form-group pull-right" wicket:id="linksContainer" style="vertical-align: top; margin-top: -5px; display: grid;">-->
<!-- <a class="btn btn-sm btn-link" wicket:id="basic" style="display: table-cell; vertical-align: top; padding: 0px;"/>-->
<!-- <a class="btn btn-sm btn-link" wicket:id="advanced" style="padding: 0px;"/>-->
<!-- <a class="btn btn-sm btn-link" wicket:id="fullText" style="padding: 0px;"/>-->
<!-- <a class="btn btn-sm btn-link" wicket:id="oid" style="display: table-cell; vertical-align: top; padding: 0px;"/>-->
<!-- </div>-->
<div class="form-group pull-right" style="vertical-align: top; margin-top: -5px; display: grid;">
<a class="btn btn-sm btn-link" wicket:id="debug" style="display: table-cell; vertical-align: top; padding: 0px;"/>
</div>

<div class="form-group pull-right" style="vertical-align: top; padding-right: 5px;" wicket:id="searchContainer">
<!-- <a wicket:id="searchSimple" class="btn btn-sm btn-primary" about="searchSimple">-->
<!-- <i class="fa fa-search fa-lg"/>-->
<!-- </a>-->
<!-- <div wicket:id="searchDropdown">-->
<div class="btn-group btn-group-sm">
<button type="button" class="btn btn-primary" about="searchSimple" wicket:id="searchButtonBeforeDropdown">
<i class="fa fa-search fa-lg"></i>
Expand All @@ -36,7 +29,6 @@
</li>
</ul>
</div>
<!-- </div>-->
</div>

<div class="form-group pull-right" wicket:id="moreGroup" style="padding-right: 5px;">
Expand All @@ -53,14 +45,12 @@
<i class="fa fa-lg" wicket:id="advancedCheck"/>
</label>
<textarea class="form-control input-sm" rows="2" wicket:id="advancedArea"
style="width: 220px; height: 60px; overflow: hidden; float:left;"
wicket:message="placeholder:SearchPanel.insertFilterXml"></textarea>
<span class="help-block" wicket:id="advancedError"/>
style="width: 220px; height: 60px; overflow: hidden; float:right;"></textarea>
<span class="help-block" wicket:id="advancedError" style="float:right"/>
</div>

<div class="form-group" wicket:id="fullTextContainer" style="float:right; padding-right: 5px;">
<input wicket:id="fullTextField" type="text" class="form-control input-sm" style="width: 150px; min-width: 150px;">
<!--<div wicket:id="fullTextField" wicket:message="placeholder:SearchPanel.fullTextSearch"></div>-->
</div>

<wicket:container wicket:id="items">
Expand Down
Expand Up @@ -8,6 +8,7 @@

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
Expand Down Expand Up @@ -80,6 +81,7 @@ public class SearchPanel<C extends Containerable> extends BasePanel<Search<C>> {
private static final String ID_SPECIAL_ITEM = "specialItem";
private static final String ID_OID_ITEM = "oidItem";
private static final String ID_SEARCH_CONTAINER = "searchContainer";
private static final String ID_DEBUG = "debug";
private static final String ID_SEARCH_BUTTON_BEFORE_DROPDOWN = "searchButtonBeforeDropdown";
private static final String ID_MORE = "more";
private static final String ID_POPOVER = "popover";
Expand Down Expand Up @@ -149,6 +151,27 @@ public MoreDialogDto getObject() {
MidpointForm<?> form = new MidpointForm<>(ID_FORM);
add(form);

AjaxButton debug = new AjaxButton(ID_DEBUG, createStringResource("SearchPanel.debug")) {

private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
debugPerformed();
}
};
debug.add(new VisibleEnableBehaviour() {

private static final long serialVersionUID = 1L;

@Override
public boolean isVisible() {
return SearchBoxModeType.ADVANCED.equals(getModelObject().getSearchType())
&& queryPlaygroundAccessible;
}
});
form.add(debug);

PropertyModel<ObjectCollectionSearchItem> collectionModel = new PropertyModel<>(getModel(), Search.F_COLLECTION);
SearchObjectCollectionPanel collectionPanel = new SearchObjectCollectionPanel(ID_COLLECTION_REF_PANEL, collectionModel);
form.add(collectionPanel);
Expand Down Expand Up @@ -338,7 +361,8 @@ public String getObject() {

@Override
public boolean isEnabled() {
if (SearchBoxModeType.ADVANCED.equals(getModelObject().getSearchType())) {
if (SearchBoxModeType.ADVANCED.equals(getModelObject().getSearchType())
|| SearchBoxModeType.QUERY_DSL.equals(getModelObject().getSearchType())) {
Search search = getModelObject();
PrismContext ctx = getPageBase().getPrismContext();
return search.isAdvancedQueryValid(ctx);
Expand Down Expand Up @@ -438,6 +462,30 @@ public IModel<Boolean> getVisible() {
};
searchItems.add(searchItem);

searchItem = new InlineMenuItem(
createStringResource("SearchPanel.queryDsl")) {
private static final long serialVersionUID = 1L;

@Override
public InlineMenuItemAction initAction() {
return new InlineMenuItemAction() {

private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
searchTypeUpdated(target, SearchBoxModeType.QUERY_DSL);
}
};
}

@Override
public IModel<Boolean> getVisible() {
return Model.of(getPageBase().getCompiledGuiProfile().isEnableExperimentalFeatures());
}
};
searchItems.add(searchItem);

ListView<InlineMenuItem> li = new ListView<InlineMenuItem>(ID_MENU_ITEM, Model.ofList(searchItems)) {

private static final long serialVersionUID = 1L;
Expand All @@ -450,7 +498,7 @@ protected void populateItem(ListItem<InlineMenuItem> item) {
menuItemBody.add(new VisibleEnableBehaviour(){
@Override
public boolean isVisible() {
return item.getModelObject().getVisible().getObject();
return Boolean.TRUE.equals(item.getModelObject().getVisible().getObject());
}
});
}
Expand Down Expand Up @@ -491,7 +539,7 @@ protected void onUpdate(AjaxRequestTarget target) {
fullTextContainer.add(fullTextInput);

WebMarkupContainer advancedGroup = new WebMarkupContainer(ID_ADVANCED_GROUP);
advancedGroup.add(createVisibleBehaviour(SearchBoxModeType.ADVANCED));
advancedGroup.add(createVisibleBehaviour(SearchBoxModeType.ADVANCED, SearchBoxModeType.QUERY_DSL));
advancedGroup.add(AttributeAppender.append("class", createAdvancedGroupStyle()));
advancedGroup.setOutputMarkupId(true);
form.add(advancedGroup);
Expand All @@ -500,8 +548,27 @@ protected void onUpdate(AjaxRequestTarget target) {
advancedCheck.add(AttributeAppender.append("class", createAdvancedGroupLabelStyle()));
advancedGroup.add(advancedCheck);

TextArea<?> advancedArea = new TextArea<>(ID_ADVANCED_AREA,
new PropertyModel<>(getModel(), Search.F_ADVANCED_QUERY));

IModel<String> advancedValueModel = new IModel<String>() {
@Override
public String getObject() {
if (SearchBoxModeType.QUERY_DSL.equals(getModelObject().getSearchType())) {
return getModelObject().getDslQuery();
}
return getModelObject().getAdvancedQuery();
}

@Override
public void setObject(String object) {
if (SearchBoxModeType.QUERY_DSL.equals(getModelObject().getSearchType())) {
getModelObject().setDslQuery(object);
} else {
getModelObject().setAdvancedQuery(object);
}
}
};

TextArea<?> advancedArea = new TextArea<>(ID_ADVANCED_AREA, advancedValueModel);
advancedArea.add(new AjaxFormComponentUpdatingBehavior("keyup") {

@Override
Expand All @@ -517,6 +584,16 @@ protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
new ThrottlingSettings(ID_ADVANCED_AREA, Duration.milliseconds(500), true));
}
});
IModel<String> advanceAreaPlaceholderModel = new IModel<String>() {
@Override
public String getObject() {
if (SearchBoxModeType.QUERY_DSL.equals(getModelObject().getSearchType())) {
return getPageBase().createStringResource("SearchPanel.insertQueryDsl").getString();
}
return getPageBase().createStringResource("SearchPanel.insertFilterXml").getString();
}
};
advancedArea.add(AttributeAppender.append("placeholder", advanceAreaPlaceholderModel));
advancedGroup.add(advancedArea);

Label advancedError = new Label(ID_ADVANCED_ERROR,
Expand Down Expand Up @@ -549,6 +626,8 @@ public String getObject() {
return "Full";
} else if (SearchBoxModeType.OID.equals(getModelObject().getSearchType())) {
return "Oid";
} else if (SearchBoxModeType.QUERY_DSL.equals(getModelObject().getSearchType())) {
return "DSL";
} else {
return "Basic";
}
Expand Down Expand Up @@ -603,15 +682,15 @@ public String getObject() {
};
}

private VisibleEnableBehaviour createVisibleBehaviour(SearchBoxModeType searchType) {
private VisibleEnableBehaviour createVisibleBehaviour(SearchBoxModeType ... searchType) {
return new VisibleEnableBehaviour() {

private static final long serialVersionUID = 1L;

@Override
public boolean isVisible() {
return getModelObject() != null && getModelObject().getSearchType() != null
&& getModelObject().getSearchType().equals(searchType);
&& Arrays.asList(searchType).contains(getModelObject().getSearchType());
}
};
}
Expand Down
Expand Up @@ -26066,6 +26066,16 @@
</xsd:appinfo>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="queryDsl">
<xsd:annotation>
<xsd:documentation>
Query DSL search mode. Ability to create complex query using a query DSL.
</xsd:documentation>
<xsd:appinfo>
<jaxb:typesafeEnumMember name="QUERY_DSL"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>

Expand Down

0 comments on commit 88ce59d

Please sign in to comment.