Skip to content

Commit

Permalink
Changed Advanced Search process from using DynamicQuery to Search API
Browse files Browse the repository at this point in the history
  • Loading branch information
mario-softbless committed Dec 22, 2020
1 parent ed2c86e commit 0557052
Show file tree
Hide file tree
Showing 6 changed files with 244 additions and 208 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,25 @@ public class ${capFirstModel}KeywordQueryContributor implements KeywordQueryCont
queryHelper.addSearchLocalizedTerm(booleanQuery, searchContext, Field.DESCRIPTION, false);
queryHelper.addSearchLocalizedTerm(booleanQuery, searchContext, Field.TITLE, false);
queryHelper.addSearchLocalizedTerm(booleanQuery, searchContext, Field.SUBTITLE, false);

<#if advancedSearch>
<#list application.fields as field >
<#if field.name != "title">
<#if
field.type?string == "com.liferay.damascus.cli.json.fields.Long" ||
field.type?string == "com.liferay.damascus.cli.json.fields.Double" ||
field.type?string == "com.liferay.damascus.cli.json.fields.Integer" ||
field.type?string == "com.liferay.damascus.cli.json.fields.RichText" ||
field.type?string == "com.liferay.damascus.cli.json.fields.Varchar" ||
field.type?string == "com.liferay.damascus.cli.json.fields.Text" ||
field.type?string == "com.liferay.damascus.cli.json.fields.Date" ||
field.type?string == "com.liferay.damascus.cli.json.fields.DateTime"
>
queryHelper.addSearchTerm(booleanQuery, searchContext, "${field.name}", false);
</#if>
</#if>
</#list>
</#if>
}

@Reference
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1273,156 +1273,6 @@ public class ${capFirstModel}LocalServiceImpl extends ${capFirstModel}LocalServi
serviceContext, workflowContext);
}

/**
* advanceSearchInGroup
*
* @param advSearchKeywords
* @param groupId
* @param start
* @param end
* @param orderByComparator
* @param states
* @return search result list
*/
public List<${capFirstModel}> advanceSearchInGroup(Map<String, Object> advSearchKeywords, long groupId,
int start, int end, OrderByComparator<${capFirstModel}> orderByComparator, int[] states) {
DynamicQuery dynamicQuery = getDynamicQuery(advSearchKeywords, states);
dynamicQuery.add(PropertyFactoryUtil.forName("groupId").eq(groupId));

return dynamicQuery(dynamicQuery, start, end, orderByComparator);
}

/**
* countAdvanceSearchInGroup
*
* @param advSearchKeywords
* @param groupId
* @param states
* @return search result size
*/
public int countAdvanceSearchInGroup(Map<String, Object> advSearchKeywords, long groupId, int[] states) {
DynamicQuery dynamicQuery = getDynamicQuery(advSearchKeywords, states);
dynamicQuery.add(PropertyFactoryUtil.forName("groupId").eq(groupId));

return dynamicQuery(dynamicQuery).size();
}

/**
* advanceSearchInUser
*
* @param advSearchKeywords
* @param userId
* @param start
* @param end
* @param orderByComparator
* @param states
* @return search result list
*/
public List<${capFirstModel}> advanceSearchInUser(Map<String, Object> advSearchKeywords, long userId,
int start, int end, OrderByComparator<${capFirstModel}> orderByComparator, int[] states) {
DynamicQuery dynamicQuery = getDynamicQuery(advSearchKeywords, states);
dynamicQuery.add(PropertyFactoryUtil.forName("userId").eq(userId));

return dynamicQuery(dynamicQuery, start, end, orderByComparator);
}

/**
* countAdvanceSearchInUser
*
* @param advSearchKeywords
* @param userId
* @param states
* @return search result size
*/
public int countAdvanceSearchInUser(Map<String, Object> advSearchKeywords, long userId, int[] states) {
DynamicQuery dynamicQuery = getDynamicQuery(advSearchKeywords, states);
dynamicQuery.add(PropertyFactoryUtil.forName("userId").eq(userId));

return dynamicQuery(dynamicQuery).size();
}

/**
* advanceSearchInUserAndGroup
*
* @param advSearchKeywords
* @param userId
* @param groupId
* @param start
* @param end
* @param orderByComparator
* @param states
* @return search result list
*/
public List<${capFirstModel}> advanceSearchInUserAndGroup(Map<String, Object> advSearchKeywords, long userId,
long groupId, int start, int end, OrderByComparator<${capFirstModel}> orderByComparator, int[] states) {
DynamicQuery dynamicQuery = getDynamicQuery(advSearchKeywords, states);
dynamicQuery.add(PropertyFactoryUtil.forName("userId").eq(userId));
dynamicQuery.add(PropertyFactoryUtil.forName("groupId").eq(groupId));

return dynamicQuery(dynamicQuery, start, end, orderByComparator);
}

/**
* countAdvanceSearchInUserAndGroup
*
* @param advSearchKeywords
* @param userId
* @param groupId
* @param states
* @return search result size
*/
public int countAdvanceSearchInUserAndGroup(Map<String, Object> advSearchKeywords, long userId,
long groupId, int[] states) {
DynamicQuery dynamicQuery = getDynamicQuery(advSearchKeywords, states);
dynamicQuery.add(PropertyFactoryUtil.forName("userId").eq(userId));
dynamicQuery.add(PropertyFactoryUtil.forName("groupId").eq(groupId));

return dynamicQuery(dynamicQuery).size();
}

/**
* getDynamicQuery
*
* @param advSearchKeywords
* @param states
* @return dynamicQuery
*/
@SuppressWarnings("unchecked")
private DynamicQuery getDynamicQuery(Map<String, Object> advSearchKeywords, int[] states) {
DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(${capFirstModel}Impl.class);

Junction conJunction = RestrictionsFactoryUtil.conjunction();
for(String key : advSearchKeywords.keySet()) {
String column = key.replaceFirst("search","");
column = column.substring(0, 1).toLowerCase() + column.substring(1, column.length());

if(advSearchKeywords.get(key) instanceof Map) {
Map<String, Object> map = (Map<String, Object>) advSearchKeywords.get(key);

if(map.get("start") instanceof Calendar && map.get("end") instanceof Calendar) {
conJunction.add(RestrictionsFactoryUtil.ge(column, ((Calendar)map.get("start")).getTime()));
conJunction.add(RestrictionsFactoryUtil.le(column, ((Calendar)map.get("end")).getTime()));
} else if((map.get("start") instanceof Long && map.get("end") instanceof Long) ||
(map.get("start") instanceof Double && map.get("end") instanceof Double) ||
(map.get("start") instanceof Integer && map.get("end") instanceof Integer)) {
conJunction.add(RestrictionsFactoryUtil.ge(column, map.get("start")));
conJunction.add(RestrictionsFactoryUtil.le(column, map.get("end")));
}
} else if(advSearchKeywords.get(key) instanceof String) {
conJunction.add(RestrictionsFactoryUtil.ilike(column, "%" + advSearchKeywords.get(key) + "%"));
}
}
dynamicQuery.add(conJunction);

Junction disJunction = RestrictionsFactoryUtil.disjunction();
for(int state : states) {
disJunction.add(RestrictionsFactoryUtil.eq("status", state));
}
dynamicQuery.add(disJunction);

return dynamicQuery;
}

private static final int[] STATUS_ANY = {
WorkflowConstants.STATUS_APPROVED, WorkflowConstants.STATUS_DENIED,
WorkflowConstants.STATUS_DRAFT, WorkflowConstants.STATUS_EXPIRED,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,5 +41,36 @@ public class ${capFirstModel}ModelDocumentContributor implements ModelDocumentCo
document.addText(Field.TITLE, entry.get${application.asset.assetTitleFieldName?cap_first}());

document.addDate(Field.MODIFIED_DATE, entry.getModifiedDate());

<#if advancedSearch>
<#list application.fields as field >
<#if field.name != "title">
<#if
field.type?string == "com.liferay.damascus.cli.json.fields.Long" ||
field.type?string == "com.liferay.damascus.cli.json.fields.Double" ||
field.type?string == "com.liferay.damascus.cli.json.fields.Integer"
>
document.addNumber("${field.name}", entry.get${field.name?cap_first}());
</#if>
<#if
field.type?string == "com.liferay.damascus.cli.json.fields.RichText"
>
document.addText("${field.name}", HtmlUtil.extractText(entry.get${field.name?cap_first}()));
</#if>
<#if
field.type?string == "com.liferay.damascus.cli.json.fields.Varchar" ||
field.type?string == "com.liferay.damascus.cli.json.fields.Text"
>
document.addText("${field.name}", entry.get${field.name?cap_first}());
</#if>
<#if
field.type?string == "com.liferay.damascus.cli.json.fields.Date" ||
field.type?string == "com.liferay.damascus.cli.json.fields.DateTime"
>
document.addDate("${field.name}", entry.get${field.name?cap_first}());
</#if>
</#if>
</#list>
</#if>
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -150,19 +150,8 @@ public class ${capFirstModel}DisplayContext {
SearchContainer.DEFAULT_ORDER_BY_TYPE_PARAM, orderByType);


<#if advancedSearch>
${capFirstModel}Configuration ${uncapFirstModel}Configuration =
(${capFirstModel}Configuration)
_liferayPortletRequest.getAttribute(${capFirstModel}Configuration.class.getName());

PortletPreferences portletPreferences = _liferayPortletRequest.getPreferences();

SimpleDateFormat dateFormat = new SimpleDateFormat(
HtmlUtil.escape(
portletPreferences.getValue(
"dateFormat", ${uncapFirstModel}Configuration.dateFormat())));

Map<String, String> advSearchKeywords = _${uncapFirstModel}ViewHelper.getAdvSearchKeywords(_liferayPortletRequest, dateFormat);
<#if advancedSearch>
Map<String, String> advSearchKeywords = _${uncapFirstModel}ViewHelper.getAdvSearchKeywords(_liferayPortletRequest);

for(String key : advSearchKeywords.keySet()) {
navigationPortletURL.setParameter(key, advSearchKeywords.get(key));
Expand All @@ -181,8 +170,12 @@ public class ${capFirstModel}DisplayContext {
_searchContainer.setOrderByType(orderByType);

SearchContainerResults<${capFirstModel}> searchContainerResults = null;


<#if advancedSearch>
if (Validator.isNull(keywords) && advSearchKeywords.isEmpty()) {
<#else>
if (Validator.isNull(keywords)) {
</#if>
searchContainerResults = _${uncapFirstModel}ViewHelper.getListFromDB(
_liferayPortletRequest, _searchContainer,
new int[] {WorkflowConstants.STATUS_APPROVED});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import com.liferay.portal.kernel.util.Constants;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import ${packageName}.web.util.${capFirstModel}ViewHelper;
import ${packageName}.web.internal.security.permission.resource.${capFirstModel}Permission;
import com.liferay.trash.TrashHelper;

Expand Down Expand Up @@ -332,10 +333,24 @@ public class ${capFirstModel}ManagementToolbarDisplayContext
navigationPortletURL.setParameter(
SearchContainer.DEFAULT_ORDER_BY_TYPE_PARAM, orderByType);

<#if advancedSearch>
Map<String, String> advSearchKeywords = ${capFirstModel}ViewHelper.getAdvSearchKeywords(liferayPortletRequest);

for(String key : advSearchKeywords.keySet()) {
navigationPortletURL.setParameter(key, advSearchKeywords.get(key));
}

if (advSearchKeywords.isEmpty()) {
</#if>

if (Validator.isNotNull(keywords)) {
navigationPortletURL.setParameter(DisplayTerms.KEYWORDS, keywords);
}

<#if advancedSearch>
}
</#if>

return navigationPortletURL;
}

Expand Down

0 comments on commit 0557052

Please sign in to comment.